From 28aa8019ed7c41b65e8f465f567afbe7c56277a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=82=AB=E5=A5=BD?= <143517814@qq.com> Date: Wed, 27 Nov 2024 11:29:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8Aimpl/ExamServicelmpl.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exam/service/impl/ExamServiceImpl.java | 284 ++++++++++-------- 1 file changed, 165 insertions(+), 119 deletions(-) diff --git a/backend/src/main/java/lsgwr/exam/service/impl/ExamServiceImpl.java b/backend/src/main/java/lsgwr/exam/service/impl/ExamServiceImpl.java index 6d8bdbd..ca1099d 100644 --- a/backend/src/main/java/lsgwr/exam/service/impl/ExamServiceImpl.java +++ b/backend/src/main/java/lsgwr/exam/service/impl/ExamServiceImpl.java @@ -40,9 +40,9 @@ public class ExamServiceImpl implements ExamService { private final QuestionOptionRepository questionOptionRepository; public ExamServiceImpl(QuestionRepository questionRepository, UserRepository userRepository, QuestionLevelRepository questionLevelRepository, QuestionTypeRepository questionTypeRepository, QuestionCategoryRepository questionCategoryRepository, QuestionOptionRepository questionOptionRepository, ExamRepository examRepository, ExamRecordRepository examRecordRepository) { - this.questionRepository = questionRepository; - this.userRepository = userRepository; - this.questionLevelRepository = questionLevelRepository; + this.questionRepository = questionRepository;// + this.userRepository = userRepository;// + this.questionLevelRepository = questionLevelRepository;// this.questionTypeRepository = questionTypeRepository; this.questionCategoryRepository = questionCategoryRepository; this.questionOptionRepository = questionOptionRepository; @@ -57,9 +57,9 @@ public class ExamServiceImpl implements ExamService { } private List getQuestionVos(List questionList) { - // 需要自定义的question列表 + // 需要自定义的question列表, List questionVoList = new ArrayList<>(); - // 循环完成每个属性的定制 + // 循环完成每个属性的定制, for (Question question : questionList) { QuestionVo questionVo = getQuestionVo(question); questionVoList.add(questionVo); @@ -69,9 +69,9 @@ public class ExamServiceImpl implements ExamService { private QuestionVo getQuestionVo(Question question) { QuestionVo questionVo = new QuestionVo(); - // 先复制能复制的属性 + // 先复制能复制的属性, BeanUtils.copyProperties(question, questionVo); - // 设置问题的创建者 + // 设置问题的创建者。 questionVo.setQuestionCreator( Objects.requireNonNull( userRepository.findById( @@ -79,7 +79,7 @@ public class ExamServiceImpl implements ExamService { ).orElse(null) ).getUserUsername()); - // 设置问题的难度 + // 设置问题的难度。 questionVo.setQuestionLevel( Objects.requireNonNull( questionLevelRepository.findById( @@ -87,7 +87,7 @@ public class ExamServiceImpl implements ExamService { ).orElse(null) ).getQuestionLevelDescription()); - // 设置题目的类别,比如单选、多选、判断等 + // 设置题目的类别,比如单选、多选、判断等。 questionVo.setQuestionType( Objects.requireNonNull( questionTypeRepository.findById( @@ -95,7 +95,7 @@ public class ExamServiceImpl implements ExamService { ).orElse(null) ).getQuestionTypeDescription()); - // 设置题目分类,比如数学、语文、英语、生活、人文等 + // 设置题目分类,比如数学、语文、英语、生活、人文等。 questionVo.setQuestionCategory( Objects.requireNonNull( questionCategoryRepository.findById( @@ -104,20 +104,20 @@ public class ExamServiceImpl implements ExamService { ).getQuestionCategoryName() ); - // 选项的自定义Vo列表 + // 选项的自定义Vo列表。 List optionVoList = new ArrayList<>(); - // 获得所有的选项列表 + // 获得所有的选项列表。 List optionList = questionOptionRepository.findAllById( Arrays.asList(question.getQuestionOptionIds().split("-")) ); - // 获取所有的答案列表optionList中每个option的isAnswer选项 + // 获取所有的答案列表optionList中每个option的isAnswer选项。 List answerList = questionOptionRepository.findAllById( Arrays.asList(question.getQuestionAnswerOptionIds().split("-")) ); - // 根据选项和答案的id相同设置optionVo的isAnswer属性 + // 根据选项和答案的id相同设置optionVo的isAnswer属性。 for (QuestionOption option : optionList) { QuestionOptionVo optionVo = new QuestionOptionVo(); BeanUtils.copyProperties(option, optionVo); @@ -129,14 +129,14 @@ public class ExamServiceImpl implements ExamService { optionVoList.add(optionVo); } - // 设置题目的所有选项 + // 设置题目的所有选项。 questionVo.setQuestionOptionVoList(optionVoList); return questionVo; } @Override public QuestionVo updateQuestion(QuestionVo questionVo) { - // 1.把需要的属性都设置好 + // 1.把需要的属性都设置好。 StringBuilder questionAnswerOptionIds = new StringBuilder(); List questionOptionList = new ArrayList<>(); List questionOptionVoList = questionVo.getQuestionOptionVoList(); @@ -148,26 +148,26 @@ public class ExamServiceImpl implements ExamService { questionOptionList.add(questionOption); if (questionOptionVo.getAnswer()) { if (i != size - 1) { - // 把更新后的答案的id加上去,记得用-连到一起 + // 把更新后的答案的id加上去,记得用-连到一起。 questionAnswerOptionIds.append(questionOptionVo.getQuestionOptionId()).append("-"); } else { - // 最后一个不需要用-连接 + // 最后一个不需要用-连接。 questionAnswerOptionIds.append(questionOptionVo.getQuestionOptionId()); } } } - // 1.更新问题 + // 1.更新问题。 Question question = questionRepository.findById(questionVo.getQuestionId()).orElse(null); assert question != null; BeanUtils.copyProperties(questionVo, question); question.setQuestionAnswerOptionIds(questionAnswerOptionIds.toString()); questionRepository.save(question); - // 2.更新所有的option + // 2.更新所有的option。 questionOptionRepository.saveAll(questionOptionList); - // 返回更新后的问题,方便前端局部刷新 + // 返回更新后的问题,方便前端局部刷新。 return getQuestionVo(question); } @@ -175,58 +175,64 @@ public class ExamServiceImpl implements ExamService { public void questionCreate(QuestionCreateVo questionCreateVo) { // 问题创建 Question question = new Question(); - // 把能复制的属性都复制过来 + // 把能复制的属性都复制过来。 BeanUtils.copyProperties(questionCreateVo, question); - // 设置下questionOptionIds和questionAnswerOptionIds,需要自己用Hutool生成下 + // 设置下questionOptionIds和questionAnswerOptionIds,需要自己用Hutool生成下。 List questionOptionList = new ArrayList<>(); List questionOptionCreateVoList = questionCreateVo.getQuestionOptionCreateVoList(); for (QuestionOptionCreateVo questionOptionCreateVo : questionOptionCreateVoList) { QuestionOption questionOption = new QuestionOption(); - // 设置选项的的内容 + // 设置选项的的内容。 questionOption.setQuestionOptionContent(questionOptionCreateVo.getQuestionOptionContent()); - // 设置选项的id + // 设置选项的id。 questionOption.setQuestionOptionId(IdUtil.simpleUUID()); questionOptionList.add(questionOption); } - // 把选项都存起来,然后才能用于下面设置Question的questionOptionIds和questionAnswerOptionIds + // 把选项都存起来,然后才能用于下面设置Question的questionOptionIds和questionAnswerOptionIds。 questionOptionRepository.saveAll(questionOptionList); String questionOptionIds = ""; String questionAnswerOptionIds = ""; - // 经过上面的saveAll方法,所有的option的主键id都已经持久化了 + // 经过上面的saveAll方法,所有的option的主键id都已经持久化了。 for (int i = 0; i < questionOptionCreateVoList.size(); i++) { - // 获取指定选项 + // 获取指定选项。 QuestionOptionCreateVo questionOptionCreateVo = questionOptionCreateVoList.get(i); - // 获取保存后的指定对象 + // 获取保存后的指定对象。 QuestionOption questionOption = questionOptionList.get(i); questionOptionIds += questionOption.getQuestionOptionId() + "-"; if (questionOptionCreateVo.getAnswer()) { - // 如果是答案的话 + // 如果是答案的话。 questionAnswerOptionIds += questionOption.getQuestionOptionId() + "-"; } } - // 把字符串最后面的"-"给去掉 + // 把字符串最后面的"-"给去掉。 questionAnswerOptionIds = replaceLastSeparator(questionAnswerOptionIds); questionOptionIds = replaceLastSeparator(questionOptionIds); - // 设置选项id组成的字符串 + // 设置选项id组成的字符串。 question.setQuestionOptionIds(questionOptionIds); - // 设置答案选项id组成的字符串 + // 设置答案选项id组成的字符串。 question.setQuestionAnswerOptionIds(questionAnswerOptionIds); - // 自己生成问题的id + // 自己生成问题的id。 question.setQuestionId(IdUtil.simpleUUID()); - // 先把创建时间和更新时间每次都取当前时间吧 + // 先把创建时间和更新时间每次都取当前时间吧。 question.setCreateTime(new Date()); question.setUpdateTime(new Date()); - // 保存问题到数据库 + // 保存问题到数据库。 questionRepository.save(question); } @Override + // 重写父类方法,获取问题选择列表 public QuestionSelectionVo getSelections() { + // 创建问题选择对象 QuestionSelectionVo questionSelectionVo = new QuestionSelectionVo(); + // 设置问题类别列表 questionSelectionVo.setQuestionCategoryList(questionCategoryRepository.findAll()); + // 设置问题等级列表 questionSelectionVo.setQuestionLevelList(questionLevelRepository.findAll()); + // 设置问题类型列表 questionSelectionVo.setQuestionTypeList(questionTypeRepository.findAll()); + // 返回问题选择对象 return questionSelectionVo; } @@ -245,10 +251,15 @@ public class ExamServiceImpl implements ExamService { @Override public QuestionDetailVo getQuestionDetail(String id) { + // 根据id查询问题 Question question = questionRepository.findById(id).orElse(null); + // 创建问题详情对象 QuestionDetailVo questionDetailVo = new QuestionDetailVo(); + // 设置问题id questionDetailVo.setId(id); + // 设置问题名称 questionDetailVo.setName(question.getQuestionName()); + // 设置问题描述 questionDetailVo.setDescription(question.getQuestionDescription()); // 问题类型,单选题/多选题/判断题 questionDetailVo.setType( @@ -258,10 +269,10 @@ public class ExamServiceImpl implements ExamService { ).orElse(null) ).getQuestionTypeDescription() ); - // 获取当前问题的选项 + // 获取当前问题的选项。 String optionIdsStr = trimMiddleLine(question.getQuestionOptionIds()); String[] optionIds = optionIdsStr.split("-"); - // 获取选项列表 + // 获取选项列表。 List optionList = questionOptionRepository.findAllById(Arrays.asList(optionIds)); questionDetailVo.setOptions(optionList); return questionDetailVo; @@ -274,14 +285,14 @@ public class ExamServiceImpl implements ExamService { } private List getExamVos(List examList) { - // 需要自定义的exam列表 + // 需要自定义的exam列表。 List examVoList = new ArrayList<>(); - // 循环完成每个属性的定制 + // 循环完成每个属性的定制。 for (Exam exam : examList) { ExamVo examVo = new ExamVo(); - // 先尽量复制能复制的所有属性 + // 先尽量复制能复制的所有属性。 BeanUtils.copyProperties(exam, examVo); - // 设置问题的创建者 + // 设置问题的创建者。 examVo.setExamCreator( Objects.requireNonNull( userRepository.findById( @@ -290,7 +301,7 @@ public class ExamServiceImpl implements ExamService { ).getUserUsername() ); - // 获取所有单选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoRadioList上 + // 获取所有单选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoRadioList上。 List radioQuestionVoList = new ArrayList<>(); List radioQuestionList = questionRepository.findAllById( Arrays.asList(exam.getExamQuestionIdsRadio().split("-")) @@ -298,12 +309,12 @@ public class ExamServiceImpl implements ExamService { for (Question question : radioQuestionList) { ExamQuestionSelectVo radioQuestionVo = new ExamQuestionSelectVo(); BeanUtils.copyProperties(question, radioQuestionVo); - radioQuestionVo.setChecked(true); // 考试中的问题肯定被选中的 + radioQuestionVo.setChecked(true); // 考试中的问题肯定被选中的。 radioQuestionVoList.add(radioQuestionVo); } examVo.setExamQuestionSelectVoRadioList(radioQuestionVoList); - // 获取所有多选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoCheckList上 + // 获取所有多选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoCheckList上。 List checkQuestionVoList = new ArrayList<>(); List checkQuestionList = questionRepository.findAllById( Arrays.asList(exam.getExamQuestionIdsCheck().split("-")) @@ -311,12 +322,12 @@ public class ExamServiceImpl implements ExamService { for (Question question : checkQuestionList) { ExamQuestionSelectVo checkQuestionVo = new ExamQuestionSelectVo(); BeanUtils.copyProperties(question, checkQuestionVo); - checkQuestionVo.setChecked(true); // 考试中的问题肯定被选中的 + checkQuestionVo.setChecked(true); // 考试中的问题肯定被选中的。 checkQuestionVoList.add(checkQuestionVo); } examVo.setExamQuestionSelectVoCheckList(checkQuestionVoList); - // 获取所有多选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoJudgeList上 + // 获取所有多选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoJudgeList上。 List judgeQuestionVoList = new ArrayList<>(); List judgeQuestionList = questionRepository.findAllById( Arrays.asList(exam.getExamQuestionIdsJudge().split("-")) @@ -324,7 +335,7 @@ public class ExamServiceImpl implements ExamService { for (Question question : judgeQuestionList) { ExamQuestionSelectVo judgeQuestionVo = new ExamQuestionSelectVo(); BeanUtils.copyProperties(question, judgeQuestionVo); - judgeQuestionVo.setChecked(true); // 考试中的问题肯定被选中的 + judgeQuestionVo.setChecked(true); // 考试中的问题肯定被选中的。 judgeQuestionVoList.add(judgeQuestionVo); } examVo.setExamQuestionSelectVoJudgeList(judgeQuestionVoList); @@ -340,7 +351,7 @@ public class ExamServiceImpl implements ExamService { @Override public ExamQuestionTypeVo getExamQuestionType() { ExamQuestionTypeVo examQuestionTypeVo = new ExamQuestionTypeVo(); - // 获取所有单选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoRadioList上 + // 获取所有单选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoRadioList上。 List radioQuestionVoList = new ArrayList<>(); List radioQuestionList = questionRepository.findByQuestionTypeId(QuestionEnum.RADIO.getId()); for (Question question : radioQuestionList) { @@ -350,7 +361,7 @@ public class ExamServiceImpl implements ExamService { } examQuestionTypeVo.setExamQuestionSelectVoRadioList(radioQuestionVoList); - // 获取所有多选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoCheckList上 + // 获取所有多选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoCheckList上。 List checkQuestionVoList = new ArrayList<>(); List checkQuestionList = questionRepository.findByQuestionTypeId(QuestionEnum.CHECK.getId()); for (Question question : checkQuestionList) { @@ -360,7 +371,7 @@ public class ExamServiceImpl implements ExamService { } examQuestionTypeVo.setExamQuestionSelectVoCheckList(checkQuestionVoList); - // 获取所有多选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoJudgeList上 + // 获取所有多选题列表,并赋值到ExamVo的属性ExamQuestionSelectVoJudgeList上。 List judgeQuestionVoList = new ArrayList<>(); List judgeQuestionList = questionRepository.findByQuestionTypeId(QuestionEnum.JUDGE.getId()); for (Question question : judgeQuestionList) { @@ -374,7 +385,7 @@ public class ExamServiceImpl implements ExamService { @Override public Exam create(ExamCreateVo examCreateVo, String userId) { - // 在线考试系统创建 + // 在线考试系统创建。 Exam exam = new Exam(); BeanUtils.copyProperties(examCreateVo, exam); exam.setExamId(IdUtil.simpleUUID()); @@ -382,35 +393,53 @@ public class ExamServiceImpl implements ExamService { exam.setCreateTime(new Date()); exam.setUpdateTime(new Date()); // Todo:这两个日志后面是要在前端传入的,这里暂时定为当前日期 - exam.setExamStartDate(new Date()); - exam.setExamEndDate(new Date()); - String radioIdsStr = ""; - String checkIdsStr = ""; - String judgeIdsStr = ""; - List radios = examCreateVo.getRadios(); - List checks = examCreateVo.getChecks(); - List judges = examCreateVo.getJudges(); - int radioCnt = 0, checkCnt = 0, judgeCnt = 0; - for (ExamQuestionSelectVo radio : radios) { - if (radio.getChecked()) { - radioIdsStr += radio.getQuestionId() + "-"; - radioCnt++; - } - } - radioIdsStr = replaceLastSeparator(radioIdsStr); - for (ExamQuestionSelectVo check : checks) { - if (check.getChecked()) { - checkIdsStr += check.getQuestionId() + "-"; - checkCnt++; - } - } - checkIdsStr = replaceLastSeparator(checkIdsStr); - for (ExamQuestionSelectVo judge : judges) { - if (judge.getChecked()) { - judgeIdsStr += judge.getQuestionId() + "-"; - judgeCnt++; - } - } + // 设置考试开始时间和结束时间 + exam.setExamStartDate(new Date()); + exam.setExamEndDate(new Date()); + // 初始化选择题、判断题和单选题的id字符串 + String radioIdsStr = ""; + String checkIdsStr = ""; + String judgeIdsStr = ""; + // 获取选择题、判断题和单选题的列表 + List radios = examCreateVo.getRadios(); + List checks = examCreateVo.getChecks(); + List judges = examCreateVo.getJudges(); + // 初始化选择题、判断题和单选题的计数器 + int radioCnt = 0, checkCnt = 0, judgeCnt = 0; + // 遍历单选题列表 + for (ExamQuestionSelectVo radio : radios) { + // 如果单选题被选中 + if (radio.getChecked()) { + // 将单选题的id添加到字符串中 + radioIdsStr += radio.getQuestionId() + "-"; + // 单选题计数器加1 + radioCnt++; + } + } + // 去掉最后一个分隔符 + radioIdsStr = replaceLastSeparator(radioIdsStr); + // 遍历判断题列表 + for (ExamQuestionSelectVo check : checks) { + // 如果判断题被选中 + if (check.getChecked()) { + // 将判断题的id添加到字符串中 + checkIdsStr += check.getQuestionId() + "-"; + // 判断题计数器加1 + checkCnt++; + } + } + // 去掉最后一个分隔符 + checkIdsStr = replaceLastSeparator(checkIdsStr); + // 遍历选择题列表 + for (ExamQuestionSelectVo judge : judges) { + // 如果选择题被选中 + if (judge.getChecked()) { + // 将选择题的id添加到字符串中 + judgeIdsStr += judge.getQuestionId() + "-"; + // 选择题计数器加1 + judgeCnt++; + } + } judgeIdsStr = replaceLastSeparator(judgeIdsStr); exam.setExamQuestionIds(radioIdsStr + "-" + checkIdsStr + "-" + judgeIdsStr); // 设置各个题目的id @@ -427,49 +456,64 @@ public class ExamServiceImpl implements ExamService { @Override public Exam update(ExamVo examVo, String userId) { + // 创建一个新的Exam对象 Exam exam = new Exam(); + // 将examVo中的属性值复制到exam对象中 BeanUtils.copyProperties(examVo, exam); - exam.setExamCreatorId(userId); // 考试的更新人为最新的创建人 - exam.setUpdateTime(new Date()); // 考试的更新日期要记录下 + // 设置考试更新人为最新的创建人 + exam.setExamCreatorId(userId); + // 记录考试更新日期 + exam.setUpdateTime(new Date()); + // 初始化选择题、判断题、单选题的id字符串 String radioIdsStr = ""; String checkIdsStr = ""; String judgeIdsStr = "";//djfndiosbchjdshjiowceduikmn + // 获取选择题、判断题、单选题的列表 List radios = examVo.getExamQuestionSelectVoRadioList(); List checks = examVo.getExamQuestionSelectVoCheckList(); List judges = examVo.getExamQuestionSelectVoJudgeList(); + // 初始化选择题、判断题、单选题的数量 int radioCnt = 0, checkCnt = 0, judgeCnt = 0; + // 遍历选择题列表,将选中的题目id添加到字符串中,并统计选择题数量 for (ExamQuestionSelectVo radio : radios) { if (radio.getChecked()) { radioIdsStr += radio.getQuestionId() + "-"; radioCnt++; } } + // 去除最后一个分隔符 radioIdsStr = replaceLastSeparator(radioIdsStr); + // 遍历判断题列表,将选中的题目id添加到字符串中,并统计判断题数量 for (ExamQuestionSelectVo check : checks) { if (check.getChecked()) { checkIdsStr += check.getQuestionId() + "-"; checkCnt++; } } + // 去除最后一个分隔符 checkIdsStr = replaceLastSeparator(checkIdsStr); + // 遍历单选题列表,将选中的题目id添加到字符串中,并统计单选题数量 for (ExamQuestionSelectVo judge : judges) { if (judge.getChecked()) { judgeIdsStr += judge.getQuestionId() + "-"; judgeCnt++; } } + // 去除最后一个分隔符。 judgeIdsStr = replaceLastSeparator(judgeIdsStr); + // 设置各个题目的id。 exam.setExamQuestionIds(radioIdsStr + "-" + checkIdsStr + "-" + judgeIdsStr); - // 设置各个题目的id exam.setExamQuestionIdsRadio(radioIdsStr); exam.setExamQuestionIdsCheck(checkIdsStr); exam.setExamQuestionIdsJudge(judgeIdsStr); - // 计算总分数 + // 计算总分数。 int examScore = radioCnt * exam.getExamScoreRadio() + checkCnt * exam.getExamScoreCheck() + judgeCnt * exam.getExamScoreJudge(); exam.setExamScore(examScore); + // 保存exam对象。 examRepository.save(exam); + // 返回exam对象。 return exam; } @@ -499,53 +543,53 @@ public class ExamServiceImpl implements ExamService { @Override public ExamRecord judge(String userId, String examId, HashMap> answersMap) { - // 开始考试判分啦~~~ - // 1.首先获取考试对象和选项数组 + // 开始考试判分啦~~~。 + // 1.首先获取考试对象和选项数组。 ExamDetailVo examDetailVo = getExamDetail(examId); Exam exam = examDetailVo.getExam(); - // 2.然后获取该考试下所有的题目信息 + // 2.然后获取该考试下所有的题目信息。 List questionIds = new ArrayList<>(); - // 2.1 题目id的数组 + // 2.1 题目id的数组。 List radioIdList = Arrays.asList(examDetailVo.getRadioIds()); List checkIdList = Arrays.asList(examDetailVo.getCheckIds()); List judgeIdList = Arrays.asList(examDetailVo.getJudgeIds()); questionIds.addAll(radioIdList); questionIds.addAll(checkIdList); questionIds.addAll(judgeIdList); - // 2.2 每种题目的分数 + // 2.2 每种题目的分数。 int radioScore = exam.getExamScoreRadio(); int checkScore = exam.getExamScoreCheck(); int judgeScore = exam.getExamScoreJudge(); - // 2.3 根据问题id的数组拿到所有的问题对象,供下面步骤用 + // 2.3 根据问题id的数组拿到所有的问题对象,供下面步骤用。 List questionList = questionRepository.findAllById(questionIds); Map questionMap = new HashMap<>(); for (Question question : questionList) { questionMap.put(question.getQuestionId(), question); } - // 3.根据正确答案和用户作答信息进行判分 + // 3.根据正确答案和用户作答信息进行判分。 Set questionIdsAnswer = answersMap.keySet(); - // 存储当前考试每个题目的得分情况 + // 存储当前考试每个题目的得分情况。 Map judgeMap = new HashMap<>(); - // 考生作答地每个题目的选项(题目和题目之间用$分隔,题目有多个选项地话用-分隔,题目和选项之间用_分隔),用于查看考试详情 - // 例子:题目1的id_作答选项1-作答选项2&题目2的id_作答选项1&题目3_作答选项1-作答选项2-作答选项3 + // 考生作答地每个题目的选项(题目和题目之间用$分隔,题目有多个选项地话用-分隔,题目和选项之间用_分隔),用于查看考试详情。 + // 例子:题目1的id_作答选项1-作答选项2&题目2的id_作答选项1&题目3_作答选项1-作答选项2-作答选项3。 StringBuilder answerOptionIdsSb = new StringBuilder(); - // 用户此次考试的总分 + // 用户此次考试的总分。 int totalScore = 0; for (String questionId : questionIdsAnswer) { - // 获取用户作答地这个题的答案信息 + // 获取用户作答地这个题的答案信息。 Question question = questionMap.get(questionId); - // 获取答案选项 + // 获取答案选项。 String questionAnswerOptionIds = replaceLastSeparator(question.getQuestionAnswerOptionIds()); List questionAnswerOptionIdList = Arrays.asList(questionAnswerOptionIds.split("-")); Collections.sort(questionAnswerOptionIdList); String answerStr = listConcat(questionAnswerOptionIdList); - // 获取用户作答 + // 获取用户作答。 List questionUserOptionIdList = answersMap.get(questionId); Collections.sort(questionUserOptionIdList); String userStr = listConcat(questionUserOptionIdList); - // 判断questionAnswerOptionIds和answersMap里面的答案是否相等 + // 判断questionAnswerOptionIds和answersMap里面的答案是否相等。 if (answerStr.equals(userStr)) { - // 说明题目作答正确,下面根据题型给分 + // 说明题目作答正确,下面根据题型给分。 int score = 0; if (radioIdList.contains(questionId)) { score = radioScore; @@ -556,22 +600,22 @@ public class ExamServiceImpl implements ExamService { if (judgeIdList.contains(questionId)) { score = judgeScore; } - // 累计本次考试得分 + // 累计本次考试得分。 totalScore += score; - // True代表题目答对 + // True代表题目答对。 answerOptionIdsSb.append(questionId + "@True_" + userStr + "$"); judgeMap.put(questionId, score); } else { - // 说明题目作答错误,直接判零分,False代表题目答错 + // 说明题目作答错误,直接判零分,False代表题目答错。 answerOptionIdsSb.append(questionId + "@False_" + userStr + "$"); judgeMap.put(questionId, 0); } } - // 4.计算得分,记录本次考试结果,存到ExamRecord中 + // 4.计算得分,记录本次考试结果,存到ExamRecord中。 ExamRecord examRecord = new ExamRecord(); examRecord.setExamRecordId(IdUtil.simpleUUID()); examRecord.setExamId(examId); - // 注意去掉最后可能有的&_- + // 注意去掉最后可能有的&_-。 examRecord.setAnswerOptionIds(replaceLastSeparator(answerOptionIdsSb.toString())); examRecord.setExamJoinerId(userId); examRecord.setExamJoinDate(new Date()); @@ -582,58 +626,60 @@ public class ExamServiceImpl implements ExamService { @Override public List getExamRecordList(String userId) { - // 获取指定用户下的考试记录列表 + // 获取指定用户下的考试记录列表。 List examRecordList = examRecordRepository.findByExamJoinerIdOrderByExamJoinDateDesc(userId); List examRecordVoList = new ArrayList<>(); for (ExamRecord examRecord : examRecordList) { ExamRecordVo examRecordVo = new ExamRecordVo(); + // 根据考试记录中的考试ID获取考试信息 Exam exam = examRepository.findById(examRecord.getExamId()).orElse(null); examRecordVo.setExam(exam); + // 根据用户ID获取用户信息 User user = userRepository.findById(userId).orElse(null); examRecordVo.setUser(user); + // 设置考试记录信息 examRecordVo.setExamRecord(examRecord); examRecordVoList.add(examRecordVo); } return examRecordVoList; } - @Override public RecordDetailVo getRecordDetail(String recordId) { - // 获取考试详情的封装对象 + // 获取考试详情的封装对象。 ExamRecord record = examRecordRepository.findById(recordId).orElse(null); RecordDetailVo recordDetailVo = new RecordDetailVo(); recordDetailVo.setExamRecord(record); - // 用户的答案,需要解析 + // 用户的答案,需要解析。 HashMap> answersMap = new HashMap<>(); HashMap resultsMap = new HashMap<>(); assert record != null; String answersStr = record.getAnswerOptionIds(); - // $分隔题目,因为$在正则中有特殊用途(行尾),所以需要括起来 + // $分隔题目,因为$在正则中有特殊用途(行尾),所以需要括起来。 String[] questionArr = answersStr.split("[$]"); for (String questionStr : questionArr) { System.out.println(questionStr); - // 区分开题目标题和选项 + // 区分开题目标题和选项。 String[] questionTitleResultAndOption = questionStr.split("_"); String[] questionTitleAndResult = questionTitleResultAndOption[0].split("@"); String[] questionOptions = questionTitleResultAndOption[1].split("-"); - // 题目:答案选项 + // 题目:答案选项。 answersMap.put(questionTitleAndResult[0], Arrays.asList(questionOptions)); - // 题目:True / False + // 题目:True / False。 resultsMap.put(questionTitleAndResult[0], questionTitleAndResult[1]); } recordDetailVo.setAnswersMap(answersMap); recordDetailVo.setResultsMap(resultsMap); - // 下面再计算正确答案的map + // 下面再计算正确答案的map。 ExamDetailVo examDetailVo = getExamDetail(record.getExamId()); List questionIdList = new ArrayList<>(); questionIdList.addAll(Arrays.asList(examDetailVo.getRadioIds())); questionIdList.addAll(Arrays.asList(examDetailVo.getCheckIds())); questionIdList.addAll(Arrays.asList(examDetailVo.getJudgeIds())); - // 获取所有的问题对象 + // 获取所有的问题对象。 List questionList = questionRepository.findAllById(questionIdList); HashMap> answersRightMap = new HashMap<>(); for (Question question : questionList) { - // 记得去掉最后可能出现的特殊字符 + // 记得去掉最后可能出现的特殊字符。 String questionAnswerOptionIdsStr = replaceLastSeparator(question.getQuestionAnswerOptionIds()); String[] questionAnswerOptionIds = questionAnswerOptionIdsStr.split("-"); answersRightMap.put(question.getQuestionId(), Arrays.asList(questionAnswerOptionIds)); @@ -641,7 +687,6 @@ public class ExamServiceImpl implements ExamService { recordDetailVo.setAnswersRightMap(answersRightMap); return recordDetailVo; } - /** * 把字符串最后一个字符-替换掉 * @@ -650,7 +695,7 @@ public class ExamServiceImpl implements ExamService { */ private String replaceLastSeparator(String str) { String lastChar = str.substring(str.length() - 1); - // 题目和题目之间用$分隔,题目有多个选项地话用-分隔,题目和选项之间用_分隔 + // 题目和题目之间用$分隔,题目有多个选项地话用-分隔,题目和选项之间用_分隔。 if ("-".equals(lastChar) || "_".equals(lastChar) || "$".equals(lastChar)) { str = StrUtil.sub(str, 0, str.length() - 1); } @@ -672,3 +717,4 @@ public class ExamServiceImpl implements ExamService { return replaceLastSeparator(sb.toString()); } } +//注释完毕 \ No newline at end of file