作者主页:毕业设计精选
作者简介:9年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家
摘 要
为简化教师对学生练习的评 判 过 程,基 于 前 端 框 架 Vue 和 后 端 框 架 SpringBoot 设 计 与实 现 了 一套 C语言程序在线测评系统 。 此 系 统 实 现 了 对 代 码的 自 动 评 判,且 具 有 用户 、班 级 管 理 及 作业 下发的功能 。
关键词:在线测评系统;Vue;SpringBoot;脚本;文件流;
1 引言
目前,几乎所有大学都开通了 C语言的课程, C语言的教学在讲练结合的模式下 日趋完善 。但 随着讲课 的 深 入,学 生 练 习的 程 序 越 来 越 复 杂, 教师的 判 题 流 程 也 越 来 越 繁 琐 。 且 因 为 分 支 众 多,教师无 法 简 单 地 判 断 学 生 程 序 的 正 确 与 否, 也就难以给出一个准确的分数[1] 。
使用 Vue 和 Sprin gBoot 实 现 C 语 言 程 序 在 线测评 系 统,能 智 能 化 地 给 学 生 的 程 序 进 行 评 分,快速得出成绩,以取代低效率的 、机械的人 工 阅卷模式,避免了 人 工 阅 卷 中 由 于 主 观 因 素 而 导 致的不公平现象 的 发 生,从 而 更 能 真 实 地 反 映 学生的学习水平和教师的教学成果 。
2 设计思路
2.1 系统的主要功能
(1) 学生可以从题库选择题目 。
(2) 学生可 以利 用 精 确 搜 索 与 模 糊 搜 索 找到 想要练习的题目 。
(3) 学生可以获得 多 样 化 的 结 果(答 案 正 确, 答案错误,运行超时,运行时错误)。
(4) 教师可以添加题目与测试点 。
(5) 教师可以在班级里布置编程作业 。
(6) 教师可以查看所有学生完成作业的情况 。
2.2 前端设计
前端使用 Vue框架的组件式编程模式[2] 。
系统由账户模 块 、题 目 模 块 、评 测 模 块 、教 师 模块组成,见 图 1 。各 模 块 的 功 能 和 包 含 的 组 件 见表 1 。
图 1 系统的模块组成
表 1 各模块的功能及包含的组件
模块 | 功能 | 使用的组件 |
账户模块 | 用 户 的 注 册 、登 录与 用 户 信 息 的 管理 | 用户登录组件 Login. vue 用户注册组件 Regist. vue 用户资料组件 User. vue |
题目模块 | 题 目 的 添 加 、编 辑 、检索 、阅读与 评测数据的上传 评判 用 户 提 交 的 | 题目列表组件 Problems . vue 题目组件 Problem. vue |
评测模块 | 代码 并 返 回 评 测 的结果 | 评测界面组件 Judgement. vue |
教师模块 | 班级 的 管 理 与 题 目 、作业的建立 | 教师端组件 Teacher. vue |
2.3 后端设计
后端 采 用 MVC 架 构[3] , 每 一 类 逻 辑 都 由 Controller 、Service 、Dao类构成,详见表 2 。
表 2 后端类及功能
类 | 功能 |
User类 | 操作用户的信息 |
Account类 | 用户登录与注册 |
Problem类 | 操作题目信息 |
Judgement 类 | 评测操作 |
Class类 | 班级操作 |
Homework类 | 作业操作 |
前端通 过 调 用 后 端 的 接 口 实 现 通 讯 和 数 据 交换,系统接口表见表 3 。
表 3 系统接口表
接口路径 功能 | ||
checkLogIn checkRegister addAProblem findProblemById findAllByPages findLikeByPages getProblemInformation uploadInOut uploadImage isPass checkCookie getIco selectUserById selectUserByClassId getJudgementId judgement addHomework getHomeworkByTeacherId getHomeworkByClassId | 检查登录的合法性 检查注册的合法性 添加新用户 添加新的题目 通过题目编号查找题目 分页接 口 返回当页题目 分页接 口 返回根据题目名 称 查 找后当页题目 获取题目内容 上传题目测试点文件 编辑题目时上传图片文件 某个题目是否通过 调用 后 端 接 口 之 前 统 一 调 用, 检查 距 离 登 录 是 否 超 过 30 分 钟,若 是 无 法 调 用 任 何 接 口 并 强制用户重新登录 获取用户头像 通过用户编号获取用户 通过班级 编 号 获 取 班 级 内 所 有 用户 评测之前获取评测号 评测提交的代码 添加新的作业 根据教师 编 号 获 取 当 前 教 师 布 置的作业 根据班级 编 号 获 取 当 前 班 级 的 所有作业 | |
getProblemsByHomeworkId通过作业编号获取作业 | ||
listClasses getClassByHomeworkId checkCode | 根据教师 编 号 获 取 当 前 教 师 所 有的班级 根据作业 编 号 获 取 拥 有 此 作 业 的所有班级 生成验证码 |
2.3.3 安全性设计
为确保用户的 数 据 安 全,后 端 额 外 添 加 了 两 个功能:
(1) 登录超时 。用户登录超过 30 分钟无法访 问服务器,需重新登录 。
(2) 并发保护 。对并发量大的操作添加锁,确 保多个用户同时访问时的数据安全 。
2.4 数据库设计
2.4.1 数据库的概念
结构设计 E-R 图如图 2 所示 。
图 2 系统的 E-R 图
学生只能属于 一 个 班 级,一 个 班 级 可 以 有 多 个学 生;一 个 老 师 可 以 教 多 个 班 级,一 个 班 级 只 能有 一 个 老 师;老 师 可 以 布 置 多 份 作 业,一 份 作 业只能被一个老 师 布 置;一 个 班 级 可 以 有 多 份 作 业,一 份 作 业 也 可 以 同 时 被 布 置 到 多 个 班 级;学 生可以练习多道 题 目,一 道 题 目 也 可 以 被 多 个 学 生练 习;一 个 学 生 可 以 产 生 多 条 评 测 记 录,一 条 评测记录只能被一个同学产生 。
2.4.2 数据库的逻辑结构设计
数据库包 括 用 户 基 本 信 息 表 、班 级 表 、题 目 信息表 、评测信息 、班级作业 。
为满足第三范 式[4] , 多 对 多 关 系 需 额 外 设 计 表 。这些表 包 括 班 级-作 业 表 、作 业-题 目 表 、 用户通过题目表 。
数据库的表结构设计详见表 4-10 。
表 4 用户基本信息表 tbl
名称 | 类型 | 约束条件 | 说明 |
user_(id) | varchar(255) | p rimary key | 主键 用户编号 |
user | varchar(255) | not null unique | 昵称 |
user__password | varchar(255) | not null | 密码 |
user | varchar(255) | not null | 学号 |
user_(class) | varchar(255) | not null | 班级 |
name | varchar(255) | not null | 真实姓名 |
signature | varchar(255) | 个人签名 | |
| varchar(255) | not null | 邮箱 |
type | char(1) | not null | 用户类型 |
submission | int | not null | 提交数 |
pass | int | not null default | 通过数 |
register_(time) | timestamp | CURRENTTI(_) MESTAMP | 注册时间 |
表 5 班级作业表 tbl _(homework)
名称 | 类型 | 约束条件 | 说明 |
homework_(id) | int | p rimary key | 主键 作业编号 |
homework_(teacher) | int | not null | 布置作业的 教师编号 |
homework_(title) | varchar(255) | not null | 作业标题 |
表 6 评测信息表 tbl__judgement
名称 | 类型 | 约束条件 | 说明 |
judgement_(id) | int | p rimary key | 主键 评测号 |
judgement_(time) | varchar(40) | not null | 评测时间 |
judgement _(id) | int | not null | 评测者 |
judgement__prob- lem_(id) | int | not null | 需要评测的题目 |
表 7 题目表 tbl__problem
名称 | 类型 | 约束条件 | 说明 |
p roblem_(id) | int | primary key | 主键 题目编号 |
p roblem_(title) | varchar(40) | not null | 题目标题 |
p roblem_(submitted) | int | not null | 提交人数 |
p roblem__passed | int | not null | 通过人数 |
p roblem_(timelimit) | double | not null default 1 | 题目限制时间(s) |
表 8 作业-题目表 tbl _(homework)__problem
名称 | 类型 约束条件 | 说明 |
id int | p rimary key | 主键 编号 |
homework_(id) int | not null | 作业编号 |
p roblem_(id) int | not null | 题目编号 |
表 9 班级-作业表 tbl _(homework)_(class)
名称 | 类型 约束条件 | 说明 |
id int | p rimary key | 主键 编号 |
homework_(id) int | not null | 作业编号 |
p roblem_(id) int | not null | 班级编号 |
表 10 用户通过题目表 tbl __problem
名称 | 类型 | 约束条件 | 说明 | |
id | int | p rimary key | 主键 编号 | |
user_(id) | int | not null | 用户编号 | |
Problem_(id) | int | not null | 题目编号 |
2.5 评测模型
后端通 过 调 用 系 统 控 制 台 运 行 评 测 脚 本 文 件 。脚本可 以 根 据 语 言 类 型 不 同 运 行 不 同 编 译 器对代码进行编 译,之 后 运 行 输 入 文 件 并 将 输 出 保存,然后与 标 准 输 出文 件 对 比 。后 端 会 抓 取 对 比结果并返回前端 。
3 评测系统的实现
3.1 验证码控制
为了防止恶意 提 交 表 单,登 录 和 注 册 功 能 都使用了验证码 。
图 3 评测的数据流图
图 4 前端表单的验证码
用户在 前 端 点 击 验 证 码 图 片 可 以 申 请 新 的 验证码 。此时系 统 会 生 成 四 个 随 机 字 符,并 将 其 扭曲,添 加 杂 乱 线 生 成 一 张 验 证 码 图 片,同 时 将 正确验证码都存入到 Session 中 。Session对象是 针对会话创建的,这 可 以 保 证 多 个 用 户 在 申 请 验 证码时验证码不会冲突 。
3.2 注册
3.2.1 注册判断流程
注册界面共有 5 个 输 入 框:用 户 名 、邮 箱 、密 码 、确认密码 和验证 码 。前 端 根 据 写 定 的 正 则 表 达式判断是 否 有 格 式 错 误 。如 果 没有,前 端 会 将 所 有 输 入 的 信 息 发 送 到 后 端 。 后 端 的 UserController类会将 所 有 信 息 封 装 为 User 类 。 UserService类 会 通 过 UserDao 类 调 用 数 据 库 查 看输入的数 据 是 否 重 复 。如果 不 重 复,则 服 务 器 会将注册信 息 储存 到 数 据 库 。所 有 操 作 完 成 后, UserController类会将注 册 状 态 返 回 给 前 端 。 如 果注册状 态 为 成 功,则 前 端 会 跳 转 到 登 录 界 面, 否则会生成对应的失败弹窗 。
3.2.2 格式错误判断
前端使 用 正 则 表 达 式 来 判 断 格 式 的 正 确 与 否 。如果输 入 框 内 的 字 符 与 输 入 框 的 正 则 表 达 式不匹配,则视为格式错误[5] 。
图 5 对格式错误的判断
为防止 用 户 绕 过 前 端 的 格 式 判 断 直 接 调 用 接 口,后端会对数据的格式进行二次验证 。
密码的 正 则 表 达 式 为:/q[a-zA-Z0-9] {6 , 16} $ /。 用户名的正则表达式:/q[a-zA-Z0-9\u4e00- \u9fa5-__] { 2 , 10} $/。
3.2.3 用 户信息保存
注册成功后,UserController会利用 MyBatis 将用户信息保存到数据库中 。
3.3 登录
登录界面共有 3 个输入框:用户名 、密码与验 证码 。前端判定 格 式 无 误 后,将 输 入 信 息 传 至 后 端 。后端的 UserController类会将所有信息封装 为 User类 。UserService类会通过 UserDao类调 用数据库查看输 入 的数 据 是 否 正 确,并 将 结果 返 回至前端 。若登 录 成 功,前 端 会 跳 转 至 首 页 。 反 之显示失败弹窗 。
登录同 样 使 用 正 则 表 达 式 来 判 断 输 入 的 正 确与否 。
用户登录成功 后,服 务 端 会 在 浏览 器 中 储 存 一个 含 有 用 户 信 息 的 Cookie , 即 使 关 闭 浏 览 器, 再次打开网 页 也 不 需 要 重 新 登 录 。有 效 期 为 30 分钟,用户在此 30 分钟之内访问服务器会刷新有 效期 。若 30 分 钟 之 内 用 户 没 有 访 问 服 务 器,则 Cookie会失效,用户需重新登录 。
3.4 题目 检索与分页
3.4.1 题目 分页
用户访问题目 列 表 时,前 端 请 求 的 并 不 是 所 有题目数据,而 是 当 页 的 题 目数 据 。分 页 利用 的 是数据 库 的 限 制 查 询 条 数 功 能 。 例 如 现 在 位 于 第 3 页,每页 20 条记录,则服务端就会计算 出需 要从数据 库 的 第 41 条 记 录 开 始 取,共 取 20 条 。 用户在翻页时,前 端 会 将 当 前 所 在 页 数 和 每 页 题 目条数这两条信 息 发 送 给后 端,后 端 会 返 回 当 前 页面的题目 。
3.4.2 题目 检索
使用数据库的 模 糊 查 询 功 能,可 以 查 询 到 包含某些 关 键 字 的 题 目 。 当 用 户 对 某 个 关 键 词 进 行检索后,下次分 页 时 数 据 库 只 会 对 包 含 关 键 词 的题目进行分页并返回 。
3.5 评测
3.5.1 评测号
每个评测必须 有 一 个 独 一 无 二 的 评 测 号,以 便于用 户 输 入 查 询 。 评 测 号 在 用 户 提 交 代 码 评 测时生成,是一 个 依 次 增 大 的 自 然 数[6] 。评 测 号 生成 后,主 线 程 将 会 把 评 测 号 返 回,同 时 会 开 启 另外一 个 线 程 在 后 台 进 行 评 测 。 待 主 线 程 再 次 访问时,将评测结果返回给主线程,详见图 6 。
图 6 评测的线程流程图
3.5.2 评测过程
评测分为编译 和 运 行 两 个 部分,在 评 测 开 始 时,系统 会 生 成 一 个 结 果 对 象 。 如 果 编 译 失 败, 系统便不再往下 评 测,并 将 编 译 失 败 的 信 息 插 入 到结果对象 中 。如 果 编 译 成 功,系 统 就 将 继 续 往 下评测 并 将 评 测 信 息 插 入 到 结 果 对 象 中 。 最 后 系统返回此对象到前端 。
脚本 根 据 传 入 的 路 径 找 到 源 程 序 并 使 用 gcc[7] 对 C语言 程 序 进行 编 译 。 因 为 编 译 成 功 过 后没有输出,所以 只 要 服 务 器 端 检 测 到 了 脚 本 的 输出,就 可 以 认 定 程 序 编 译 失 败,并 将 脚 本 的 输 出作为编译信息返回 。
编译成功后,系 统 开 始 执 行 程 序 。脚 本 首 先 检测用户提交的 是 哪一 道 题 目,并 找 到其 评 测 文 件 。之后脚 本 会 让 用 户的 程 序 依 次 运 行 每 个 输 入文件并得到相应的输出文件,详见图 7 。
图 7 评测流程图
3.5.3 获取评测结果
评测的原理是 用 户 的程 序 运 行 题 目 的 输 入, 将输出结果与题 目 的 输 出 做 比 较,如果 比 较 完 全 一致,则对于这组数据,用户的程序运行正确,否 则运行 错 误 。 评 测 系 统 会 将 正 确 与 否 作 为 评 测 信息 。用户的 程 序 还 可 能 会 出 现 运 行 错 误 或 者 规定时间内 不 输 出的 错 误,导 致 无 法 比 较 输 出, 这样评测系统不 会 比 较 文 件,而 是 直 接 将 错 误 信 息作为评测信息 。
如果程序未出 现 运 行时 错 误,脚 本 的 输 出 如 图 8 所示:
图 8 程序正确时脚本的输出
服务器只需识别#&#前缀就可以获取每个 测试点的测 评 结 果 。如果 出 现 了 运 行 时 错 误,脚 本的输出如图 9 所示:
图 9 运行时错误时脚本的输出
如果服务器在识别到# &#前缀之前识别到 了其 它 前 缀,则 可 认 定 为 运 行 时 错 误,停 止 抓 取 此测试 点,并 将 此 测 试 点 的 结 果 设 定 为 运 行 时 错误 。
3.6 教师端
教师可以通过 MarkDown 编辑器编辑题 目, 并可以 实 时 预 览 。 MarkDown 中 上 传 的 图 片 会 被上传 至 云 端 以 便 其 他 设 备 正 常 访 问 。 添 加 题 目后需 要 上 传 测 试 数 据 。 教 师 需 要 搜 索 到 需 要 上传测试数据的 题 目,之 后 将 多 个 输 入 输 出 文 件 一并上 传 。 系 统 会 找 到 该 题 目 的 评 测 数 据 文 件 夹并将 评 测 数 据 保 存 。 输 入 输 出 文 件 的 命 名 方 式是从 1 开始增大的自然数,输入文件以 in 为后 缀名,输出文件以 out 为后缀名 。
教师可以从题库中选择一些题目组成作业,并 可以下发给选中的班级 。 由于作业和题目是多对 多的关系,作业和班级也是多对多的关系,因此需 要在数据库中多建立两张表来存放多对多的关系 。 若老师布置了一次作业(id为 m),选择了题目 a、b , 布置给了班级 1 和班级 2 , 则作业-题目表会插入 两条数据(作业 m , 题目 a) 与(作业 m , 题目 b);作 业-班级表会插入两条数据(作业 m , 班级1) 与(作 业 m , 班级 2)。 如果此时班级 1 的学生想查看自己 的作业,就会查询到有一次作业 m , 内含题目 a、b。
用户和题目的关系也是多对多关系 。用户 a每完成一道题目,用 户-题 目 表 中 就会 插 入 一 条 数据(用户编号,题 目 编 号)。 教 师 想 要 查 看 作 业 完成 情 况,服 务 端 就 会 查 询 此 表,以 表 格 的 形 式 将完成情况呈现给教师 。
3.7 访问控制
添加题目 、上 传测 试 点 属 于 教 师 的 权 限 。 用 户的类型如果为学生则无法使用这些功能 。
在前端,学生 用 户 无 法进 入 教 师 端 。 在 服 务 端,系 统 会 检 查 用 户的 权 限,如 果 是 学 生 则 无 法 调用教师专用的接 口 。
参考文献
[1] 刘东.基于 WEB 的 C语 言 考 试 系 统 的 设 计[D] . 广 州: 华南理工大学,2010:2- 3.
[2] 方生.基于“Vue. js”前端框架技术的研究[J] . 电脑知识 与技术:学术版,2021 , 17(19) :59-60.
[3] 张屹峰.基于 MVC 框 架 的 WEB 系 统 项 目 的 设 计 研 究 [J] . 电子世界,2021 , 43(17) :53-54.
[4] Ben Forta. MySQL 必知必会[ M] . 北 京:人 民 邮 电 出 版 社,2009 :155-164.
[5] 朱林琴 . C语言查重与 自 动 评 分 算 法 研 究[D] . 湘 潭:湘 潭大学,2017 :5-7.
[6] Cay S. Horstmann.Java核心技术 · 卷 I[ M] . 第 10 版 . 北京:机械工业出版社,2016 :640-661.
[7] 曹学琪.在 线 评 测 系 统 的 评 分 方 式 研 究 与 改 进[D] . 拉 萨:西藏大学,2020:31-34.
5 结束语
设计的 睡 眠 监 测 系 统 将 薄 膜 式 传 感 器 嵌 入 床垫,检测人体 睡姿 数 据,在 APP 中 分 析 显 示 个 人健康数据,为使用者制定个人健康作息计划 。