首页 > 其他分享 >增加练习(修改获取练习的基本信息接口)

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

时间:2024-08-18 10:54:27浏览次数:14  
标签:java 练习 接口 practiceId 获取 private practicePO id

文章目录

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

标签:java,练习,接口,practiceId,获取,private,practicePO,id
From: https://blog.csdn.net/m0_64637029/article/details/141296901

相关文章

  • shell_获取当前最新的sh脚本并执行 shell脚本 配合curl使用
    获取最新的shell脚本并执行#!/bin/bash#获取当前目录current_dir=$(pwd)#获取当前脚本的绝对路径script_path=$(readlink-f"$0")#使用find查找以temp开头且以.sh结尾的文件,并按修改时间排序latest_file=$(find"$current_dir"-maxdepth1-name"*.sh"-print0|......
  • 【数据结构】详细剖析链表,带你实现单链表,双向链表,附链表编程练习题
    目录一.链表1.链表的概念及结构2.单链表的实现2.1单链表节点结构2.2动态申请一个节点2.3单链表打印2.4单链表尾插2.5单链表头插2.6单链表尾删2.7单链表头删2.8单链表查找 2.9单链表在pos后一位插入x2.10单链表删除pos后一位的值2.11单链表销毁 ......
  • 闲鱼卖2000元的带腾讯备案的 gaapqcloud.com.cn 域名低成本获取方法!
    最近在闲鱼看到有人卖域名,声称是腾讯的备案,还卖1000多元!逆天了!这个信息差是真能割韭菜,我一查,这不就是腾讯云的全球应用加速域名吗?????这样也能赚到钱??获取方法进入腾讯云全球应用加速进行开通就可以了,当然确实是有门槛的,就是你得是企业认证的腾讯云账号才可以,然后开通这个,账户得有......
  • C++-练习-20
    题目:WilliamWingate从事披萨饼分析服务。对于每个披萨饼,它都需要记录下列信息:披萨饼从事公司的名称,可以有多个单词组成披萨饼的直径披萨饼的重量。请设计一个能够存储这些信息的结构,并编写一个使用这种结构变量的程序。程序将请求用户输入上述信息,然后显示这些信息。请......
  • vue使用高德获取当前地区天气
    1、收件箱|高德控制台(amap.com) 首先打开高德开放平台注册一下2、创建一个应用获取到key后面获取天气的时候 请求接口的时候会用到key 2.1.1创建应用的时候注意类型选成天气   2.1.2创建完成之后就点添加key然后选择web服务就行3、可以调取天气接口天......
  • Android开发 - 使用自定义接口在新窗口中传回数据
    在Android开发中,有时候我们需要在新打开的窗口中传递数据回来。例如:在新打开的DialogFragment窗口传递数据回MainActivity启动窗口代码举例首先在MainActivity中定义实例化一个DialogFragment窗口//MainActivity.java//点击按钮打开一个DialogFragment窗口......
  • WPF 前台触发器实时获取当前时间
    1.引入命名空间xmlns:sys="clr-namespace:System;assembly=System.Runtime"2.显示时间代码<StackPanelOrientation="Horizontal"Grid.Row="1"VerticalAlignment="Center"HorizontalAlignment="Left"><TextBloc......
  • 练习:python条件语句、循环语句和函数的综合运用
    需求描述:期望输出效果:练习成果:#简单的银行业务流程many=50000defmain_menu():print("----------主菜单----------"f"\n{name}您好,欢迎来到ATM,请选择操作:""\n查询余额\t[输入1]""\n存款\t\t[输入2]""\n取款\t\t[输入3]&qu......
  • Linux c程序中获取shell脚本输出(如获取system命令输出)
    在工作中遇到一个小问题,就是想获取函数system()执行之后打印的字符串信息。这个功能还是很实用的,能为我们节省很多开发时间,特地整理了一下相关知识点分享给大家。1.使用临时文件1.1使用shell的重定向首先想到的方法就是将命令输出重定向到一个临时文件,在我们的应用程序中读......
  • Linux下如何在程序中获取某个命令执行的结果?【附源码】
    在工作中遇到一个问题,就是想获取某个函数执行之后打印的字符串信息。这个功能应用场景挺多的,特地整理了一下相关知识点分享给大家。1.使用临时文件1)使用shell的重定向将命令输出重定向到一个临时文件,在我们的应用程序中读取这个临时文件,获得外部命令执行结果,代码如下所示:/......