From 9a1c378ec5566a727efcb85120cdafd52c3ee9f1 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期四, 23 五月 2024 16:21:37 +0800 Subject: [PATCH] 在线练习增加练习模式、融合在线练题 --- src/main/java/com/mindskip/xzs/domain/enums/PracticeModeENum.java | 23 +++++ src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java | 3 src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java | 11 ++ src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java | 9 + src/main/java/com/mindskip/xzs/domain/SelfPractice.java | 3 src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java | 60 +++++++++++++- src/main/resources/mapper/SelfPracticeMapper.xml | 10 +- src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java | 4 + src/main/resources/mapper/QuestionSubjectMapper.xml | 36 ++++++++ src/main/java/com/mindskip/xzs/service/SelfPracticeService.java | 8 ++ src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java | 6 + src/main/resources/mapper/DeptQuestionMapper.xml | 15 ++- 12 files changed, 167 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java b/src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java index 270edaa..6b48e87 100644 --- a/src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java +++ b/src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java @@ -48,6 +48,17 @@ } /** + * 寮�濮嬬湅棰� + * + * @param id 缁冧範id + * @return + */ + @PostMapping("/start/look/{id}") + public RestResponse startLook(@PathVariable("id") Integer id) { + return selfPracticeService.startLook(id); + } + + /** * 闅忔満涓�閬撻 * * @param id diff --git a/src/main/java/com/mindskip/xzs/domain/SelfPractice.java b/src/main/java/com/mindskip/xzs/domain/SelfPractice.java index 8c991f8..dc81f7d 100644 --- a/src/main/java/com/mindskip/xzs/domain/SelfPractice.java +++ b/src/main/java/com/mindskip/xzs/domain/SelfPractice.java @@ -18,6 +18,9 @@ /** 鐢ㄦ埛ID */ private Integer userId; + /** 缁冧範妯″紡锛氬埛棰樸�佺湅棰� */ + private String practiceMode; + /** 澶囨敞 */ private String remark; diff --git a/src/main/java/com/mindskip/xzs/domain/enums/PracticeModeENum.java b/src/main/java/com/mindskip/xzs/domain/enums/PracticeModeENum.java new file mode 100644 index 0000000..a9b4962 --- /dev/null +++ b/src/main/java/com/mindskip/xzs/domain/enums/PracticeModeENum.java @@ -0,0 +1,23 @@ +package com.mindskip.xzs.domain.enums; + +import lombok.Getter; + +/** + * @author锛歺p + * @date锛�2024/5/23 11:24 + */ +@Getter +public enum PracticeModeENum { + + BRUSH("brush", "鍒烽"), + LOOK("look", "鐪嬮"), + ; + + private final String value; + private final String desc; + + PracticeModeENum(String value, String desc) { + this.value = value; + this.desc = desc; + } +} diff --git a/src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java b/src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java index 79ca623..05ad0b1 100644 --- a/src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java +++ b/src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java @@ -23,6 +23,9 @@ /** 鐢ㄦ埛ID */ private Integer userId; + /** 缁冧範妯″紡锛氬埛棰樸�佺湅棰� */ + private String practiceMode; + /** 澶囨敞 */ @NotBlank(message = "璇峰~鍐欐澶勬ā鎷熺殑鍚嶇О") private String remark; diff --git a/src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java b/src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java index 00dc870..0674ebe 100644 --- a/src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java +++ b/src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java @@ -16,6 +16,10 @@ private String subjectName; + /** 鍒烽妯″紡涓嬬殑棰樺垪琛� */ private List<PracticeQuestionCondition.QuestionFinishCondition> questionConditions; + /** 鐪嬮妯″紡涓嬬殑棰樺垪琛� */ + private List<QuestionVO> lookQuestionList; + } diff --git a/src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java b/src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java index c77a9c6..e7bde69 100644 --- a/src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java +++ b/src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java @@ -45,4 +45,10 @@ /** 鏍规嵁璇剧洰鍜岄鍨嬫煡璇㈤鐩甀D */ List<Integer> questionsBySubjectIdAndQuestionType(@Param("subjectId") Integer subjectId, @Param("questionType") Integer questionType); + + /** 鏍规嵁璇剧洰ID鏌ヨ棰樼洰璇︽儏 */ + List<QuestionVO> bySubjectId(@Param("subjectId") Integer subjectId); + + /** 鏍规嵁璇剧洰鍜岄鍨嬫煡鎵鹃鐩暟鎹� */ + List<QuestionVO> bySubjectIdAndQuestionType(Integer subjectId, Integer dataBaseValueByValue); } diff --git a/src/main/java/com/mindskip/xzs/service/SelfPracticeService.java b/src/main/java/com/mindskip/xzs/service/SelfPracticeService.java index f666a66..d356736 100644 --- a/src/main/java/com/mindskip/xzs/service/SelfPracticeService.java +++ b/src/main/java/com/mindskip/xzs/service/SelfPracticeService.java @@ -54,4 +54,12 @@ * @return */ RestResponse randomOneQuestion(Integer id); + + /** + * 寮�濮嬬湅棰� + * + * @param id + * @return + */ + RestResponse startLook(Integer id); } diff --git a/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java b/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java index 3c152c9..f6925e4 100644 --- a/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java +++ b/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java @@ -39,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.Arrays; @@ -108,7 +109,9 @@ deptQuestion.setDeptId(deptId); return deptQuestion; }).collect(Collectors.toList()); - deptQuestionMapper.add(deptQuestions); + if (! CollectionUtils.isEmpty(model.getDeptIds())) { + deptQuestionMapper.add(deptQuestions); + } //鎵归噺娣诲姞 List<QuestionSubject> list = Arrays.asList(model.getSubjectIds()).stream().map(e -> { @@ -143,7 +146,9 @@ deptQuestion.setDeptId(deptId); return deptQuestion; }).collect(Collectors.toList()); - deptQuestionMapper.add(deptQuestions); + if (! CollectionUtils.isEmpty(model.getDeptIds())) { + deptQuestionMapper.add(deptQuestions); + } //棰樺共銆佽В鏋愩�侀�夐」绛� 鏇存柊 TextContent infoTextContent = textContentService.selectById(question.getInfoTextContentId()); diff --git a/src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java b/src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java index d137530..6040be6 100644 --- a/src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java +++ b/src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java @@ -10,6 +10,7 @@ import com.mindskip.xzs.domain.PracticeQuestionCondition; import com.mindskip.xzs.domain.Question; import com.mindskip.xzs.domain.SelfPractice; +import com.mindskip.xzs.domain.enums.PracticeModeENum; import com.mindskip.xzs.domain.enums.PracticeQuestionTypeEnum; import com.mindskip.xzs.domain.enums.PracticeTypeEnum; import com.mindskip.xzs.domain.enums.QuestionTypeEnum; @@ -147,7 +148,7 @@ throw new RuntimeException("娌℃湁鎵惧埌棰樼洰锛屽彲鑳芥墍閫夎鐩寘鍚鐩笉瓒�"); } QuestionVO questionVO = one.get(0); - jsonQuestion(questionVO); + jsonQuestion(questionVO, Boolean.TRUE); return RestResponse.ok(questionVO); } return RestResponse.ok(); @@ -165,9 +166,52 @@ throw new RuntimeException("娌℃湁鎵惧埌棰樼洰锛屽彲鑳芥墍閫夎鐩寘鍚鐩笉瓒�"); } QuestionVO questionVO = one.get(0); - jsonQuestion(questionVO); + jsonQuestion(questionVO, Boolean.TRUE); return RestResponse.ok(questionVO); + } + + @Override + public RestResponse startLook(Integer id) { + SelfPractice en = selfPracticeMapper.selectById(id); + if (Objects.isNull(en)) { + throw new RuntimeException("缁冧範涓嶅瓨鍦�"); + } + List<Integer> subjectIds = JSON.parseArray(en.getSubjects(), Integer.class); + if (PracticeTypeEnum.ORDERED.getValue().equals(en.getPracticeType())) { + List<SubjectQuestionVO> list = new ArrayList<>(2); + // 椤哄簭鍋氶锛屾妸閫夋嫨鐨勯搴撶殑棰�(id)鍏ㄩ儴鏌ュ嚭鏉ワ紝鍓嶇鏈変釜搴忓彿闈㈡澘锛岀偣鍑诲摢閬撻鍋氬摢閬� + for (Integer subjectId : subjectIds) { + // 鏌ヨ鐩悕瀛� + String subjectName = subjectMapper.selectSubjectNameById(subjectId); + List<QuestionVO> questionVOs = new ArrayList<>(); + if (PracticeQuestionTypeEnum.ALL.getValue().equals(en.getQuestionType())) { + questionVOs = questionSubjectMapper.bySubjectId(subjectId); + } else { + questionVOs = questionSubjectMapper.bySubjectIdAndQuestionType(subjectId, PracticeQuestionTypeEnum.getDataBaseValueByValue(en.getQuestionType())); + } + questionVOs.stream().forEach(question -> { + question.setContent(JSON.parseObject(question.getContentJson(), QuestionContentVO.class)); + }); + // 杩斿洖鍝嶅簲鏁版嵁 + SubjectQuestionVO subjectQuestionVO = new SubjectQuestionVO(); + subjectQuestionVO.setSubjectId(subjectId); + subjectQuestionVO.setSubjectName(subjectName); + subjectQuestionVO.setLookQuestionList(questionVOs); + list.add(subjectQuestionVO); + } + return RestResponse.ok(list); + } else if (PracticeTypeEnum.RANDOM.getValue().equals(en.getPracticeType())) { + // 闅忔満缁冧範锛屾槸涓�閬撻涓�閬撻缁冧範 + List<QuestionVO> one = questionSubjectMapper.getRandomQuestionId(subjectIds, PracticeQuestionTypeEnum.getDataBaseValueByValue(en.getQuestionType()), 1); + if (one.size() < 1) { + throw new RuntimeException("娌℃湁鎵惧埌棰樼洰锛屽彲鑳芥墍閫夎鐩寘鍚鐩笉瓒�"); + } + QuestionVO questionVO = one.get(0); + jsonQuestion(questionVO, Boolean.FALSE); + return RestResponse.ok(questionVO); + } + return RestResponse.ok(); } /** @@ -175,7 +219,7 @@ * * @param questionVO */ - public void jsonQuestion(QuestionVO questionVO) { + public void jsonQuestion(QuestionVO questionVO, Boolean clearAnswer) { if (StringUtils.hasText(questionVO.getContentJson())) { QuestionContentVO questionContent = JSON.parseObject(questionVO.getContentJson(), QuestionContentVO.class); questionVO.setContent(questionContent); @@ -186,9 +230,11 @@ questionVO.setAnswerNum(questionVO.getCorrect().split(",").length); } } - questionVO.setContentJson(""); - questionVO.setCorrect(""); - questionVO.getContent().setCorrect(""); - questionVO.getContent().setAnalyze(""); + if (clearAnswer) { + questionVO.setContentJson(""); + questionVO.setCorrect(""); + questionVO.getContent().setCorrect(""); + questionVO.getContent().setAnalyze(""); + } } } diff --git a/src/main/resources/mapper/DeptQuestionMapper.xml b/src/main/resources/mapper/DeptQuestionMapper.xml index 7edda4a..9ad9983 100644 --- a/src/main/resources/mapper/DeptQuestionMapper.xml +++ b/src/main/resources/mapper/DeptQuestionMapper.xml @@ -16,14 +16,19 @@ DELETE FROM t_dept_question WHERE question_id = #{questionId} - AND dept_id IN - <foreach collection="deptIds" open="(" separator="," close=")" item="deptId"> - #{deptId} - </foreach> + <if test="deptIds != null and deptIds.size > 0"> + AND dept_id IN + <foreach collection="deptIds" open="(" separator="," close=")" item="deptId"> + #{deptId} + </foreach> + </if> </delete> <select id="deptByQuestionId" resultType="com.mindskip.xzs.domain.vo.DeptQuestionVO"> - SELECT tdq.dept_id, td.name as deptName FROM t_dept_question tdq INNER JOIN t_department td ON td.id = tdq.dept_id WHERE tdq.question_id = #{questionId} + SELECT tdq.dept_id, td.name as deptName + FROM t_dept_question tdq + INNER JOIN t_department td ON td.id = tdq.dept_id + WHERE tdq.question_id = #{questionId} </select> </mapper> diff --git a/src/main/resources/mapper/QuestionSubjectMapper.xml b/src/main/resources/mapper/QuestionSubjectMapper.xml index 69f5979..c5aa74d 100644 --- a/src/main/resources/mapper/QuestionSubjectMapper.xml +++ b/src/main/resources/mapper/QuestionSubjectMapper.xml @@ -98,24 +98,54 @@ id DESC </select> - <select id="questionsBySubjectId" resultType="integer"> + <select id="questionsBySubjectId" resultType="integer"> SELECT - tqs.question_id + tqs.question_id, ttc.content FROM t_question_subject tqs INNER JOIN t_question tq ON tqs.question_id = tq.id AND tqs.subject_id = #{subjectId} + INNER JOIN t_text_content ttc tct.id = tq.info_text_content_id ORDER BY tqs.id DESC </select> <select id="questionsBySubjectIdAndQuestionType" resultType="integer"> SELECT - tqs.question_id + tqs.question_id, ttc.content FROM t_question_subject tqs INNER JOIN t_question tq ON tqs.question_id = tq.id AND tqs.subject_id = #{subjectId} AND tq.question_type = #{questionType} + INNER JOIN t_text_content ttc ttc.id = tq.info_text_content_id ORDER BY tqs.id DESC </select> + <select id="bySubjectId" resultType="com.mindskip.xzs.domain.vo.QuestionVO"> + SELECT + tq.id, + tq.question_type, + tq.correct, + ttc.content as contentJson + FROM + t_question_subject tqs + INNER JOIN t_question tq ON tqs.question_id = tq.id AND tqs.subject_id = #{subjectId} + INNER JOIN t_text_content ttc ON ttc.id = tq.info_text_content_id + ORDER BY + tq.id DESC + </select> + + <select id="bySubjectIdAndQuestionType" resultType="com.mindskip.xzs.domain.vo.QuestionVO"> + SELECT + tq.id, + tq.question_type, + tq.correct, + ttc.content as contentJson + FROM + t_question_subject tqs + INNER JOIN t_question tq ON tqs.question_id = tq.id AND tqs.subject_id = #{subjectId} AND tq.question_type = #{questionType} + INNER JOIN t_text_content ttc ON tct.id = tq.info_text_content_id + ORDER BY + tq.id DESC + </select> + </mapper> diff --git a/src/main/resources/mapper/SelfPracticeMapper.xml b/src/main/resources/mapper/SelfPracticeMapper.xml index 1b02250..c9c0785 100644 --- a/src/main/resources/mapper/SelfPracticeMapper.xml +++ b/src/main/resources/mapper/SelfPracticeMapper.xml @@ -5,9 +5,9 @@ <insert id="add" keyColumn="id" useGeneratedKeys="true" parameterType="com.mindskip.xzs.domain.SelfPractice"> INSERT INTO - t_self_practice(user_id, remark, subjects, practice_type, create_time, update_time, question_type, deleted) + t_self_practice(user_id, remark, subjects, practice_type, create_time, update_time, question_type, deleted, practice_mode) VALUE - (#{userId}, #{remark}, #{subjects}, #{practiceType}, #{createTime}, #{updateTime}, #{questionType}, #{deleted}) + (#{userId}, #{remark}, #{subjects}, #{practiceType}, #{createTime}, #{updateTime}, #{questionType}, #{deleted}, #{practiceMode}) </insert> <select id="page" resultType="com.mindskip.xzs.domain.vo.SelfPracticeVO"> @@ -19,7 +19,8 @@ practice_type as practiceType, create_time createTime, update_time as updateTime, - question_type as questionType + question_type as questionType, + practice_mode as practiceMode FROM t_self_practice <where> @@ -47,7 +48,8 @@ practice_type as practiceType, create_time createTime, update_time as updateTime, - question_type as questionType + question_type as questionType, + practice_mode as practiceMode FROM t_self_practice WHERE -- Gitblit v1.8.0