在线OJ系统后端涉及到的知识点
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框架的使用更加熟悉了。
- 因为参与了数据库设计,觉得对业务逻辑有了更深的理解。数据库设计的时候,表字段应该思考得更加全面,这对开发和后期拓展都是有用的。
怎么和其他模块对接
我们的后端项目是按照不同的角色来进行分工的,三种角色:学生、老师、管理员。他们之间耦合度是很低的,所以,后端开发基本上是隔离的。这个对接的话,最主要是和前端开发人员的对接。按照前后端开发的思路,我们在开发前,对业务逻辑进行梳理之后,确定了一些基本的需求,就对接口进行了约定,前端发送什么数据过来,后端返回什么数据给前端,这些都是写好文档了的。