最近公司在原项目中增加一个考试模块,通过对比码云上几个开源的考试项目和小鹅通和企业微信乐享的考试,最终选定腾讯的乐享考试,以他为原型创建我们自己的考试模块.
下面记录几点业务的要点
1.考生范围为购买了课程的用户
2.试卷分为随机试卷和固定试卷两种.
随机试卷:选择任意数量的题库,汇总几种题型的试题,指定试题数量,系统会根据这个规则随机生成试卷;
固定试卷:从任意题库中挑选试题组成试卷
3.提交创建考试的请求, 保存当前时间节点的试卷,以后这张试卷的改变不会影响该考试,除非修改会主动同步(这种操作会影响未提交考试的考生,不会对已考的用户造成影响)
4.主观题系统判卷,客观题需要老师判卷打分
5.考试通过后会发放证书
业务要点:
1.删除考试会删除7个表的数据:
//1.删除考试表 etExamService.removeByIds(Arrays.asList(ids)); for (int i = 0; i < ids.length; i++) { //2.删除课程考试关联表 etCourseExamService.remove(new QueryWrapper<EtCourseExamEntity>().lambda().eq(EtCourseExamEntity::getExamId, ids[i])); //3.删除考试试题关联表 etExamQuestionService.remove(new QueryWrapper<EtExamQuestionEntity>().lambda().eq(EtExamQuestionEntity::getExamId, ids[i])); //4.删除考试证书 etCertificateService.remove(new QueryWrapper<EtCertificateEntity>().lambda().eq(EtCertificateEntity::getExamId, ids[i])); //查询该考试创建了多少个用户考试记录 List<EtUserExamEntity> examList = etUserExamService.list(new QueryWrapper<EtUserExamEntity>().lambda().eq(EtUserExamEntity::getExamId, ids[i])); if (!examList.isEmpty()){ List<Integer> recordList = examList.stream().map(EtUserExamEntity::getId).collect(Collectors.toList()); if (!recordList.isEmpty()){ //5.删除用户获得的考试证书记录 etUserCertificateService.remove(new QueryWrapper<EtUserCertificateEntity>().lambda().in(EtUserCertificateEntity::getRecordId, recordList)); //6.删除用户答题记录表 etUserExamDetailService.remove(new QueryWrapper<EtUserExamDetailEntity>().lambda().eq(EtUserExamDetailEntity::getRecordId, recordList)); } //7.删除用户考试记录 etUserExamService.remove(new QueryWrapper<EtUserExamEntity>().lambda().eq(EtUserExamEntity::getExamId, ids[i])); } }
2.当开启了防作弊功能(切屏次数统计)且用户切屏次数达到限制时,无法提交试题答案,前端前强制提交试卷
3.删除试卷不影响已经创建的考试
4.同步试题会同步到考试记录中去,会影响已经开始考试的考生