增加练习(修改获取练习的基本信息接口)

news2024/9/19 9:28:23

文章目录

    • 1.sun-club-practice-api
        • 1.enums
          • 1.CompleteStatusEnum.java
        • 2.req
          • 1.GetPracticeSubjectsReq.java
        • 3.vo
          • 1.PracticeSubjectListVO.java
    • 2.sun-club-practice-server
        • 1.PracticeSetController.java
        • 2.service
          • 1.PracticeSetServiceImpl.java
        • 3.dao
          • 1.PracticeDao.java
          • 2.PracticeDetailDao.java
        • 4.mapper
          • 1.PracticeDao.xml
          • 2.PracticeDetailDao.xml
        • 5.entity
          • 1.po
            • 1.PracticeDetailPO.java
            • 2.PracticePO.java
    • 3.测试
        • 1.不携带practiceId来获取练习题
          • 1.响应
          • 2.此时会新增一个练习
        • 2.携带practiceId获取练习题
          • 1.响应
          • 2.此时会更新这个练习的提交时间
          • 3.并且会获取每个题目的练习详情,来判断是否作答,但是为空,所以isAnswer都是0

1.sun-club-practice-api

1.enums
1.CompleteStatusEnum.java
package com.sunxiansheng.practice.api.enums;

public enum CompleteStatusEnum {

    /**
     * 未完成
     */
    NO_COMPLETE(0, "未完成"),

    /**
     * 已完成
     */
    COMPLETE(1, "已完成");

    final private int code;
    final private String desc;

    CompleteStatusEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public int getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}
2.req
1.GetPracticeSubjectsReq.java
package com.sunxiansheng.practice.api.req;

import lombok.Data;

import java.io.Serializable;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/28 13:03
 * @Version 1.0
 */
@Data
public class GetPracticeSubjectsReq implements Serializable {

    /**
     * 套题id
     */
    private Long setId;

    /**
     * 练习id
     */
    private Long practiceId;

}
3.vo
1.PracticeSubjectListVO.java
package com.sunxiansheng.practice.api.vo;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class PracticeSubjectListVO implements Serializable {

    /**
     * 练习标题(套卷名字)
     */
    private String title;

    /**
     * 题目列表
     */
    private List<PracticeSubjectDetailVO> subjectList;

    /**
     * 练习id
     */
    private Long practiceId;

    /**
     * 用时
     */
    private String timeUse;


}

2.sun-club-practice-server

1.PracticeSetController.java
/**
 * 获取题目详情
 */
@PostMapping(value = "/getPracticeSubject")
public Result<PracticeSubjectVO> getPracticeSubject(@RequestBody GetPracticeSubjectReq req) {
    if (log.isInfoEnabled()) {
        log.info("获取练习题详情入参{}", JSON.toJSONString(req));
    }
    try {
        Preconditions.checkArgument(!Objects.isNull(req), "参数不能为空!");
        Preconditions.checkArgument(!Objects.isNull(req.getSubjectId()), "题目id不能为空!");
        Preconditions.checkArgument(!Objects.isNull(req.getSubjectType()), "题目类型不能为空!");
        PracticeSubjectDTO dto = new PracticeSubjectDTO();
        dto.setSubjectId(req.getSubjectId());
        dto.setSubjectType(req.getSubjectType());
        PracticeSubjectVO vo = practiceSetService.getPracticeSubject(dto);
        if (log.isInfoEnabled()) {
            log.info("获取练习题目详情出参{}", JSON.toJSONString(vo));
        }
        return Result.ok(vo);
    } 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.service
1.PracticeSetServiceImpl.java
    /**
     *
     * @param req setId practiceId
     * @return
     */
    public PracticeSubjectListVO getSubjects(GetPracticeSubjectsReq req) {
        // 获取req中的setId
        Long setId = req.getSetId();
        // 构建一个返回的vo
        PracticeSubjectListVO vo = new PracticeSubjectListVO();
        // 根据setId查询出所有题目的id和type
        List<PracticeSetDetailPO> practiceSetDetailPOS = practiceSetDetailDao.selectBySetId(setId);
        // 判空
        if (CollectionUtils.isEmpty(practiceSetDetailPOS)) {
            return vo;
        }
        // 从请求中获取练习id,以此来判断用户是否练习过
        Long practiceId = req.getPracticeId();
        // 获取loginId
        String loginId = LoginUtil.getLoginId();

        // 组装List<PracticeSubjectDetailVO>
        List<PracticeSubjectDetailVO> practiceSubjectDetailVOList = practiceSetDetailPOS.stream().map(
                // 练习套卷的subjectId和subjectTpye
                practiceSetDetailPO -> {
                    // 将每一个题目的subjectId和subjectTpye映射到PracticeSubjectDetailVO
                    PracticeSubjectDetailVO practiceSubjectDetailVO = new PracticeSubjectDetailVO();
                    practiceSubjectDetailVO.setSubjectId(practiceSetDetailPO.getSubjectId());
                    practiceSubjectDetailVO.setSubjectType(practiceSetDetailPO.getSubjectType());

                    // 当练题id不为空的时候,根据练习id是否为空来设置每个题目是否已经作答
                    if (Objects.nonNull(practiceId)) {
                        // 查询出当前题目的详情
                        PracticeDetailPO practiceDetailPO = practiceDetailDao.selectDetail(practiceId, practiceSetDetailPO.getSubjectId(), loginId);
                        // 根据这条题目的答案内容是否为空,做出不同决策
                        if (Objects.nonNull(practiceDetailPO) && StringUtils.isNotBlank(practiceDetailPO.getAnswerContent())) {
                            // 答案如果不为空,则设置这个题目为已回答
                            practiceSubjectDetailVO.setIsAnswer(1);
                        } else {
                            // 未回答
                            practiceSubjectDetailVO.setIsAnswer(0);
                        }
                    }
                    return practiceSubjectDetailVO;
                }

        ).collect(Collectors.toList());
        // 查询套卷名字
        PracticeSetPO practiceSetPO = practiceSetDao.selectById(setId);
        // 组装PracticeSubjectListVO
        vo.setTitle(practiceSetPO.getSetName());
        vo.setSubjectList(practiceSubjectDetailVOList);

        // 如果练习id为空,添加逻辑
        if (Objects.isNull(practiceId)) {
            // 根据套卷id新增一个练习
            Long newPracticeId = insertUnCompletePractice(setId);
            // 返回
            vo.setPracticeId(newPracticeId);
        } else {
            // 更新获取练习的时间
            updateUnCompletePractice(practiceId);
            PracticePO practicePO = practiceDao.selectById(practiceId);
            // 返回用时和练习id
            vo.setTimeUse(practicePO.getTimeUse());
            vo.setPracticeId(practiceId);
        }
        return vo;
    }

    /**
     * 新增练习并返回id
     * @param practiceSetId
     * @return
     */
    private Long insertUnCompletePractice(Long practiceSetId) {
        PracticePO practicePO = new PracticePO();
        practicePO.setSetId(practiceSetId);
        practicePO.setCompleteStatus(CompleteStatusEnum.NO_COMPLETE.getCode());
        practicePO.setTimeUse("00:00:00");
        practicePO.setSubmitTime(new Date());
        practicePO.setCorrectRate(new BigDecimal("0.00"));
        practicePO.setIsDeleted(IsDeleteFlagEnum.UN_DELETED.getCode());
        practicePO.setCreatedBy(LoginUtil.getLoginId());
        practicePO.setCreatedTime(new Date());
        practiceDao.insert(practicePO);
        return practicePO.getId();
    }

    /**
     * 更新获取练习的时间(重新计时)
     * @param practiceId
     */
    private void updateUnCompletePractice(Long practiceId) {
        PracticePO practicePO = new PracticePO();
        practicePO.setId(practiceId);
        practicePO.setSubmitTime(new Date());
        practiceDao.update(practicePO);
    }

3.dao
1.PracticeDao.java
package com.sunxiansheng.practice.server.dao;

import com.sunxiansheng.practice.server.entity.po.PracticePO;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/28 16:40
 * @Version 1.0
 */
public interface PracticeDao {
    /**
     * 根据id查询练习信息
     * @param practiceId
     * @return
     */
    PracticePO selectById(Long practiceId);

    /**
     * 插入练习信息
     * @param practicePO
     */
    void insert(PracticePO practicePO);

    /**
     * 更新练习信息
     * @param practicePO
     */
    void update(PracticePO practicePO);
}

2.PracticeDetailDao.java
package com.sunxiansheng.practice.server.dao;

import com.sunxiansheng.practice.server.entity.po.PracticeDetailPO;
import org.apache.ibatis.annotations.Param;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/28 16:07
 * @Version 1.0
 */
public interface PracticeDetailDao {
    /**
     * 根据练习的id和题目id还有创建人来查询练习细节
     * @param practiceId
     * @param subjectId
     * @param loginId
     * @return
     */
    PracticeDetailPO selectDetail(@Param("practiceId") Long practiceId, @Param("subjectId") Long subjectId, @Param("loginId") String loginId);
}

4.mapper
1.PracticeDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sunxiansheng.practice.server.dao.PracticeDao">

    <select id="selectById" resultType="com.sunxiansheng.practice.server.entity.po.PracticePO">
        select set_id as setId, time_use as timeUse, submit_time as submitTime, correct_rate as correctRate
        from practice_info
        where id = #{id}
          and is_deleted = 0
    </select>

    <insert id="insert">
        <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO practice_info(set_id, complete_status, time_use, submit_time, correct_rate, is_deleted,
                                  created_by, created_time)
        values (#{setId,jdbcType=BIGINT},
                #{completeStatus,jdbcType=INTEGER},
                #{timeUse,jdbcType=VARCHAR},
                #{submitTime,jdbcType=TIMESTAMP},
                #{correctRate,jdbcType=VARCHAR},
                #{isDeleted,jdbcType=INTEGER},
                #{createdBy,jdbcType=VARCHAR},
                #{createdTime,jdbcType=TIMESTAMP})
    </insert>

    <update id="update">
        update practice_info
        <set>
            <if test="submitTime != null">
                submit_time = #{submitTime},
            </if>
            <if test="timeUse != null">
                time_use = #{timeUse},
            </if>
            <if test="completeStatus != null">
                complete_status = #{completeStatus},
            </if>
            <if test="correctRate != null">
                correct_rate = #{correctRate},
            </if>
        </set>
        where id = #{id,jdbcType=BIGINT}
    </update>
</mapper>
2.PracticeDetailDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sunxiansheng.practice.server.dao.PracticeDetailDao">
    
    <select id="selectDetail" resultType="com.sunxiansheng.practice.server.entity.po.PracticeDetailPO">
        select id,
               subject_id     as subjectId,
               subject_type   as subjectType,
               answer_status  as answerStatus,
               answer_content as answerContent
        from practice_detail
        where is_deleted = 0
          and practice_id = #{practiceId}
          and subject_id = #{subjectId}
          and created_by = #{loginId}
    </select>
</mapper>
5.entity
1.po
1.PracticeDetailPO.java
package com.sunxiansheng.practice.server.entity.po;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
public class PracticeDetailPO implements Serializable {

    /**
     * 主键
     */
    private Long id;

    /**
     * 练题id
     */
    private Long practiceId;

    /**
     * 题目id
     */
    private Long subjectId;

    /**
     * 题目类型
     */
    private Integer subjectType;

    /**
     * 是否正确 1正确 0错误
     */
    private Integer answerStatus;

    /**
     * 答案内容
     */
    private String answerContent;

    /**
     * 创建人
     */
    private String createdBy;

    /**
     * 创建时间
     */
    private Date createdTime;

    /**
     * 更新人
     */
    private String updateBy;

    private Integer isDeleted;

    /**
     * 更新时间
     */
    private Date updateTime;

}
2.PracticePO.java
package com.sunxiansheng.practice.server.entity.po;

import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

@Data
public class PracticePO implements Serializable {

    /**
     * 主键
     */
    private Long id;

    /**
     * 套题id
     */
    private Long setId;

    /**
     * 完成情况 1完成 0未完成
     */
    private Integer completeStatus;

    /**
     * 所用时间
     */
    private String timeUse;

    /**
     * 交卷时间
     */
    private Date submitTime;

    /**
     * 正确率
     */
    private BigDecimal correctRate;

    /**
     * 创建人
     */
    private String createdBy;

    /**
     * 创建时间
     */
    private Date createdTime;

    /**
     * 更新人
     */
    private String updateBy;

    private Integer isDeleted;

    /**
     * 更新时间
     */
    private Date updateTime;

}

3.测试

1.不携带practiceId来获取练习题
1.响应

image-20240628173622228

2.此时会新增一个练习

image-20240628173948591

2.携带practiceId获取练习题
1.响应

image-20240628174136030

2.此时会更新这个练习的提交时间

image-20240628174259305

3.并且会获取每个题目的练习详情,来判断是否作答,但是为空,所以isAnswer都是0

image-20240628174532677

image-20240628174511314

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HAL STM32 SG90舵机驱动控制

HAL STM32 SG90舵机驱动控制 &#x1f516;测试对象&#xff1a;STM32F103SG90舵机 &#x1f33c;功能实现&#xff1a;通过串口指令&#xff0c;控制SG90舵机转动到指定角度。 ✨在实际硬件舵机驱动过程中&#xff0c;使用SG90普通舵机空载运转情况下&#xff0c;电流在180mA…

验证集的loss比训练集大得多Val Loss is too large

这个跟数据集有关&#xff0c;不过可已通过clip减缓。 解决方法 nn.utils.clip_grad_norm_(self.Model.parameters(), max_norm5)

AtCoder Regular Contest 182 A~D

A.Chmax Rush!&#xff08;枚举&#xff09; 题意&#xff1a; 有一个长度为 N N N的整数序列 S S S。最初&#xff0c; S S S的所有元素都是 0 0 0。 同时给你两个长度为 Q Q Q的整数序列&#xff1a; P ( P 1 , P 2 , … , P Q ) P(P_1,P_2,\dots,P_Q) P(P1​,P2​,…,PQ…

AI产品经理修炼指南:从青铜到王者的逆袭之路

一、AI通识 1.1 AI产业结构 AI发展至今大致按照在产业结构上的分工不同产生了三种类型的公司&#xff0c;我们在转型时最好要先明确自己的优势及兴趣&#xff0c;来判断自己适合着眼于哪个层面的工作&#xff0c;从而进行针对性的学习和提升。 &#xff08;1&#xff09;行业…

Apache Flink细粒度资源管理原理

粗粒度资源管理 Apache Flink 1.1.4版本之前使用的是粗粒度的资源管理&#xff0c;即每个算子Slot Request所需要的资源都是未知的&#xff0c;Flink内部用UNKNOWN的特殊值来表示&#xff0c;这个值可以和任意资源规则的物理Slot匹配&#xff0c;站在Taskmanager的角度&#x…

打卡学习Python爬虫第二天|Web请求过程刨析

一、服务器渲染 服务器端渲染&#xff08;Server-Side Rendering&#xff0c;简称SSR&#xff09;是一种网页渲染技术。在这种技术中&#xff0c;服务器在接收到客户端的请求后&#xff0c;会生成页面的初始HTML内容&#xff0c;并将其发送给客户端。客户端浏览器接收到这些HT…

什么是BKP(备份寄存器)

一&#xff0c;什么是BKP 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或系统复位或电源复位时&#xff0c;他们也…

数据结构(6.2_2)——领接表法

领接表法&#xff08;顺序存储链式存储&#xff09; 代码&#xff1a; #define MaxVertextNum 10 //边(弧) typedef struct ArcNode {int adjvex;//边/弧指向哪个结点struct ArcNode* next;//指向下一条弧的指针//InfoType info;//边权值 }ArcNode; //顶点 typedef struct VNo…

小阿轩yx-Docker Swarm 管理

小阿轩yx-Docker Swarm 管理 容器编排部署工具 除 Google 推出的 Kubernetes 之外&#xff0c;还有 Docker 发布的 Swarm 与 Mesos 推出的 Marathon 案例一 Docker Swarm 群集部署 Docker 自诞生以来&#xff0c;容器特性以及镜像特性给 DevOps 爱好者带来很多方便很长时间…

基本数据统计分析上|集中位置统计量|分散程度统计量|分布形状统计量|常见概率分布

数据统计分析 现实生活中的许多数据都是随机产生的&#xff0c;如考试分数&#xff0c;月降雨量&#xff0c;灯泡寿命等。从统计角度来看&#xff0c;这些数据其实都是符合某种分布的&#xff0c;这种分布就是统计规律性 在数学建模过程中经常与数据打交道&#xff0c;需要进行…

【鸟哥的Linux私房菜(七)之文件IO】

文章目录 C语言文件IOC语言文件接口汇总什么是当前路径&#xff1f;默认打开的三个流 系统文件I/Oopenopen的第一个参数open的第二个参数open的第三个参数open的返回值 closewriteread 文件描述符fd文件描述符的分配规则重定向重定向的原理dup2添加重定向功能到minishell FILEF…

微乐校园pf

TOC springboot451微乐校园pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这…

vue3中引入插件报ts报错Could not find a declaration file for module

引入第三方组件时&#xff0c;下载了组件还是报ts错误Could not find a declaration file for module 解决办法 1. 下载这个插件的ts库&#xff08;有的没有ts库就用下面这种方式&#xff09; 2. 在src下创建一个shims-vue.d.ts文件&#xff08;简单直接&#xff0c;我用的这种…

DNS域名解析服务理论详解(域名结构、递归查询和迭代查询、CDN)

文章目录 DNS域名解析服务1.DNS系统的概念2.DNS系统的主要作用3.DNS的分布式数据结构和域名的结构4.DNS服务器类型4.1三种类型4.2分布式数据库4.3名词解释 5.CDN技术5.1CDN的基本原理5.2CDN的主要功能 6.DNS查询类型及原理6.1查询方式6.2查询原理过程6.3本地主机的DNS映射文件 …

基于Hadoop的物品租赁系统的设计与实现 9349a--论文

TOC springboot344基于Hadoop的物品租赁系统的设计与实现 9349a--论文 绪 论 1.1开发背景 随着网络的飞速发展&#xff0c;网络技术的应用越来越广泛&#xff0c;而信息技术的飞速发展&#xff0c;计算机管理系统的优势也逐渐体现出来&#xff0c;大量的计算机电子信息已经…

Python | 数据处理中常用的数据分布介绍

数据分布是指数据在统计图中的形状和特征&#xff0c;即数据取值的统计规律。在统计学中&#xff0c;数据分布是描述数据集中数值分布情况和规律的重要工具。通过数据分布&#xff0c;可以了解数据的集中程度、分散程度、偏态和峰态等信息&#xff0c;进而对数据进行合理的分析…

95后医疗行业女性转型记:如何成功踏入人工智能项目管理领域

分享目录 一、自我介绍&#xff0c;给大家分享一下拿到offer的心情吧 二、在整个求职转型陪跑营里&#xff0c;你收获最大的三个点是什么&#xff1f; 三、求职转行过程中&#xff0c;你遇到了哪些困难&#xff1f;七芊老师和强哥是怎么帮助你的&#xff1f;你是怎么走过来的…

Bellman_ford算法

使用Dijikstra算法求最短路问题&#xff0c;要求图中不能存在负长度的边&#xff0c;也就是负权边 为什么Dijikstra算法不能用来求含有负权边的图中的最短路问题&#xff1f; Bellman_ford算法 mention&#xff08;1&#xff09;&#xff1a; 没有挑选路径长度距离编号 1 结…

[Datawhale AI夏令营 2024 第四期] 从零入门大模型微调之旅的总结

0. 引言&#xff1a; 在人工智能飞速发展的今天&#xff0c;掌握大模型微调技能对于从事 AI 研究和开发的专业人士来说至关重要。因此&#xff0c;Datawhale AI夏令营 2024 第四期] 从零入门大模型微调之旅&#xff1b;顺便参加了星火大模型驱动阅读理解题库构建挑战赛。 1. …

XSS--DOM破坏案例与靶场

靶场连接https://xss.pwnfunction.com/challenges/ 目录 Ma SPaghet! Jeff Ugandan Knuckles Ricardo Milos Ah Thats Hawt Ligma Mafia Ok,Boomer Ma SPaghet! <!-- Challenge --> <h2 id"spaghet"></h2> <script>spaghet.innerHT…