团队介绍
团队名称:PTA 是真滴牛!!!
组员 | 职务 | 负责模块 | 博客连接 |
---|---|---|---|
林智凯 | 组长 | 程序逻辑设计、用户服务器、裁判机服务器、数据库设计、部分客户端代码 | 裁判机部分 数据库设计部分 |
郑梦露 | 组员 | 学生客户端与存储介质交互 | 课程设计-个人博客 |
吴海波 | 组员 | 学生客户端GUI | GUI部分 |
项目介绍
功能简介
本组的选题是 Online Judge (在线判题)系统,是一种在编程竞赛中用来测试参赛程序的在线系统,也可以用于平时练习,例如我们熟悉的 PTA 系统就是优秀的 OJ 平台。本次课程设计主要完成 OJ 平台的学生客户端,首先学生需要先登录系统,然后加入班级。在已加入的班级里有老师分配好的题目集,学生可以挑选判断题、选择题、编程题和主观题进行作答。学生完成题目并提交之后,本项目还提供了裁判机进行判题,可以对学生的答案进行批改(主观题由老师在教师端批改),并且将批改结果汇总到存储介质中。本程序还提供了站内短信系统,供学生和学生,学生和老师之间的私信,进一步优化体验。值得提出的是,由于 OJ 平台本身的复杂性和时间、精力、人力所限,本次课程设计只是基本实现了 OJ 平台学生端的基本功能。
参考项目:无(自主设计研发)。
功能架构图
学生客户端
裁判机服务器
登录系统
站内短信系统
Gitee 仓库
乌漆WhiteMoon / LWZ-Online Judge。
前期调研
客户端以PTA和课堂派为例,首先是登录部分,至少应当包含登入和注册两个界面。
课堂派登入后可以查看自己的班级。
点击进入班级后,课堂派可以选择查看班级作业。而我们的系统则是应当显示相对应班级的所有题集。
查看题集时题集可分为结束和可开始,相对应的学生可以选择查看已做和未做题集。
选择未做题集,进入题集后,分别选择不同题型进行作答。
选择题界面(可多题展示作答),应包含题干和选项。
判断题界面(可多题展示作答),应包含题干和选项。
编程题界面(单题展示作答),应包含题干,测试样例:测试输入和测试输出,以及作答窗口,同时提交之后裁判机马上就可以出分。
主观题界面(单题展示作答),应包含题干,和作答窗口。
模块功能实现
裁判机服务器
详情见博客:Java 课程设计:LWZ - Online Judge学生端(裁判机部分)。
数据库设计
详情见博客:Java 课程设计:LWZ - Online Judge学生端(数据库设计部分)。
客户端 GUI 部分
详情见博客:JAVA课程设计:LWZ-Online Judge学生端(GUI部分)。
客户端数据库操作
详情见博客:课程设计-个人博客。
登录系统
详情见博客:Java 程序设计——登录系统。
站内短信系统
详情见博客:Java 程序设计——站内短信系统。
运行效果
登录界面。
主菜单。
班级选择。
题目集选择。
题目集菜单。
选择题作答。
判断题作答。
编程题作答并提交。
主观题作答。
站内短信写信部分。
站内短信查看收件箱、发件箱。
用户设置界面。
课设总结
实现 Online Judge 的程序逻辑很复杂,对数据库的依赖极大,我们一共使用了 11 张表才能支持 Online Judge 的基本功能。这次课设最大的难度在于理清思路,首先组长设计功能并思考实现方式就花了很多时间,并且还要把思路传达给各个组员,所以我们组需要频繁地开会,经常在腾讯会议待好几个小时。原计划想开发学生端和老师端,但是由于学生端的工作量巨大,多次开会修改目标后选择将精力集中在学生端的开发,最后终于可以支持基本的功能。但是由于 Online Judge 本身的复杂性,例如 PTA 是专业的项目组来研发的,只靠 3 人组完成难度太大。很多设想的功能例如程序沙箱、教师管理、管理员账号管理的功能都可以单独作为课设题,希望该程序可以有学弟或学妹继续完善。由于该程序工作量太大,课设巩固了全体组员的 Java 基础和进阶知识,大幅度加强了编码能力,并且培养的集体荣誉感,本次课设写了 81 个文件,git 提交了共 170 次,没有默契的配合和全体组员的努力是完不成的。
未来展望
客户端
- 由于这次课设只是实现了学生端,导致很多功能我们有所设想但是没有时间和精力实现。例如老师出题和编辑题库、老师创建班级并发放任务、老师查看同学成绩并导出等功能,由于没有教师端的实现这些功能还无法展示。
- 其次学生端我们也只是做到了基本还原,但是很多细节方面并没有优化到极致。例如编程题显示测试样例、编程题判题后显示测试点信息、学生查看作答过的试卷、用户完全注销(将所有该用户的数据在所有表中删除)等功能。这些功能无疑需要继续投入更多的时间和精力,甚至是组成一个专门的项目组才能完成。更为理想的是,利用 WEB 编程技术完成这个选题,因为 WEB 编程的灵活性更强,也更方便用户的使用。
- 图形界面加入图片、样式等对现有界面进行美化经过分析,
- 未来考虑在图形界面中加入图片、音乐、样式等对现有界面进行美化,并使用 css 代替 fxml 获得得更加美观且新颖的界面,同时使用 css 可以更好的实现对组件的控制。
服务器
- 由于没有在学习写课设,使得利用局域网进行调试变得困难,因此都是在一台机器上模仿网络互联。因此后续的想法是部署云服务器,并且利用域名解析的方式放到网上,当然如果结合 WEB 编程会更好。
- 裁判机此次编写在 Windows 系统上,但是 Linux 系统具有更优越的性能和安全性,更适合作为服务器。因此后续希望学习 Linux 系统配置服务器的技术,把程序部署在 Linux 系统上。
- 为了避免存储用户答卷的复杂性,本次程序设计并没有存储用户选择题和判断题的作答,编程题也没有实现按照测试点按点给分,这些都需要有更好的数据库设计才能实现。因此希望学习数据库的原理、设计技术,尽可能更优化地规划表,并且利用数据库技术使得各个表之间可以借助数据库本身的功能优化,在此基础上设法让数据库运行效率更高。
- 编程题判题的沙箱实现,也就是说裁判机只能执行用户的代码,但是并不能阻止用户代码的行为。例如读写服务器文件、发起 Socket、修改系统属性和变量、访问系统内存甚至直接夺权,如果没有沙箱对程序进行监控和阻止非法操作,则会对服务器造成严重的损害,滋生大量的安全问题。这方面就需要学习更多的网络安全和软硬件安全知识实现沙箱,不过现阶段可以实现功能较为简单的伪沙箱,也就是用“黑名单”机制对敏感的、恶意的代码进行扫描。
- 目前裁判机仅支持 C 语言的判题,后续希望可以实现更多语言的判题。C++ 和 Java 这类可编译的语言是比较简单的,继续用 CMD 执行即可,但是例如 Python 和 PHP 这类脚本语言不需要编译,进行测试点注入就需要采用不同的策略。不过相比其他优化点,这个点主要是需要花时间做实验来验证,还不怎么需要学习某种技术。
- 注意到 PTA 平台可以获取程序执行的内存占用情况和使用时间,但是在调研期间我并没有找到合适的解法。目前的设想是想办法利用 Java 提供的 API 访问任务管理器之类管理进程的功能,获取程序的执行时间和内存开销。或者考虑用其他例如 Python 等更为灵活的语言或者 C 语言这类更底层的语言,编写可以获取这些信息的程序,然后再用 Java 进行调用。
- 代码查重方面是最可惜的,因为我数据结构的课设对代码查重问题有较为深刻的了解,也和当时的指导老师研究过查重算法的优化方式,但是这次课设的核心在 OJ 的实现而非查重,因此我只用了字符串结构处理算法进行查重。未来希望学习下用 Java 建多叉树,使用我之前研究的基于最大公共子树优化的代码相似度检测算法进行检测,并且用自适应算法提供阈值参考。
- 这次数据库连接池和日志框架应用得比较仓促,都只是停留在可以运行的层面上。对于数据库连接池打算部署一些数据库框架,例如 C3P0 连接池和 Druid 连接池提供更加安全而优化的连接池。对于日志框架的应用,打算详细研究下 Log4j 框架,注意到该框架的配置文件有很多学问,希望能够对这个框架深入了解。
- 对于一些异常情况没有很好的抵抗机制,例如用户提交的代码虽然没有安全问题,但是是个死循环,这样就会导致服务器永远等待程序执行完成。目前的设想是使用多线程技术,另一个线程监控执行 CMD 命令的线程进行监控,如果等待一段时间没有停止就强行结束运行。或者是想办法给执行 CMD 命令的程序设置参数,让执行时间受限于设置的参数,或者是启用沙箱来控制。