竞赛管理系统的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
竞赛管理系统的设计与实现
摘要
随着国家教育体制的改革,竞赛活动的举办也越来越频繁,报名参赛的学生数量也是越来越多。
面对如此众多参与者信息的录入,人工采集信息的方式已经不能满足当下的需求。
竞赛信息的管理又是一份繁琐的工作,参赛者的信息量很大,而且通常不允许出现错误。
如果执行手工操作,则必须手动填写大量表格,这将使比赛管理工作又增加一个难度。
本论文所讲述的竞赛管理系统是在PyCharm环境下用Python中的Django框架和MySQL数据库来实现的,它具有检索迅速、查找方便、可靠性高、存储量大等特点。
该系统分为前端和后端两大部分,前端使用Bootstrap框架,主要实现的功能是用户的注册、登录、浏览赛事、搜索赛事、各个赛事浏览统计、报名、评审打分、排名等功能;后端主要实现的是对用户信息、赛事信息、排名信息的管理。
关键词:竞赛管理系统;PyCharm;Django;MySQL
Design and implementation of competition
management system
Abstract
With the reform of the national education system, competitions are being held more and more frequently, and the number of students registering for competition is also increasing. Faced with the input of information from so many participants, the way of manually collecting information can no longer meet the current needs. The management of the competition information is another tedious task. The information of the contestants is very large, and errors are usually not allowed. If you perform manual operations, you must manually fill out a large number of forms, which will make the game management work more difficult.
The competition management system described in this paper is implemented in the PyCharm environment using the Django framework and MySQL database in python.It has the characteristics of fast retrieval, convenient search, high reliability and large storage capacity. The system is divided into two parts: front-end and back-end. The front-end uses the bootstrap framework. The main functions are user registration, login, browsing events, searching events, browsing statistics of various events, registration, review scoring, ranking, etc. The main realization is the management of user information, event information, ranking information.
Keywords: Competition Management System; PyCharm;Django;MySQL
目录
1 绪论 (3)
1.1本设计的目的及意义 (3)
1.2本设计在国内的发展概况及存在的问题 (3)
1.3本设计应解决的主要问题 (3)
2 需求分析 (4)
2.1可行性需求分析 (4)
2.1.1社会可行性 (4)
2.1.2经济可行性 (4)
2.2非功能性需求分析 (4)
2.3功能性需求分析 (4)
2.3.1竞赛信息管理功能 (4)
2.3.2用户信息管理功能 (5)
2.3.3参赛选手信息管理功能 (5)
3运行环境 (5)
3.1硬件环境 (5)
3.2软件环境 (5)
4开发技术及开发工具 (5)
4.1开发技术介绍 (5)
4.1.1B/S结构及其优势 (5)
4.1.2web开发框架—django (6)
4.1.3MTV设计模式 (7)
4.2开发工具介绍 (7)
4.2.1JetBrains PyCharm 2018.3.5 x64 (7)
4.2.2MySQL5.7 (8)
4.2.3Navicat 12 for MySQL (8)
5系统概要设计 (8)
5.1系统功能结构设计 (8)
5.2数据库连接 (9)
5.3数据库E-R图 (9)
5.4数据表详细设计 (10)
6系统详细设计 (12)
6.1注册功能模块 (12)
6.2登录功能模块 (13)
6.3忘记密码功能模块 (15)
6.4 浏览赛事统计并显示 (15)
6.5导航条 (16)
6.6赛事信息 (17)
6.7赛事详细信息 (19)
6.8 查询功能模块 (20)
6.9 报名功能模块 (21)
6.2.10名人堂模块 (21)
6.2.11个人中心模块 (23)
6.2.12后台管理模块 (23)
7系统测试 (24)
7.1测试目的 (24)
7.2功能测试 (24)
8结论 (28)
参考文献 (28)
1 绪论
1.1本设计的目的及意义
本设计来源于举办方对竞赛管理系统的实际需要,如果实行手工操作,在参赛人数太多时往往容易出错,但是竞赛项目是要保持公正严谨,不容许有丝毫错误发生。
该设计的目的是使参与者信息的输入和管理自动化,标准化和系统化,从而提高管理效率。
并围绕此管理目标对系统所需要的用户信息,选手信息,赛事信息,排名信息等进行管理和维护。
1.2本设计在国内的发展概况及存在的问题
随着国家教育体制的改革,竞赛活动的举办也越来越频繁,报名参赛的学生数量也是越来越多。
面对如此众多参与者信息的录入,通过人工采集信息的方式已经不能满足当下的需求。
如何利用现代信息技术使组织者具有快速高效的信息反馈能力和高效率,是目前举办方特别关心的一个问题。
建立一个功能齐全的竞赛管理系统,避免由于人工操作产生的缺陷,已成为当今社会举办高校竞赛的重中之重。
1.3本设计应解决的主要问题
要实现竞赛管理系统代替人工来工作,主要解决的问题有以下几个:
a.报名功能的实现:用户可以在线上报名所想要参加的赛事。
b.评审打分功能的实现:评审在评审打分入口实现评分功能。
c.排名功能的实现:选手的成绩会进入排行榜内,选手可在排行榜中查询成绩,
可以按照不同的排名规则进行排名。
d.评审给参赛人员打完分后,立马出成绩,排行榜实时更新。
e.数据库实时更新:在后端添加信息后,保证前端能实时更新。
f.操作简单、界面简洁、功能齐全。
2 需求分析
2.1可行性需求分析
2.1.1社会可行性
随着国家教育制度的改革,竞赛活动越来越多,参赛人员也越来越多。
如果一直使用人工来记录跟踪赛事,往往会有很多因素导致工作失误。
人们需要用一个集合多功能的竞赛管理系统来帮助他们完成这些工作,提高工作效率,减少工作失误。
2.1.2经济可行性
经济可行性是软件带来的经济效益与开发设计所需要的投资费用相比较是否适当,软件是否会比人工节省。
当然,一场大型赛事往往会聘请很多工作人员,而竞赛管理系统往往只需要一个超级管理员即可管理,相比之下,竞赛管理系统可以节省很多费用,设计系统是经济可行的。
2.2非功能性需求分析
系统应当满足以下系统性能指标:
a.系统稳定性和可靠性。
b.一般查询响应时间≤6秒。
c.系统拓展性。
d.系统满足界面的友好性,系统界面的友好性将会直接影响用户使用系统的效
率,要尽可能满足用户已有的使用习惯。
e.系统应确保不间断工作。
f.系统独立性。
2.3功能性需求分析
2.3.1竞赛信息管理功能
前端实现竞赛信息的展示,后端实现对竞赛信息的管理。
竞赛信息可以自定义。
1.竞赛信息列表:对竞赛信息进行增删改查操作。
2.赛事分类:按不同评分规则分类,方便用户查找自己想要看的赛事信息。
3.赛事报名:用户如果有中意的赛事,方可进行报名。
4.热门赛事:对赛事每天的浏览量做一个统计并以表格的形式体现出来。
5.查询赛事:用户可以查询自己想要查找的赛事。
2.3.2用户信息管理功能
用户对自己的信息进行查询或者修改等操作。
1.个人中心:用户对自己的信息查看或修改。
2.绑定邮箱:用户忘记密码时,可通过绑定的邮箱来找回自己的密码。
2.3.3参赛选手信息管理功能
参赛选手对自己的成绩进行查询,修改报名信息。
1.名人堂:选手可以输入自己的准考证号进行查询,用户可以按照不同排名方式进行排名。
2.修改报名信息:用户对自己的报名信息进行修改。
3运行环境
3.1硬件环境
1.处理器:Intel(R)Core(TM)*********************.60GHz
2.系统类型:64位操作系统,基于x64的处理器
3.内存:4.00GB
4.磁盘空间:256GB
3.2软件环境
1.操作系统:Windows10服务器
2.框架:django框架
3.数据库:MySQL5.7
4.浏览器:Google Chrome
5.虚拟环境:virtualenv
4开发技术及开发工具
4.1开发技术介绍
4.1.1B/S结构及其优势
B/S结构是对C/S结构的一种改进。
用户的工作界面是通过WWW浏览器来实现的。
WEB浏览器成为了客户端上最主要的应用软件。
该模式下它统一了客户端,将系统功能实现的核心部分集中在服务器上并简化了系统的开发和维护。
该技术超越了传统的“客户机/服务器”两层结构,采用了用户界面层/事务层/数据库层这三层结构。
各层之间的功能联系如表4.1所示。
表4.1 B/S三层体系结构之间的功能及联系
所以B/S架构具有以下四点优点:
1.它不需要安装任何软件即可运行,只需要一台可以访问Internet的计算机,客
户端实现零安装、零维护,使得系统非常容易进行拓展。
这也是它最大的一个特点。
2.通过需求推动ajax技术的发展,它的程序也能在客户端电脑上进行部分处理,
从而减轻服务器的负担并增加了交互性,可以进行局部实时刷新。
3.B/S结构利用日益成熟的Web浏览器技术:将浏览器的多种脚本语言和ActiveX
技术相结合,用通用浏览器实现原来需要复杂专用软件才能实现的强大功能。
4.界面统一(均为浏览器模式),操作相对简单。
4.1.2web开发框架—django
django项目起源于一个在线新闻网站。
它是一个用Python语言编写的开源Web开发框架,遵循MVC设计模式。
它强调代码重用,多个组件可以很容易以“插件”的形式服务于整个框架,django有很多强大的第三方插件,可以开发出自己的工具包。
使得django具有很强的可扩展性,它还强调快速开发和DRY原则。
于2005年以开源的形式展示出来,django框架的核心模块有:
1.urls.py 网址入口,关联对应的 views.py 中的一个函数(或者generic类),
访问网址就对应该函数。
2.views.py 处理urls.py中对应的用户请求,可以通过在templates模板中呈现
网页,将需要看到的内容输入到网页中。
3.models.py 与数据库操作有关,它用于保存或读取数据,不需要引用数据的时
候可以不使用。
4.forms.py 表单,用户在浏览器上输入数据提交时,实现验证数据并生成输入框
的功能。
5.templates文件夹 views.py中的函数渲染templates中的html模板,以获取
web页面动态内容。
当然可以通过缓存来提高速度。
6.admin.py django自带的后台,只需要少量的代码就可以实现后台的管理。
7.settings.py django的设置,配置文件,比如用QQ发送验证码的配置、静态文
件的位置、网页的语言、时区等。
8.static静态文件,用户存放js和css 代码。
4.1.3MTV设计模式
django已经成为web开发者的常用框架,MTV是Model、Template、View三个单词的简写,分别代表模型、模版、视图。
在django中,控制器接受用户输入的部分由框架自行处理。
它们各自的职责如下表4.2所示:
表4.2 MTV模式中各自的职责
可以看出django视图不需要处理用户的输入,只需要决定显示哪些数据给用户即可,django模板则是实现如何显示django视图指定的数据。
换言之, django把MVC中的视图分解为django视图和django模板这两个部分,分别决定“显示哪些数据”和“如何显示”,使得django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。
4.2开发工具介绍
4.2.1JetBrains PyCharm 2018.3.5 x64
PyCharm是Python 的一个IDE,能够帮助用户在使用Python语言进行开发时提高该效率,例如调试、、项目管理、、智能提示、代码的跳转、单元测试以及版本控制等等。
另外,该IDE还拥有一些高级功能,它自带HTML,CSS和 JavaScript编辑器,以用于支持django框架下的专业Web开发。
4.2.2MySQL
5.7
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),它有以下优点:1.适用性高,基本适用于所有平台
2.开源,版本更新较快
3.性能出色
4.提供用于管理、检查、优化数据库操作的管理工具
5.支持多线程,充分利用CPU资源
4.2.3Navicat 12 for MySQL
Navicat是一套快速可靠的数据库管理工具,专为简化数据库的管理及降低系统管理的成本而设。
可以让你以安全并且简单的方式创建、组织、访问、共用信息。
5系统概要设计
5.1系统功能结构设计
竞赛管理系统的功能结构图如图5.1所示:
图5.1 竞赛管理功能结构图
5.2数据库连接
数据库连接代码如下图5.2所示:
图5.2 连接数据库关键代码
Django很容易连接到数据库,只需要输入数据库类别、数据库名字、用户名和密码等即可进行连接。
5.3数据库E-R图
竞赛管理系统数据库E-R图如图5.3所示:
图5.3 竞赛管理系统E-R图
5.4数据表详细设计
赛事信息详细设计如表5.1所示,对应的代码设计如图5.4所示:
表5.1 赛事信息表
图5.4 赛事信息代码设计
赛事类型详细设计如表5.2所示,对应的代码设计如图5.5所示:
表5.2 赛事类型表
图5.5 赛事类型代码设计
选手信息详细设计如表5.3所示,对应的代码设计如图5.6所示:
表5.3 选手信息表
图5.6 选手信息代码设计
报名信息详细设计如表5.4所示,对应的代码设计如图5.7所示:
表5.4 报名信息表
图5.7 报名信息代码设计
6系统详细设计
6.1注册功能模块
用户注册时需要创建用户名,然后输入自己的邮箱,输入密码,两次密码必须一致,输入完之后先点击发送验证码,发送验证码之后30s不能再次发送,用户输入的邮箱将会收到一个4位数字验证码,输入正确的验证码点击注册即可注册成功。
注册界面如图6.1所示:
图6.1 注册界面
由于django中内置了发送邮件功能,只需要在QQ邮箱官网中点击“设置”找到账户开启 IMAP/SMTP服务,对应的views.py中的核心代码如图6.2所示:
图6.2 views.py中发送邮件核心代码
setting.py中的核心代码如下图6.3所示:
图6.3 setting.py中的核心代码
6.2登录功能模块
用户进入首页点击“登录”即可跳转至登录页面,登录账号可以是用户名也可以是绑定的邮箱号,输入正确的账号密码方可进行登录。
登录界面如图6.4所示:
图6.4 登录界面
在django中有一个用户认证系统auth模块,登录时只需引用即可。
对应的核心代码如图6.5所示:
图6.5 登录核心代码
6.3忘记密码功能模块
当用户忘记自己的登录密码时,可以在登录界面点击“忘记密码”进入忘记密码界面,输入注册时绑定的邮箱号,然后输入自己的新密码,点击发送验证码,在自己绑定的邮箱中可以收到验证码,输入获得的验证码点击重置即可。
忘记密码界面如图6.6所示:
图6.6 忘记密码界面
6.4 浏览赛事统计并显示
用户登录后可以看到这样的一个折线图表,折线图表记录了每天的总浏览量,该图表下面的热门赛事则记录了每场赛事的浏览量并取前5场热门赛事显示出来,这个也可以作为一个因素,间接影响用户是否报名该场赛事。
用户可以直接点击该热门赛事,进入赛事详细信息界面。
浏览赛事统计并显示界面如图6.7所示:
图6.7 浏览赛事统计并显示界面
为了防止有用户恶意刷赛事的浏览次数,特意限制了一个用户在一天内用同一个浏览器看对应的赛事只能增加1次的阅读次数。
对应的核心代码如图6.8所示:
图6.8 阅读次数核心代码
6.5导航条
当点击导航条里的“竞赛管理系统”或“首页”时,都会跳转至首页这个页面。
导航条里还包括了“赛事信息”,“名人堂”,“报名”,“搜索”功能。
当用户未登录时,导航条的右边会有登录注册按钮,当用户已登录时导航条的右边会显示用户的用户名。
用户名可以下拉,包括了“个人中心”,“后台管理”,“退出”功能。
用户未登录时导航条界面如图6.9所示:
图6.9 用户未登录时导航条界面
用户已登录时导航条界面如图6.10所示:
图6.10 用户已登录时导航条界面
用户名下拉的界面如图6.11所示:
图6.11 用户名下拉的界面
6.6赛事信息
赛事信息界面分为两列,左边一列是赛事列表,把所有的赛事都显示出来,并且把重要的赛事信息跟着一起显示出来,右边则是赛事类型以及各个类型的评分标准,点击类型分类中的赛事类型可以跳转至对应的页面。
当赛事太多时需要分页,所以在界面的最下边设置了分页,点击页码即可跳转对应的页面,也可以点击“<<”和“>>”,分别对应前一页和后一页,当当前页码是第一页时,系统判定“<<”为不可点击,当当前页码为最后一页时,系统判定“>>”为不可点击。
以每5场赛事为一页进行分页显示,并在最下端显示出第几页。
当赛事过多时,为了界面简洁,将多余的页码用省略号表示。
赛事信息界面如图6.12所示:
图6.12 赛事信息界面
赛事分类界面如图6.13所示:
图6.13 赛事分类界面
赛事较少时页码如图6.14所示:
图6.14 分页显示
赛事过多时页码如图6.15所示:
图6.15 页面较多时分页显示赛事显示核心代码如图6.16所示:
图6.16 赛事显示核心代码
6.7赛事详细信息
当用户点击赛事名称进入赛事详细信息界面,该界面包括了赛事详细信息,在信息的下端有“点我报名”跟“评审打分入口”。
如果用户浏览完信息后觉得自己想报名该场赛事即可点击“点我报名”进入报名界面。
在最下端还设计了一点细节,用户浏览完这场赛事信息后可以不用切换出去,点击最下端的前一场或者后一场赛事即可赛事详细信息界面如图6.17所示:
图6.17 赛事详细信息界面
赛事详细信息显示的核心代码如图6.18所示:
图6.18 赛事详细信息显示核心代码
6.8 查询功能模块
当用户输入自己想要查找的赛事或者关键字之后,以输入“小学”为例。
查找界面会显示符合查找要求的所有赛事并显示出来。
查询功能界面如图6.19所示:
图6.19 查询功能界面
查询功能核心代码如图6.20所示:
图6.20 查询功能核心代码
6.9 报名功能模块
用户报名可以点击导航条里的“名人堂”,也可以点击赛事详细信息里的“点我报名”。
用户可以帮他人报名,需要输入参赛选手的姓名、身份证号、手机号码、所在学校及所读年级、所参加的赛事。
确认信息后方可进行报名。
报名界面如图6.21所示:
图6.21 报名界面
6.2.10名人堂模块
名人堂初始的排名是所有选手依据分数进行的排名,用户可以在这里看到各个选手的分数排名情况,可以选择排名方式,也可以查询选手的准考证号来查询选手的成绩。
名人堂界面如图6.22所示:
图6.22 名人堂界面
点击赛事名称可以下拉选择不同赛事进入对应的排名,如下图6.23所示
图6.23 排名方式
对应的核心代码如图6.24所示:
图6.24 赛事排名核心代码
6.2.11个人中心模块
用户登录后通过点击用户名下拉后再点击个人中心按钮进入个人中心模块。
在个人中心中可以进行信息的查看,会显示上一次登录的时间,可以根据上一次登录的时间来看是否自己被盗号,可以进行密码修改,报名信息修改,但是不能修改已绑定的邮箱。
如果用户自己绑定的邮箱没用了或者被盗号了可以联系管理员将其原先的邮箱号删除,然后重新绑定邮箱号。
个人中心界面如图6.25所示:
图6.25 个人中心界面
6.2.12后台管理模块
后台管理只有给定权限的用户才能进去,在后台可以进行所有信息和用户的管理。
后台管理界面如图6.26所示:
图6.26 后台管理界面
7系统测试
7.1测试目的
系统测试是系统设计时比较重要的一部分。
在竞赛管理系统开发时,人类的主观理解不能完全符合客观现实,因此不可避免地会在系统开发的每个阶段发生错误。
在每个阶段结束之前通过简单的测试来发现更多的错误。
测试的目的有以下四点:
(1)通过测试发现与用户需求之间存在的缺陷。
(2)通过测试来发现并解决这些缺陷,提高用户对产品质量的信心。
(3)通过测试来积累经验,降低该软件产品失败的风险,同样也起到一个预防作用。
(4)通过测试活动了解被测对象的质量状况,为决策提供数据依据。
7.2功能测试
针对竞赛管理系统的各部分功能以及可靠性进行了黑盒测试,测试用例如下:
1.注册功能测试:测试用户注册填写所需要的信息错误时是否有对应的提示,注册成功是否跳转至登录页面。
测试用例表如下表7.1所示:
表7.1 注册功能测试用例表
2.登录功能测试:通过登录信息的填写,测试用户是否可以正确的登录。
测试用例表如下表7.2所示:
表7.2 登录功能测试用例表
3.忘记密码功能测试:测试是否真的可以通过邮箱接收验证码来重置密码。
测试用例表如下表7.3所示:
表7.3 忘记密码功能测试用例表
4.修改密码功能测试:测试密码是否能修改正确。
测试用例表如下表7.4所示:
表7.4 修改密码功能测试表
8结论
PyCharm是一款用非常好用的开发工具,通过这次毕业设计,我基本掌握了用PyCharm开发工具用django框架来实现web开发。
经过试运行,竞赛管理系统基本达到应用的需求,可以满足竞赛管理的大多数流程。
在做竞赛管理系统这个过程中,学到了很多,真正的静下心来每天跟着视频教学一起学习,一起练习。
之前总以为很多技术看起来很难实现,可是真正的去做了才发现并没有那么困难。
当然,一个好的系统不仅性能、功能要完善,界面也要有足够的友好性,因为人是最终用户,眼花缭乱的界面会使得用户有不好的操作体验,影响用户操作的心情。
本次毕业设计中我查阅了大量资料,因为对django框架的不熟悉,所以每天都得上网查资料,看视频。
当然有付出就会有收获,通过自己的努力和老师的指导,我顺利完成了此次毕业设计,希望在以后的生活中我能保持这份干劲。
竞赛信息管理、选手信息管理、排名信息管理、报名信息管理等是竞赛管理系统的主要管理功能。
选手可以选择自己想要参加的赛事,在时间不冲突的情况下可以一人参加多场赛事,该竞赛管理系统对报名、排名等信息进行了严格监控,保证了竞赛的公平公正性。
本系统仍存在一些不足:手机号、身份证号等不能确保正确,只能规定输入的长度。
报名只能个人报名,没有设计团队参赛等,这些问题都应该进行改进加强。
参考文献
[1]嵩天,礼欣,黄天羽.python语言程序设计基础[M].北京:高等教育出版社,2017:3. [2]django.Documentation[OL].https:///en/3.0/
[3]python技术最差的.pycharm+python+django+mysql开发的web应用[OL].
https:///weixin_44207181/article/details/90725003?depth_1-utm_source=dist ribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task ,2019-06-02 [4]HaddyYang.django2.0-course[OL].
https:///HaddyYang/django2.0-course,2018-10-27
[5]再敲一行代码.【Django2.0教程】[OL].
https:///252028233/#/channel/detail?cid=28138 ,2017-12-05
[6]wukangkkk.music[OL].
https:///wukangkkk/music ,2019-02-21
[7]Bootstrap中文网.起步[OL].https:///getting-started/
[8]Bootstrap中文网.组件[OL].https:///components/
[9]Bootstrap中文网.全局CSS样式[OL].https:///css/
[10]HIGHCHARTS.Highcharts演示[OL].https:///demo/highcharts
附录
附录1
程序源代码
get_event_common代码如下:
def get_event_common(request, events_all_list):
paginator = Paginator(events_all_list, settings.EACH_PAGE_EVENTS_NUMBER) page_num = request.GET.get('page', 1) # 获取url页面参数(GET请求)
page_of_events = paginator.get_page(page_num)
currentr_page_num = page_of_events.number # 获取当前页码
# 获取当前页码前后各2页的页码范围
page_range = list(range(max(currentr_page_num - 2, 1), currentr_page_num)) + list(range(currentr_page_num, min(currentr_page_num + 2, paginator.num_pages) + 1))
# 加上省略页码标记
if page_range[0] - 1 >= 2:
page_range.insert(0, '...')
if paginator.num_pages - page_range[-1] >= 2:
page_range.append('...')
# 加上首页和尾页
if page_range[0] != 1:
page_range.insert(0, 1)
if page_range[-1] != paginator.num_pages:
page_range.append(paginator.num_pages)
# 获取赛事分类对应的赛事数量
event_types = EventType.objects.all()
event_types_list = []
for event_type in event_types:
event_type.event_count = EventInfo.objects.filter(event_type=event_type).count()
event_types_list.append(event_type)
context = {}
context['events'] = page_of_events.object_list
context['page_of_events'] = page_of_events
context['page_range'] = page_range
context['event_types'] = event_types_list return context。