在线OJ后端涉及到的知识点
在线OJ系统后端涉及到的知识点
- WSL
- MariaDB
- 模块
- 数据库设计
- 用户角色相关
- 权限相关
- 老师/管理员相关
- 学生相关
- 课程相关
- 题目相关
- 提交相关
- 考试相关
- 青岛大学开源Judger
- 项目难点
- 有什么提升
- 怎么和其他模块对接
WSL
Windows Subsystem for Linux(简称WSL)是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。
MariaDB
mariadb是Mysql的一个分支。MariaDB 被设计为 MySQL 的直接替代产品,具有更多功能,新的存储引擎,更少的错误和更好的性能。
- 为什么要选择使用MariaDB?
MariaDB和MySQL完全兼容,但是MariaDB适用范围更广,可以实行包括API和命令行,是MySQL的替代品和升级产品。
模块
├── course 课程模块
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py 数据库定义文件
│ ├── serializers.py 序列化器
│ ├── tests.py
│ ├── urls url定义
│ │ ├── admin.py 用于管理员端的url
│ │ ├── statistics.py 用于统计中心的url
│ │ └── student.py 用于学生端的url
│ └── views API接口实现
│ ├── admin.py 用于管理员端的API
│ ├── statistics.py 用于统计中心的API
│ └── student.py 用于学生端的url
├── data 静态文件存储
├── demo 示例
├── exam 考试模块
├── lab 实验课模块
├── lecture 主讲课模块
├── oj 项目配置
├── problem 题目模块
├── submission 提交模块
├── user 用户模块
├── utils 辅助函数等
├── manage.py
├── README.md
├── requirements.txt 项目依赖
如上图树结构。一共包含8个模块:课程模块、考试模块、实验课模块、主讲课模块、题目模块、提交模块、用户模块、示例模块(就是个Demo)。一个模块下的目录结构又如上图中的课程模块,最主要是models.py定义数据库表的结构;serializers.py是序列化器,序列化返回客户端的数据;/urls文件夹存放老师、学生、管理员三个角色的API的请求路径;/views文件夹存放老师、学生、管理员三个角色的具体API实现。
描述:软件学院在线OJ系统。但是不仅仅是像LeetCode那样只能做题、练习的功能,我们还能让学生能够查看编程类课程表、考试、提交作业、成就等功能;老师可以对题目进行一些修改、发布信息、修改测试案例等功能;管理员对所有数据进行管理。我主要负责的功能是管理员模块,主要是实现对学生相关表、老师相关表等全部数据的增删改查。
数据库设计
navicat可以对数据库的表结构进行绘制。Django对表结构转存到MySQL中时,会将子应用的名字、定义模型时的类名拼接在一起,且模型类名会全部转化成小写。例如:Course子应用下的CourseTeacher类存放在数据库中的表名为course_courseteacher。
主键:拥有主键的表,其主键与其他表相关联。
外键:以主表的主键值作为外键,可以通过外键与主表进行关联查询。
用户角色相关
主要有三个角色:老师、学生、管理员
权限相关
权限表、角色表、角色拥有权限表
老师/管理员相关
课程拥有老师表、课程拥有老师角色类型表、老师所属角色表、管理员所属角色表
学生相关
学生历史排名表、学生关注表、年度报告表、成就类型表、学生成就表
课程相关
课程表、学生参与课程表、课程消息表、课程资源表、主讲课表、主讲课资源表、实验课表、实验课资源表
题目相关
题目表、标签表、测例表、测例标签表、未通过案例错误类型表、语言表、实验课题目表、练习题表
提交相关
题目提交表、未通过提交的未通过案例表、实验课提交表、实验课题目提交表、实验报告表
、练习题提交表
考试相关
考试表、学生考试表、学生考试提交表、考试题目表
文档链接:https://github.com/nkucs/opep/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%96%87%E6%A1%A3
青岛大学开源Judger
判题部分是青岛大学开源项目。该项目的文档指定了6个判题参数:
- src:源代码
- max_cpu_time:运行最长时间
- max_memory:内存最大的限制
- output:希望的输出
- test_case_id:上传测例返回的id
- language_config:语言配置
项目难点
没有难点,我们可以创造难点:
- 环境配置,无疑,每个项目中环境配置都是困难的,版本号、机器型号等等等。
- 在线判题开源库的接入。虽然我没有做这一块的逻辑,但是因为对这里比较感兴趣,就和同学们有交流。看文档,看源码,用别人的东西。但是说难也不难,只要看懂一次,就知道后续怎么去用了。就是怕那种陷入要把所有东西都弄会的怪圈。(提倡这种做法,但是在开发里面会拉低效率)
有什么提升
- 因为是大项目,很多人参加,所以需要团队配合和沟通。比如说前后端之间的沟通,不仅对前后端分离开发有了一个更深的理解,而且团队合作能力也得到了提升。
- 对django框架的使用更加熟悉了。
- 因为参与了数据库设计,觉得对业务逻辑有了更深的理解。数据库设计的时候,表字段应该思考得更加全面,这对开发和后期拓展都是有用的。
怎么和其他模块对接
我们的后端项目是按照不同的角色来进行分工的,三种角色:学生、老师、管理员。他们之间耦合度是很低的,所以,后端开发基本上是隔离的。这个对接的话,最主要是和前端开发人员的对接。按照前后端开发的思路,我们在开发前,对业务逻辑进行梳理之后,确定了一些基本的需求,就对接口进行了约定,前端发送什么数据过来,后端返回什么数据给前端,这些都是写好文档了的。
在线OJ后端涉及到的知识点相关推荐
- 基于Java实现简单的在线 OJ 系统
项目名称:在线 oj 系统 项目背景: 每个人都有自己的梦想,一个程序猿要实现自己的梦想,平时的练习就必不可少.平时的刷题是必不可少的,力扣网和牛客网是我平时刷题的两个网站.里边的功能深深的吸引了我, ...
- JavaWeb项目——基于Servlet实现的在线OJ平台 (项目问答+代码详解)
文章目录 项目演示 预先知识 请问 在处理用户同时提交代码时是 多进程处理还是 多线程处理? 你是如何创建多进程的逻辑的 如何获取到编译与运行后的结果? 编译运行模块 子进程之间如何并发? 文件读写操 ...
- 在线OJ项目(3)------实现接口与网页前端进行交互
我们先想一下:我们要具体进行设计那些网页呢?有几个页面?都是干啥的?如何设计前后端交互的接口? 当前我们已经把数据库的相关操作给封装好了,接下来我们可以进行设计一些API,也就是HTTP风格的接口,通 ...
- 试着模仿LeetCode做一个在线OJ系统(超级阉割版)(附项目测试)
文章目录 引言--痛苦的刷题 1.简单的需求 2.读写文件模块 (1)读文件readFile() 输入:文件路径 返回值:String (2)写文件writeFile() 输入:文件路径,文件 3.创 ...
- 在线 OJ 项目(四) · 前端设计与项目总结
一.页面设计 题目列表页 题目详情页 二.获取到后台数据 实现思路 遇到换行问题 小结 引入 ace.js 三.项目总结 接下来将实现 online-oj 项目的前端界面. 先随便从各大网站上下载网页 ...
- 在线 OJ 项目(三) · 处理项目异常 · UUID · 校验代码的安全性 · 阶段性总结
一.处理异常 二.区分不同请求的工作目录 UUID 对 Task 类进行重构 三.校验代码的安全性 四.阶段性总结 书接上回,我们自己测试没问题,是因为使用了正常数据:万一用户输入的是非法的请求,该咋 ...
- 【项目】在线OJ的项目,快进到自己造题刷
[项目]编写一个在线OJ的项目 1.项目目标 2.项目环境 3.模快划分 1.试题模块 2. 编译模块 3.http模块 4.工具模块 4.各模块具体实现: 4.1 http模块 4.1.1 响应获取 ...
- dbms_job涉及到的知识点
用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务. 一.dbms_job涉及到的知识点 1.创建job: variable jobno number; dbms_job ...
- 毕设项目:基于BS模型的在线OJ系统
系列文章目录 文章目录 系列文章目录 前言 一.在线OJ系统描述 二.在线编译模块 1.搭建一个HTTP服务器完成在线编译 2.收到HTTP请求,进行数据格式转化(HTTP中body的内容转换为JSO ...
- 腾讯云tcp架构考试涉及到哪些知识点?腾讯云是什么?
对于一些技术人员来说想要提高自己的业务水平,除了平时不断钻研外,还可以通过参加一些技术考试来获得官方的能力认可,现在社会上很多工作都是有一定的门槛,是否取得相关的证书就是一个很好的证明.不同行业的资格 ...
最新文章
- 智能合约和区块链技术:入门指南
- Win10 通过cmd查看端口占用、相应进程、杀死进程等的命令
- python生成随机密码
- c语言 异或_C语言经典例题来袭!5大方法告诉你答案
- [转]GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名
- LoadRunner脚本增强技巧之检查点
- springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)...
- python中用turtle绘制正方形_在Python-Turtle图形中创建正方形和旋转正方形的简单方法...
- 中山大学2018年数学分析高等代数考研试题
- 删除一个数据库中所有数据的方法
- julia的安装以及三个报错解决(包安装、dot函数无定义、定义变量无法在循环中使用)
- 写DM9000网卡芯片驱动的预备知识
- Hacking the PS4, part 1
- python——【2】gzip模块二进制格式读取压缩文件
- 【杂谈】斯科特与阿蒙森的南极点竞赛
- excel冻结窗口怎么设置_说说Word和Excel表头共享,全部方法供你选择
- QT Critical error detected c0000374
- 开发随笔——花生壳错误“您的局域网服务器连接失败,请检查局域网IP与端口“
- 关于SQL的char,varchar字段在导出时切断中文字符显示问号或乱码的问题[原创]
- ARP攻击原理与实践