答题情况和每题得分

文章目录

    • 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.提交答题情况

1.PracticeDetailController.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("练习提交题目异常!");}}
2.PracticeDetailService.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);}
3.PracticeDetailServiceImpl.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;}}
4.PracticeDetailDao.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
SubmitSubjectDetailReq.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
1.SubjectDetailDTO.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;}
2.SubjectDTO.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;}
3.SubjectOptionDTO.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.答案解析-每题得分

1.GetScoreDetailReq.java
package com.sunxiansheng.practice.api.req;import lombok.Data;import java.io.Serializable;@Data
public class GetScoreDetailReq implements Serializable {/*** 练习id*/private Long practiceId;}
2.ScoreDetailVO.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;}
3.PracticeDetailController.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("每题得分异常!");}}
4.PracticeDetailService.java
    /*** 每题得分详情*/List<ScoreDetailVO> getScoreDetail(GetScoreDetailReq req);
5.PracticeDetailServiceImpl.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.rhkb.cn/news/403103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<C语言>指针的深度学习

目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义 2.&数组名与数组名 3.数组指针的使用 四、数组参数、指针参数 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 五、函数指针 六、函数指针数组 七、指向函数指针数组的指针 八、回调函数 1…

HCIP-HarmonyOS Application Developer 习题(三)

1、在JS(JavaScript)Ul框架中&#xff0c;完成对平台层进行抽象&#xff0c;提供抽象接口&#xff0c;对接到系统平台的是哪一层? A. 应用层 B. 前端框架层 C. 引擎层 D. 平台适配层 答案&#xff1a;D 分析&#xff1a;适配层主要完成对平台层进行抽象&#xff0c;提供抽象接…

iOS更新后在IPhone上恢复丢失的文本消息的4种方法

您是否在更新 iPhone 软件后丢失了重要的短信&#xff1f;丢失数据可能会令人沮丧&#xff0c;尤其是当它包含有价值的信息或感性信息时。幸运的是&#xff0c;有一些方法可以在iOS更新后恢复iPhone上丢失的短信。 在这篇博文中&#xff0c;我们将讨论可用于恢复丢失的短信的不…

Edge浏览器 (文本选择)I型光标消失不见问题

Edge浏览器 I型&#xff08;文本选择&#xff09;光标消失不见的问题。 在白色背景中 光标也变成了纯白色&#xff0c;所有都是纯白 也就看不到光标在哪里了&#xff0c;会影响正常使用。 解决方案&#xff1a;把默认的I型光标替换掉 选择一个 beam*.cur , 可以在预览框中查看…

C语言家教记录(六)

导语 本次授课的内容如下&#xff1a;指针&#xff0c;指针和数组 辅助教材为 《C语言程序设计现代方法&#xff08;第2版&#xff09;》 指针 指针变量 计算机按字节划分地址&#xff0c;每个地址访问一个字节 指针变量指向变量的地址&#xff0c;指的是变量第一个字节的…

Leetcode JAVA刷刷站(39)组合总和

一、题目概述 二、思路方向 为了解决这个问题&#xff0c;我们可以使用回溯算法来找到所有可能的组合&#xff0c;使得组合中的数字之和等于目标数 target。因为数组中的元素可以无限制地重复选择&#xff0c;所以在回溯过程中&#xff0c;我们不需要跳过已经选择的元素&#x…

yolov8交互式指定区域行人计数/车辆计数

使用 Ultralytics YOLOv8 进行区域计数 (视频推理) 区域计数是一种用于统计指定区域内物体数量的方法&#xff0c;当考虑多个区域时&#xff0c;这种方法能提供更为精细的分析。这些区域可以根据用户的需求进行调整&#xff0c;并且计数过程能够在实时视频中进行。 目录 装…

Ricardo Milos

目录 一、题目 二、思路 三、payload 四、思考与总结 一、题目 <!-- Challenge --> <form id"ricardo" method"GET"><input name"milos" type"text" class"form-control" placeholder"True" va…

顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评

Q&#xff1a;顺丰科技2025届校园招聘面向对象是&#xff1f; A&#xff1a;2025届应届毕业生&#xff0c;毕业时间段为2024年10月1日至2025年9月30日&#xff08;不满足以上毕业时间的同学可以关注顺丰科技社会招聘或实习生招聘&#xff09;。 Q&#xff1a;我可以投递几个岗…

c语言---文件

这一节我准备分三个部分来带领大家了解文件 ——一、有关文件的基础知识 ————二、文件的简单操作 ————————三、文件结束的判定 ————————————四、文件缓冲区 一、文件的基础知识&#xff1a; 首先在了解文件之前&#xff0c;我们需要了解C/C程序内存…

安卓相关环境配置

安卓相关环境配置 偶尔更新。。。 JEB&#xff08;动态调试好用&#xff09; JEB动态调试Smali-真机/模拟器&#xff08;详细&#xff0c;新手必看&#xff09; 夜步城 JADX官网&#xff08;静态分析&#xff09; https://github.com/skylot/jadx/releases/tag/v1.5.0 雷…

MATLAB多项式拟合

订阅专栏或下载资源可以获得源代码:https://download.csdn.net/download/callmeup/89632160 拟合和插值 拟合和插值是两种常见的数学方法,用于以某种方式近似或估计实际数据。 拟合是在给定一组已知数据点的情况下,通过选择一个合适的数学模型来拟合数据。拟合的目标是找到…

民航管理局无人机运营合格证技术详解

1. 证书定义与意义 民航管理局无人机运营合格证&#xff08;以下简称“合格证”&#xff09;是对符合民航法规、规章及标准要求的无人机运营单位或个人进行资质认证的重要证明。该证书旨在确保无人机运营活动的安全、有序进行&#xff0c;保护国家空域安全&#xff0c;维护公众…

Linux·权限与工具-yum与vim

1. Linux软件包管理器 yum 1.1 什么是软件包 在Linux下安装软件&#xff0c;一个通常的办法是下载到程序的源代码&#xff0c;并进行编译&#xff0c;得到可执行程序。但这样做太麻烦了&#xff0c;于是有些人把一些常用的软件提前编译好&#xff0c;做成软件包(可以理解成Win…

超有性价比深度学习卡特斯拉 P100,16G大显存,Stable Diffusion AI 绘画利器

超有性价比深度学习卡特斯拉 P100&#xff0c;16G大显存&#xff0c;Stable Diffusion AI 绘画利器 在当今数字化创作的时代&#xff0c;AI 绘画技术正以惊人的速度发展&#xff0c;为艺术家和创作者们带来了全新的可能性。而要实现高效的 AI 绘画&#xff0c;一款性能卓越的显…

Camera基础知识系列(5)——景深

目录 一. 前言 二. 景深 2.1 弥散圆 2.2 容许弥散圆 2.2 景深(DoF) 三. 如何控制景深 1. 光圈因素 2. 容许弥散圆因素 四. 总结 一. 前言 在摄影中&#xff0c;我们有时会有模糊背景、突出主体的需求&#xff0c;即背景虚化。如下图所示&#xff0c;左边是没有做背景虚化…

序列建模之循环和递归网络 - 递归神经网络篇

序言 在序列建模的广阔领域中&#xff0c;递归神经网络&#xff08; Recursive Neural Network, RNN \text{Recursive Neural Network, RNN} Recursive Neural Network, RNN&#xff09;&#xff0c;注意此处的 RNN \text{RNN} RNN与常用于序列处理的循环神经网络在命名上有所…

打包时未添加camera模块,请参考https://ask.dcloud.net.cn/arss/1ooticle/283

今天在app打包使用的时候突然发现app在拍照上传照片的时候遇到这个问题 遇到这种情况通常是因为app打包的时候manifestjson文件中App模块配置中的Camera&Gallery配置没有打开&#xff0c;点击相应选项勾选即可 然后再上传打包就好了! 哈哈哈好久没写博客了最近太忙了&…

使用 Hugging Face 和 Milvus 构建 RAG 系统

Milvus 是一个广受欢迎的开源向量数据库&#xff0c;为人工智能应用提供高性能和可扩展的向量相似性搜索。在本教程中&#xff0c;我们将向您展示如何使用 Hugging Face 和 Milvus 构建 RAG&#xff08;检索增强生成&#xff09;流程。 RAG 系统将检索系统与 LLM 相结合。该系统…

android13 禁用wifi

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码分析 3.1 代码位置1 3.2 代码位置2 3.3 代码位置3 4.代码修改 5. 彩蛋 1.前言 这个文章讲的是,在frameworks里面禁止打开wifi。 2.情况分析 我们打开wifi一般是 public static void turnOnWifi(Co…