基于SpringBoot实现的考试/答题系统,由于这是从一个大项目中截取的部分功能,具体的业务代码非常复杂就不列出了,这里主要介绍系统的设计思路,可作为课设或毕设的参考
数据库设计
实体类设计
- test(试卷):记录单份试卷的信息
- quiz(题目):记录单个题目的信息,一张试卷对应多个题目
- test_record(试卷完成情况):记录单个学生的答题情况,每个学生提交后产生一份
- quiz_record(题目完成情况):记录某个学生某道题目的完成情况,每个学生提交后产生一份,一份试卷完成情况对应多个题目完成情况
数据表及字段
DROP TABLE IF EXISTS `t_test`;
CREATE TABLE `t_test` (
`id` char(19) NOT NULL,
`title` varchar(20) NOT NULL COMMENT '试卷标题',
`type` int NOT NULL COMMENT '试卷类型',
`score` int NOT NULL COMMENT '总分',
`suggest_time` int NOT NULL COMMENT '建议用时',
`deadline` datetime NOT NULL COMMENT '截止时间',
`status` int NOT NULL COMMENT '状态',
`is_deleted` int NOT NULL DEFAULT '0',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
DROP TABLE IF EXISTS `t_test_record`;
CREATE TABLE `t_test_record` (
`id` char(19) NOT NULL,
`uid` char(19) NOT NULL COMMENT '做题人',
`test_id` char(19) NOT NULL,
`type` int NOT NULL COMMENT '试卷类型',
`system_score` int NOT NULL COMMENT '系统评分',
`final_score` int DEFAULT NULL COMMENT '最终得分',
`score` int NOT NULL COMMENT '总分',
`quiz_count` int NOT NULL COMMENT '题目数量',
`correct_count` int NOT NULL COMMENT '正确数量',
`finish_time` int NOT NULL COMMENT '完成时间',
`is_deleted` int NOT NULL DEFAULT '0',
`gmt_create` datetime NOT NULL COMMENT '提交时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
DROP TABLE IF EXISTS `t_quiz`;
CREATE TABLE `t_quiz` (
`id` char(19) NOT NULL COMMENT '题目ID',
`test_id` char(19) NOT NULL COMMENT '试卷ID',
`question` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '问题',
`options` varchar(800) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '选项',
`type` int NOT NULL COMMENT '题目类型',
`answer` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '答案',
`score` int NOT NULL COMMENT '分数',
`is_deleted` int NOT NULL DEFAULT '0',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
DROP TABLE IF EXISTS `t_quiz_record`;
CREATE TABLE `t_quiz_record` (
`id` char(19) NOT NULL,
`test_record_id` char(19) NOT NULL,
`uid` char(19) NOT NULL COMMENT '做题人',
`quiz_id` char(19) NOT NULL,
`user_answer` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户答案',
`correct_answer` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '正确答案',
`status` int DEFAULT NULL COMMENT '是否正确',
`is_deleted` int NOT NULL DEFAULT '0',
`gmt_create` datetime NOT NULL COMMENT '提交时间',
`score` int NOT NULL COMMENT '获得分数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
功能实现
对于选项的处理
我这里选项只用了数据表的一个字段,思路是在读取时将多个选项通过’/'连接,再存入数据库;读取时通过String的split方法将多个选项拆开放入列表传给前端
检查试卷完成情况并打分
学生提交试卷后,前端将试卷信息以及学生各题的答案传到后端,后端在数据库中查询相应题目的正确答案并与学生提交的答案进行比对,得到学生各题的完成情况,将对应的数据存入数据库之后再返回一份数据给前端,以便学生能查看自己的答题情况
功能优化
为了增加考试的严谨性,防止学生互通答案,我决定在不同学生获取试卷时将各题的选项随机打乱,此处的难点为:这里的随机打乱不能完全随机,因为要保证同一位学生答题界面和答题结果界面的一致性,比如在做题时选择了C,查看结果却发现变成了D…
实现思路:前端在传输给后端的对象中加入当前学生的ID号,由于ID固定不变,在打乱选项时取ID的最后一位作为随机数种子,调用Collections的shuffle方法对选项进行打乱,这样就能保证对一份试卷而言,同一学生的打乱顺序相同,不同学生的打乱顺序不同
最终效果
在此基础上结合增删改查和前端页面,最终实现效果如下图: