答题情况和每题得分

server/2024/10/16 0:25:00/

文章目录

    • 1.提交答题情况
        • 1.PracticeDetailController.java
        • 2.PracticeDetailService.java
        • 3.PracticeDetailServiceImpl.java
        • 4.PracticeDetailDao.java
        • 5.PracticeDetailDao.xml
        • 6.req
          • SubmitSubjectDetailReq.java
        • 7.dto
          • 1.SubjectDetailDTO.java
          • 2.SubjectDTO.java
          • 3.SubjectOptionDTO.java
        • 8.测试
          • 1.接口设计
          • 2.db
            • 1.更新提交时间和用时 practice_info
            • 2.练习细节如果有的话就更新记录 practice_detail
            • 3.测试遇到一个bug,即使题目正确也会插入答案状态为0,状态设置的时候有问题
    • 2.答案解析-每题得分
        • 1.GetScoreDetailReq.java
        • 2.ScoreDetailVO.java
        • 3.PracticeDetailController.java
        • 4.PracticeDetailService.java
        • 5.PracticeDetailServiceImpl.java
        • 6.PracticeDetailDao.xml
        • 7.测试

1.提交答题情况

java_5">1.PracticeDetailController.java
java">    /*** 提交题目,每一次点下一题,都会调用这个接口*/@PostMapping(value = "/submitSubject")public Result<Boolean> submitSubject(@RequestBody SubmitSubjectDetailReq req) {try {if (log.isInfoEnabled()) {log.info("练习提交题目入参{}", JSON.toJSONString(req));}Preconditions.checkArgument(!Objects.isNull(req), "参数不能为空!");Preconditions.checkArgument(!Objects.isNull(req.getPracticeId()), "练习id不能为空!");Preconditions.checkArgument(!Objects.isNull(req.getSubjectId()), "题目id不能为空!");Preconditions.checkArgument(!Objects.isNull(req.getSubjectType()), "题目类型不能为空!");Preconditions.checkArgument(!StringUtils.isBlank(req.getTimeUse()), "用时不能为空!");Boolean result = practiceDetailService.submitSubject(req);log.info("练习提交题目出参{}", result);return Result.ok(result);} catch (IllegalArgumentException e) {log.error("参数异常!错误原因{}", e.getMessage(), e);return Result.fail(e.getMessage());} catch (Exception e) {log.error("练习提交题目异常!错误原因{}", e.getMessage(), e);return Result.fail("练习提交题目异常!");}}
java_35">2.PracticeDetailService.java
java">package com.sunxiansheng.practice.server.service;import com.sunxiansheng.practice.api.req.SubmitSubjectDetailReq;/*** Description:* @Author sun* @Create 2024/7/8 12:28* @Version 1.0*/
public interface PracticeDetailService {/*** 练习提交题目*/Boolean submitSubject(SubmitSubjectDetailReq req);}
java_59">3.PracticeDetailServiceImpl.java
java">package com.sunxiansheng.practice.server.service.impl;import com.sunxiansheng.practice.api.enums.SubjectInfoTypeEnum;
import com.sunxiansheng.practice.api.req.SubmitSubjectDetailReq;
import com.sunxiansheng.practice.server.dao.*;
import com.sunxiansheng.practice.server.entity.dto.SubjectDTO;
import com.sunxiansheng.practice.server.entity.po.PracticeDetailPO;
import com.sunxiansheng.practice.server.entity.po.PracticePO;
import com.sunxiansheng.practice.server.entity.po.SubjectMultiplePO;
import com.sunxiansheng.practice.server.entity.po.SubjectRadioPO;
import com.sunxiansheng.practice.server.service.PracticeDetailService;
import com.sunxiansheng.practice.server.util.LoginUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;import javax.annotation.Resource;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;/*** Description:* @Author sun* @Create 2024/6/25 17:08* @Version 1.0*/
@Service
@Slf4j
public class PracticeDetailServiceImpl implements PracticeDetailService {@Resourceprivate PracticeDao practiceDao;@Resourceprivate SubjectDao subjectDao;@Resourceprivate SubjectRadioDao subjectRadioDao;@Resourceprivate SubjectMultipleDao subjectMultipleDao;@Resourceprivate PracticeDetailDao practiceDetailDao;@Override@Transactional(rollbackFor = Exception.class)public Boolean submitSubject(SubmitSubjectDetailReq req) {// 获取req的信息Long practiceId = req.getPracticeId();Long subjectId = req.getSubjectId();List<Integer> answerContents = req.getAnswerContents();Integer subjectType = req.getSubjectType();String timeUse = req.getTimeUse();// ============================== 处理用时 ==============================if (timeUse.equals("0")) {timeUse = "000000";}String hour = timeUse.substring(0, 2);String minute = timeUse.substring(2, 4);String second = timeUse.substring(4, 6);// ============================== 处理用时 ==============================// ============================== 根据id更新时间 ==============================PracticePO practicePO = new PracticePO();practicePO.setId(practiceId);practicePO.setTimeUse(hour + ":" + minute + ":" + second);practicePO.setSubmitTime(new Date());practiceDao.update(practicePO);// ============================== 根据id更新时间 ==============================// ============================== 给练习的细节插入一条记录 ==============================PracticeDetailPO practiceDetailPO = new PracticeDetailPO();// 基本信息填充practiceDetailPO.setPracticeId(practiceId);practiceDetailPO.setSubjectId(subjectId);practiceDetailPO.setSubjectType(subjectType);String loginId = LoginUtil.getLoginId();practiceDetailPO.setCreatedBy(loginId);practiceDetailPO.setCreatedTime(new Date());practiceDetailPO.setIsDeleted(0);// 修改答案数组,将答案变成1,2,3...这种格式的String answerContent = getAnswerContent(answerContents);practiceDetailPO.setAnswerContent(answerContent);// 从数据库中获取正确答案,并判断答案是否正确SubjectDTO subjectDTO = new SubjectDTO();subjectDTO.setSubjectId(req.getSubjectId());subjectDTO.setSubjectType(req.getSubjectType());// 根据subjectId和subjectType来获取题目答案// 初始化为0Integer answerStatus = 0;StringBuffer correctAnswer = new StringBuffer();// 获得正确答案的字符串extracted(subjectType, subjectId, correctAnswer);// 如果答案正确,则答案的状态就会是1,否则是0if (Objects.equals(correctAnswer.toString(), answerContent)) {// practiceDetailPO.setAnswerStatus(1);answerStatus = 1;}practiceDetailPO.setAnswerStatus(answerStatus);// 到此练习的细节就构建完毕了// 查询练习细节是否已经存在了,如果存在就更新,不存在就插入PracticeDetailPO existDetail = practiceDetailDao.selectDetail(practiceId, subjectId, loginId);if (Objects.isNull(existDetail)) {practiceDetailDao.insertSingle(practiceDetailPO);} else {practiceDetailPO.setId(existDetail.getId());practiceDetailDao.update(practiceDetailPO);}// ============================== 给练习的细节插入一条记录 ==============================return true;}/*** 根据题目id和类型,得到正确答案的字符串* @param subjectType* @param subjectId* @param correctAnswer*/private void extracted(Integer subjectType, Long subjectId, StringBuffer correctAnswer) {// 单选if (subjectType == SubjectInfoTypeEnum.RADIO.getCode()) {// 查询单选题目细节List<SubjectRadioPO> subjectRadioPOS = subjectRadioDao.selectBySubjectId(subjectId);// 得到对的那个的选项类型subjectRadioPOS.forEach(radio -> {if (Objects.equals(radio.getIsCorrect(), 1)) {correctAnswer.append(radio.getOptionType());}});}// 多选if (subjectType == SubjectInfoTypeEnum.MULTIPLE.getCode()) {// 查询多选题目细节List<SubjectMultiplePO> subjectMultiplePOS = subjectMultipleDao.selectBySubjectId(subjectId);// 得到所有的对的选项类型subjectMultiplePOS.forEach(multiple -> {if (Objects.equals(multiple.getIsCorrect(), 1)) {correctAnswer.append(multiple.getOptionType()).append(",");}});// 去掉最后一个逗号if (correctAnswer.length() > 0) {correctAnswer.deleteCharAt(correctAnswer.length() - 1);}}// 判断if (subjectType == SubjectInfoTypeEnum.JUDGE.getCode()) {// 查询判断题目细节List<SubjectMultiplePO> subjectMultiplePOS = subjectMultipleDao.selectBySubjectId(subjectId);// 判断题只能有一条细节,所以取第一个就可以Integer isCorrect = subjectMultiplePOS.get(0).getIsCorrect();correctAnswer.append(isCorrect);}}/*** 修改答案数组,将答案变成1,2,3...这种格式的* @param answerContents* @return*/private static String getAnswerContent(List<Integer> answerContents) {String answerContent = "";// 判空if (!CollectionUtils.isEmpty(answerContents)) {// 排序Collections.sort(answerContents);// 拼接answerContent = StringUtils.join(answerContents, ",");}return answerContent;}}
java_249">4.PracticeDetailDao.java
java">    /*** 更新练习详情*/int update(PracticeDetailPO practiceDetailPO);
5.PracticeDetailDao.xml
    <update id="update">update practice_detail<set><if test="answerStatus != null">answer_status = #{answerStatus},</if><if test="answerContent != null">answer_content = #{answerContent},</if></set>where id = #{id,jdbcType=BIGINT}</update>
6.req
java_277">SubmitSubjectDetailReq.java
java">package com.sunxiansheng.practice.api.req;import lombok.Data;import java.io.Serializable;
import java.util.List;@Data
public class SubmitSubjectDetailReq implements Serializable {/*** 练习id*/private Long practiceId;/*** 题目id*/private Long subjectId;/*** 题目答案*/private List<Integer> answerContents;/*** 题目类型*/private Integer subjectType;/*** 用时*/private String timeUse;}
7.dto
java_320">1.SubjectDetailDTO.java
java">package com.sunxiansheng.practice.server.entity.dto;import lombok.Data;import java.io.Serializable;
import java.util.List;@Data
public class SubjectDetailDTO implements Serializable {/*** 题目id*/private Long id;/*** 题目名称*/private String subjectName;/*** 判断题答案*/private Integer isCorrect;/*** 题目解析*/private String subjectParse;/*** 单选、多选、判断题目答案*/private List<SubjectOptionDTO> optionList;}
java_362">2.SubjectDTO.java
java">package com.sunxiansheng.practice.server.entity.dto;import lombok.Data;import java.io.Serializable;@Data
public class SubjectDTO implements Serializable {/*** 题目id*/private Long id;/*** 题目id*/private Long subjectId;/*** 题目名称*/private String subjectName;/*** 题目类型*/private Integer subjectType;}
java_397">3.SubjectOptionDTO.java
java">package com.sunxiansheng.practice.server.entity.dto;import lombok.Data;import java.io.Serializable;@Data
public class SubjectOptionDTO implements Serializable {/*** 答案类型*/private Integer optionType;/*** 答案内容*/private String optionContent;/*** 是否为正确答案*/private Integer isCorrect;}
8.测试
1.接口设计

CleanShot 2024-07-08 at 15.57.58@2x

2.db
1.更新提交时间和用时 practice_info

CleanShot 2024-07-08 at 15.59.47@2x

2.练习细节如果有的话就更新记录 practice_detail

CleanShot 2024-07-08 at 16.01.05@2x

3.测试遇到一个bug,即使题目正确也会插入答案状态为0,状态设置的时候有问题

CleanShot 2024-07-08 at 16.02.44@2x

2.答案解析-每题得分

java_449">1.GetScoreDetailReq.java
java">package com.sunxiansheng.practice.api.req;import lombok.Data;import java.io.Serializable;@Data
public class GetScoreDetailReq implements Serializable {/*** 练习id*/private Long practiceId;}
java_469">2.ScoreDetailVO.java
java">package com.sunxiansheng.practice.api.vo;import lombok.Data;import java.io.Serializable;@Data
public class ScoreDetailVO implements Serializable {/*** 题目id*/private Long subjectId;/*** 题目类型*/private Integer subjectType;/*** 是否正确*/private Integer isCorrect;}
java_500">3.PracticeDetailController.java
java">    /*** 答案解析-每题得分*/@PostMapping(value = "/getScoreDetail")public Result<List<ScoreDetailVO>> getScoreDetail(@RequestBody GetScoreDetailReq req) {try {if (log.isInfoEnabled()) {log.info("每题得分入参{}", JSON.toJSONString(req));}Preconditions.checkArgument(!Objects.isNull(req), "参数不能为空!");Preconditions.checkArgument(!Objects.isNull(req.getPracticeId()), "练习id不能为空!");List<ScoreDetailVO> list = practiceDetailService.getScoreDetail(req);if (log.isInfoEnabled()) {log.info("每题得分出参{}", JSON.toJSONString(list));}return Result.ok(list);} catch (IllegalArgumentException e) {log.error("参数异常!错误原因{}", e.getMessage(), e);return Result.fail(e.getMessage());} catch (Exception e) {log.error("每题得分异常!错误原因{}", e.getMessage(), e);return Result.fail("每题得分异常!");}}
java_530">4.PracticeDetailService.java
java">    /*** 每题得分详情*/List<ScoreDetailVO> getScoreDetail(GetScoreDetailReq req);
java_540">5.PracticeDetailServiceImpl.java
java">    @Overridepublic List<ScoreDetailVO> getScoreDetail(GetScoreDetailReq req) {// 获取练习idLong practiceId = req.getPracticeId();// 根据练习id查询题目id,题目类型,题目状态List<PracticeDetailPO> practiceDetailPOList = practiceDetailDao.selectByPracticeId(practiceId);// 判空if (CollectionUtils.isEmpty(practiceDetailPOList)) {return Collections.emptyList();}// 将其map成要返回的结果List<ScoreDetailVO> res = practiceDetailPOList.stream().map(po -> {// 将每一个practiceDetailPO都map成ScoreDetailVOScoreDetailVO scoreDetailVO = new ScoreDetailVO();scoreDetailVO.setSubjectId(po.getSubjectId());scoreDetailVO.setSubjectType(po.getSubjectType());scoreDetailVO.setIsCorrect(po.getAnswerStatus());return scoreDetailVO;}).collect(Collectors.toList());return res;}
6.PracticeDetailDao.xml
    <select id="selectByPracticeId" resultType="com.sunxiansheng.practice.server.entity.po.PracticeDetailPO">select subject_id as subjectId, subject_type as subjectType, answer_status as answerStatusfrom practice_detailwhere practice_id = #{practiceId}and is_deleted = 0</select>
7.测试

CleanShot 2024-07-09 at 12.37.41@2x


http://www.ppmy.cn/server/101977.html

相关文章

深度解析:NPM、PNPM、Yarn 包管理工具的介绍与对比

在前端开发中&#xff0c;包管理工具是不可或缺的一部分&#xff0c;它们帮助我们轻松管理项目依赖、发布和共享代码。NPM、PNPM、Yarn 是目前最流行的包管理工具&#xff0c;但它们各有特点和使用场景。本文将深入解析这三大包管理工具&#xff0c;帮助你选择最适合自己项目的…

Bugku-web-你必须让他停下来

打开环境&#xff0c;先分析出现的提示是让这个页面停下来 我们尝试关闭JS&#xff0c;发现确实停下来了-----》F12查看页面源代码但是flag还是没有出现&#xff0c;----》尝试刷新jpg随着刷新而变化&#xff0c;当刷新到10.jpg时flag出现 最后我尝试不关js刷新打开源代码刷新也…

next中 [slug]和[...slug]路由匹配的区别

在 Next.js 中&#xff0c;路由参数的匹配方式有两个主要形式&#xff1a;单个参数路径&#xff08;使用方括号 [slug]&#xff09;和多个参数路径&#xff08;使用扩展语法 […slug]&#xff09;。这两者的主要区别在于它们如何捕获 URL 中的路径段。 1、[slug] - 单个参数路…

【计算机网络——分组延时,丢失,吞吐量】

处理延时&#xff1a;1检查分组首部信息&#xff0c;决定将该分组导向何处所需时间。2检查比特级别的差错所需时间&#xff1a;分析这个分组是否出错&#xff0c;目标IP地址字段提取出来&#xff0c;查路由表……。 传播延时和传输延时&#xff1a;传输延时就是分组到链路所需…

ROS机械臂——ROS结合OpenCV案例(含资源)

纲要 摄像头驱动 图像属性 图像压缩 ### Realsense摄像头 点云展示 ### 点云图像属性 ## 摄像头标定 摄像头标定流程 如何使用标定文件 OpenCV ROS与OpenCV的集成框架 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b0ff143b710543839325d19c7a3c04c5.png R…

NVDLA专题10:具体模块介绍——Planar Data Processor

概述 平面数据处理器(Planar Data Processor, PDP)沿宽x高的前两个维度平面执行操作&#xff0c;在NVDLA版中&#xff0c;PDPD旨在实现池化层&#xff0c;module定义在NV_NVDLA_pdp.v。支持最大、最小和平均池化方法。平面内的几个相邻输入元素将被发送到非线性函数来计算一个…

讲解机器学习中的 K-均值聚类算法及其优缺点。

K-均值聚类算法是机器学习中一种常用的无监督学习算法&#xff0c;用于将数据集中的样本分为 K 个不同的类别。 算法步骤如下&#xff1a; 选择 K 个初始的中心点&#xff08;聚类中心&#xff09;作为初始的类别中心。将数据集中的每个样本点分配到距离其最近的中心点所在的…

了解Android

Android 系统架构 从图中可以看出&#xff0c;整个Android操作系统分为五层。它们分别是&#xff1a; 内核层 Android系统是基于Linux内核的&#xff0c;这一层为Android设备的各种硬件提供了底层的驱动。硬件抽象层 该层为硬件厂商定义了一套标准的接口。这样可以在不影响上层…