# 中小学生信息竞赛题库系统
## 1、系统实现的平台
本项目使用的平台是Linux,原因是很多开源项目和源程序代码和Linux结合的很好。项目选择的Python具有丰富的库,是跨平台的开发语言,虽然也支持在Windows下运行,但是由于Linux和Windows的API并不相同,特别是OS方面的库,有很多函数只支持在Linux下运行,对于Windows不兼容,或者运行的效率很低,所以本系统选择Linux作为部署平台。
## 2、系统的主要技术模块
### 开发语言Python和框架Django
Python是一种面向对象的动态类型的程序设计语言。它的语法简洁明了,易于理解,同时兼备强大丰富的类库,可以和C或者C++混合调用,而不会出现问题。本系统的后端安全沙箱的实现使用的是C语言,因而可以使用Python来进行调用。
Django框架由Python写成,是一个开放源代码的、最著名的Python框架,也是本项目所采用的框架,它可以使我们用比较小的代价,快速开发和维护一个高质量的Web应用。
### 数据库和Redis
本系统的数据库采用PostgreSQL,在有很多用户高并发提交代码的时候,PostgreSQL的总体处理性能比MySQL要好,在本项目中用于安全的存放用户提交的代码和提交信息等。
Redis是一个开源的,由ANSI C语言编写,支持网络,可支持内存亦可以持久化的日志型Key-Value数据库,具有极快的存储速度。在本项目中充当队列和缓存的角色。
### Docker引擎
Docker作为一种新的容器引擎技术,刚推出就得到迅速的普及。开发者可以构建Docker镜像,让代码运行在容器里面。本系统最终就是使用Docker来创建测试和部署环境,使得部署变得极为方便。
### Vue.js
Vue.js是一套用于构建用户界面的渐进式JavaScript框架,它是本系统使用的一个MVVM(即Model-View-ViewModel)框架。Vue能够为本系统的单页应用提供驱动。
### MVC模型和RESTful API
本系统使用的Django框架就是一个MVC框架,MVC实质是一种软件架构模式,具体指代就是:Model、View和Controller,Model就是数据库模型,View就是业务逻辑,Controller就是Django框架本身。本系统使用了一个符合REST fulAPI 规范的Django REST frameWork框架,前端的Vue.js和后端的Python代码通过Django REST framework 进行通信,传递的数据格式是JSON,从而实现前后端分离,降低了耦合度。
## 3、系统的架构和总体功能模块
### 系统的架构体系设计
本系统的后端主要由Django Web框架、PostgreSQL数据库、Redis内存数据库、Celery异步队列、判题服务器以及测试样例同步模块构成。其中,PostgreSQL数据库存放用户提交的代码、判题信息、用户信息和题目信息,Redis数据库主要充当异步队列缓存和保存session缓存信息。
通常情况下,系统只需要使用ORM(O/R Mapping:对象关系映射)对PostgreSQL数据库进行数据的操作,实现数据的增删查改,然后返回对应的数据,在前端进行相应的渲染,显示页面给用户。比较复杂的情况是用户提交代码,需要进行判题,用户提交的信息被写入数据库,同时创建判题任务并交给异步队列Celery和Redis去处理。异步队列调用调度模块,使用摘要算法,将请求头对应的令牌加密到请求数据里面,使用Python的Request模块将URL和包装好的数据统一请求判题服务器,判题服务器使用Flask模块,解析URL和请求数据获得加密请求头令牌,达到识别的目的。之后判题服务器通过编译运行用户提交的代码,返回数据给Web后端,更新数据库,接着根据数据的变更,渲染前端页面给用户反馈相应信息,具体的系统架构图如图所示:
![系统总体架构.png](Readmefile/系统总体架构.png)
系统的其他的一些动作还包括:更新前端的用户实时排名,更新提交信息,更新用户的答题状态等等。
### 系统的总体功能模块
![总体功能模块.png](Readmefile/总体功能模块.png)
## 4、Model数据库设计
系统的数据库表是基于django框架的Model来创建的:在django框架的Model里面创建相应的字段,运行python migrate 时候自动创建对应的表结构,同时在数据库里面创建对应的表格。描述表与表之间的关系最为直接的方法是画出E_R图,数据库的E-R图只列举了部分重要字段,具体如图所示:
![ER图.png](Readmefile/ER图.png)
## 5、系统的后台实现
### 系统排名功能实现
本系统主要分为ACM排名和OI排名,排名规则严格按照对应的比赛规则进行设计,下面以ACM为例,对系统排名功能的实现进行详细的说明:在设置ACM的比赛排名规则时候就要考虑到如何展示给用户比赛的排名,系统采用的设计是把提交信息submission_info 字段的值设置成为json类型,它存放的数据类型是dict,例如有数据:{"24":{"is_ac":True,"ac_time":9111,"error_number":5,"is_first_ac":True}},其中24为ProblemID,对应的信息为该题目是否AC,AC用时,AC出错次数,是否首次AC。这样就可以使得数据库的数据存储变得非常简单,如果该题目被AC,那么更新数据库accepted_number+1, 这样每个用户就对应一条记录,查询出的排名数据显示在页面上,每个用户就是对应一行。这样就可以根据AC通过的题目数将信息查询出来渲染到前端反馈给用户。
### 系统判题服务器的设计和实现
判题服务器的设计非常重要。因为判题服务器最终是会被构建成为一个docker容器,其基础的镜像是Ubuntu16.04,所以它本质上也是一个LINUX服务器,会对应的有主机名,IP等信息。这些信息都会返回给后台的,然后存放在数据库里面,后端的异步队列调用调度模块,根据用户发起的判题任务,会首先选择对应的判题服务器,调度模块首先会查询数据库,根据承担的判题任务数,顺序查询当前判题服务器server,如果找到一个处于正常状态的空闲的能够负载判题任务的服务器,那么就选择它,将其task_number加1,更新数据库之后返回;同样道理,当判题结束之后,task_number减1。一般CPU承担的任务数task_number是其核数的2倍,超过这个限制会出现效率的问题,例如Linux服务器为双核,那么它同时承担的任务数为4,其他的任务先排队等候。这样就达到实现和选择判题服务器的功能。
### 系统后台和判题服务器通信
系统后台和判题服务器最终会被构建成为资源占用相对较小的Docker容器,它们实质上就是两台服务器,docker容器本身具有网络职能,只要里面的应用在构建和部署的时候暴露出相应的端口和服务URL,外部就可以通过http协议进行请求访问。
后端和判题服务器分别使用的是Django框架和Flask框架,后端使用的Django主要是作为整个系统的核心后台,它涵盖处理外部用户使用浏览器进行的所有请求和响应。而判题服务器只构建一个入门级的flask应用就已经够用,进行对后台使用Request模块发送的数据和URL进行解析和响应,并返回对应的判题信息。
两者之间的测试用例在使用docker部署的时候同步,具体做法是在宿主机创建对应的测试用例数据卷,然后两个容器里面的测试用例文件夹分别映射到宿主机上的数据卷,这样就实现了测试用例的同步,后台提交对应的判题信息到判题服务器的时候,只需要传入对应的测试用例文件夹名称即可,例如在docker-compose.yml文件的数据卷设置为:
- 后台数据卷: volumes:- $PWD/data/backend:/data
- 判题服务器数据卷:
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 中小学生信息竞赛题库资料.zip
资源推荐
资源详情
资源评论
收起资源包目录
中小学生信息竞赛题库资料.zip (322个子文件)
.babelrc 416B
argtable3.c 161KB
main.c 9KB
child.c 6KB
runner.c 5KB
c_cpp.c 3KB
general.c 3KB
logger.c 2KB
killer.c 1KB
nginx.conf 3KB
nginx.conf 2KB
supervisord.conf 1KB
locations.conf 533B
api_proxy.conf 184B
https_redirect.conf 126B
server.crt 1KB
loader.css 628B
Dockerfile 180B
.editorconfig 147B
.eslintignore 23B
.gitignore 2KB
.gitignore 967B
argtable3.h 13KB
runner.h 5KB
logger.h 1KB
child.h 922B
killer.h 279B
seccomp_rules.h 219B
reset_password_email.html 2KB
index.html 758B
index.html 581B
favicon.ico 5KB
favicon.ico 5KB
background.jpg 3KB
api.js 7KB
api.js 7KB
contest.js 6KB
routes.js 4KB
contestRankMixin.js 4KB
zh-CN.js 3KB
utils.js 3KB
zh-CN.js 3KB
router.js 3KB
index.js 3KB
constants.js 2KB
chartData.js 2KB
index.js 2KB
index.js 2KB
index.js 2KB
index.js 2KB
user.js 1KB
problem.js 1KB
highlight.js 1KB
index.js 1KB
emitter.js 1KB
time.js 955B
index.js 815B
katex.js 765B
.eslintrc.js 698B
storage.js 670B
form.js 654B
types.js 610B
index.js 578B
sentry.js 563B
index.js 474B
index.js 461B
filters.js 417B
dev.env.js 313B
.postcssrc.js 196B
index.js 171B
prod.env.js 140B
package-lock.json 449KB
package.json 3KB
server.key 2KB
secret.key 33B
markdown.less 1KB
common.less 1KB
iview-custom.less 609B
style.less 376B
index.less 56B
README.md 17KB
README.md 133B
ER图.png 405KB
show3.png 168KB
show2.png 167KB
show6.png 165KB
show4.png 160KB
show1.png 142KB
show5.png 141KB
总体功能模块.png 101KB
default.png 72KB
default.png 72KB
docker部署成功.png 45KB
系统总体架构.png 37KB
43271d7f69.png 30KB
951529bddc.png 13KB
3197d1f3a8.png 4KB
Cup.png 2KB
logo.png 1KB
viadmin.py 35KB
共 322 条
- 1
- 2
- 3
- 4
资源评论
土豆片片
- 粉丝: 1557
- 资源: 5641
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功