查询用户答题

master
caolin 2 days ago
parent a2e7ae3ce3
commit 36ef6e2bb5
  1. 13
      src/main/java/com/wrj/driver/server/controller/WrjQuestionPracticeController.java
  2. 3
      src/main/java/com/wrj/driver/server/controller/WrjUserCollectQuestionController.java
  3. 35
      src/main/java/com/wrj/driver/server/dto/PageParam.java
  4. 28
      src/main/java/com/wrj/driver/server/dto/QuestionPracticeAddDto.java
  5. 40
      src/main/java/com/wrj/driver/server/dto/QuestionPracticeQueryDto.java
  6. 6
      src/main/java/com/wrj/driver/server/mapper/WrjQuestionPracticeMapper.java
  7. 7
      src/main/java/com/wrj/driver/server/service/IWrjQuestionPracticeService.java
  8. 15
      src/main/java/com/wrj/driver/server/service/impl/WrjQuestionPracticeServiceImpl.java
  9. 152
      src/main/java/com/wrj/driver/server/vo/QuestionPracticeVo.java
  10. 52
      src/main/resources/mapper/WrjQuestionPracticeMapper.xml

@ -1,18 +1,18 @@
package com.wrj.driver.server.controller; package com.wrj.driver.server.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wrj.driver.server.dto.QuestionPracticeAddDto; import com.wrj.driver.server.dto.QuestionPracticeAddDto;
import com.wrj.driver.server.dto.QuestionQueryDto; import com.wrj.driver.server.dto.QuestionPracticeQueryDto;
import com.wrj.driver.server.response.BaseResponse; import com.wrj.driver.server.response.BaseResponse;
import com.wrj.driver.server.service.IWrjQuestionPracticeService; import com.wrj.driver.server.service.IWrjQuestionPracticeService;
import com.wrj.driver.server.util.SecurityUtil; import com.wrj.driver.server.util.SecurityUtil;
import com.wrj.driver.server.vo.QuestionPracticeVo;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
import javax.validation.Valid; import javax.validation.Valid;
/** /**
@ -50,11 +50,10 @@ public class WrjQuestionPracticeController {
@ApiOperation("查询练习记录") @ApiOperation("查询练习记录")
@PostMapping("/query") @PostMapping("/query")
public BaseResponse query(@RequestBody QuestionPracticeAddDto addDto) { public BaseResponse<IPage<QuestionPracticeVo>> query(@RequestBody QuestionPracticeQueryDto queryDto) {
addDto.setUserId(SecurityUtil.getUserId()); log.info("查询练习记录======>queryDto:{}", queryDto);
log.info("答题练习======>addDto:{}", addDto); return BaseResponse.success(practiceService.query(queryDto));
return BaseResponse.success(practiceService.insertQuestionPractice(addDto));
} }
} }

@ -1,7 +1,6 @@
package com.wrj.driver.server.controller; package com.wrj.driver.server.controller;
import com.wrj.driver.server.dto.QuestionPracticeAddDto;
import com.wrj.driver.server.response.BaseResponse; import com.wrj.driver.server.response.BaseResponse;
import com.wrj.driver.server.service.IWrjUserCollectQuestionService; import com.wrj.driver.server.service.IWrjUserCollectQuestionService;
import com.wrj.driver.server.util.SecurityUtil; import com.wrj.driver.server.util.SecurityUtil;
@ -10,8 +9,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
/** /**
* <p> * <p>
* 用户收藏表 前端控制器 * 用户收藏表 前端控制器

@ -0,0 +1,35 @@
package com.wrj.driver.server.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@ApiModel("分页查询基础参数")
public class PageParam implements Serializable {
private static final Integer PAGE_NO = 1;
private static final Integer PAGE_SIZE = 10;
/**
* 每页条数 - 不分页
*
* 例如说导出接口可以设置 {@link #pageSize} -1 不分页查询所有数据
*/
public static final Integer PAGE_SIZE_NONE = -1;
@ApiModelProperty(value = "页码,从 1 开始",required = true)
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小值为 1")
private Integer pageNo = PAGE_NO;
@ApiModelProperty(value = "每页条数",required = true)
@NotNull(message = "每页条数不能为空")
@Min(value = 1, message = "每页条数最小值为 1")
private Integer pageSize = PAGE_SIZE;
}

@ -9,7 +9,6 @@ import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/** /**
* <p> * <p>
@ -31,29 +30,32 @@ public class QuestionPracticeAddDto implements Serializable {
* 题目标识 * 题目标识
*/ */
@ApiModelProperty(value = "题目标识",required = true) @ApiModelProperty(value = "题目标识",required = true)
@NotNull(message = "题目标识不能为空")
private Long questionId; private Long questionId;
/** /**
* 用户手机号 * 用户标识
*/ */
@ApiModelProperty("用户手机号") @ApiModelProperty("用户标识")
private String phone; private Long userId;
/**
* 答题结果
*/
@ApiModelProperty("答题结果")
private String answerResult;
/** /**
* 答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 * 答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试
*/ */
@ApiModelProperty(value = "答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 5-错题训练 6-收藏训练",required = true) @ApiModelProperty(value = "答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 5-错题训练 6-收藏训练",required = true)
@NotBlank(message = "答题类型不能为空")
private String practiceType; private String practiceType;
/** /**
* 答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 * 用户选择的答案
*/ */
@ApiModelProperty(value = "答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 5-错题训练 6-收藏训练",required = true) @ApiModelProperty("用户选择的答案")
private List<String> practiceTypeList; @NotBlank(message = "答案不能为空")
private String answer;
/**
* 业务标识顺序练习对应顺序练习批次模拟考试对应考试test_id
*/
@ApiModelProperty("业务标识,顺序练习对应顺序练习批次,模拟考试对应考试test_id")
private Long businessCode;
} }

@ -6,9 +6,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/** /**
* <p> * <p>
@ -21,8 +20,8 @@ import java.io.Serializable;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@Accessors(chain = true) @Accessors(chain = true)
@ApiModel("答题练习入参") @ApiModel("答题练习查询入参")
public class QuestionPracticeQueryDto implements Serializable { public class QuestionPracticeQueryDto extends PageParam implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -30,32 +29,41 @@ public class QuestionPracticeQueryDto implements Serializable {
* 题目标识 * 题目标识
*/ */
@ApiModelProperty(value = "题目标识",required = true) @ApiModelProperty(value = "题目标识",required = true)
@NotNull(message = "题目标识不能为空")
private Long questionId; private Long questionId;
/** /**
* 用户标识 * 题目
*/ */
@ApiModelProperty("用户标识") @ApiModelProperty(value = "题目")
private Long userId; private String question;
/** /**
* 答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 * 学员手机号或姓名
*/ */
@ApiModelProperty(value = "答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 5-错题训练 6-收藏训练",required = true) @ApiModelProperty("学员手机号或姓名")
@NotBlank(message = "答题类型不能为空") private String userNameOrPhone;
private String practiceType;
/** /**
* 用户选择的答案 * 用户选择的答案
*/ */
@ApiModelProperty("用户选择的答案") @ApiModelProperty("用户选择的答案")
@NotBlank(message = "答案不能为空")
private String answer; private String answer;
/** /**
* 业务标识顺序练习对应顺序练习批次模拟考试对应考试test_id * 答题结果 1-正确 2-错误
*/
@ApiModelProperty("答题结果 1-正确 2-错误")
private String answerResult;
/**
* 答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试
*/
@ApiModelProperty(value = "答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 5-错题训练 6-收藏训练",required = true)
private String practiceType;
/**
* 答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试
*/ */
@ApiModelProperty("业务标识,顺序练习对应顺序练习批次,模拟考试对应考试test_id") @ApiModelProperty(value = "答题类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 5-错题训练 6-收藏训练",required = true)
private Long businessCode; private List<String> practiceTypeList;
} }

@ -1,7 +1,11 @@
package com.wrj.driver.server.mapper; package com.wrj.driver.server.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wrj.driver.server.dto.QuestionPracticeQueryDto;
import com.wrj.driver.server.entity.WrjQuestionPractice; import com.wrj.driver.server.entity.WrjQuestionPractice;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wrj.driver.server.vo.QuestionPracticeVo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -18,4 +22,6 @@ import org.apache.ibatis.annotations.Param;
public interface WrjQuestionPracticeMapper extends BaseMapper<WrjQuestionPractice> { public interface WrjQuestionPracticeMapper extends BaseMapper<WrjQuestionPractice> {
int clearPracticeRecord(@Param("userId") Long userId, @Param("practiceType") String practiceType); int clearPracticeRecord(@Param("userId") Long userId, @Param("practiceType") String practiceType);
IPage<QuestionPracticeVo> queryQuestionPracticePage(@Param("page") Page<QuestionPracticeVo> page, @Param("queryDto") QuestionPracticeQueryDto queryDto);
} }

@ -1,8 +1,13 @@
package com.wrj.driver.server.service; package com.wrj.driver.server.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wrj.driver.server.dto.QuestionPracticeAddDto; import com.wrj.driver.server.dto.QuestionPracticeAddDto;
import com.wrj.driver.server.dto.QuestionPracticeQueryDto;
import com.wrj.driver.server.entity.WrjQuestionPractice; import com.wrj.driver.server.entity.WrjQuestionPractice;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.wrj.driver.server.vo.QuestionPracticeVo;
import java.util.List;
/** /**
* <p> * <p>
@ -17,4 +22,6 @@ public interface IWrjQuestionPracticeService extends IService<WrjQuestionPractic
Boolean insertQuestionPractice(QuestionPracticeAddDto addDto); Boolean insertQuestionPractice(QuestionPracticeAddDto addDto);
Boolean clear(Long userId, String practiceType); Boolean clear(Long userId, String practiceType);
IPage<QuestionPracticeVo> query(QuestionPracticeQueryDto queryDto);
} }

@ -2,8 +2,11 @@ package com.wrj.driver.server.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wrj.driver.server.constant.Constants; import com.wrj.driver.server.constant.Constants;
import com.wrj.driver.server.dto.QuestionPracticeAddDto; import com.wrj.driver.server.dto.QuestionPracticeAddDto;
import com.wrj.driver.server.dto.QuestionPracticeQueryDto;
import com.wrj.driver.server.entity.WrjQuestion; import com.wrj.driver.server.entity.WrjQuestion;
import com.wrj.driver.server.entity.WrjQuestionPractice; import com.wrj.driver.server.entity.WrjQuestionPractice;
import com.wrj.driver.server.entity.WrjQuestionPracticeTotal; import com.wrj.driver.server.entity.WrjQuestionPracticeTotal;
@ -15,11 +18,13 @@ import com.wrj.driver.server.mapper.WrjQuestionPracticeTotalMapper;
import com.wrj.driver.server.mapper.WrjUserErrorQuestionMapper; import com.wrj.driver.server.mapper.WrjUserErrorQuestionMapper;
import com.wrj.driver.server.service.IWrjQuestionPracticeService; import com.wrj.driver.server.service.IWrjQuestionPracticeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wrj.driver.server.vo.QuestionPracticeVo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
/** /**
* <p> * <p>
@ -101,4 +106,14 @@ public class WrjQuestionPracticeServiceImpl extends ServiceImpl<WrjQuestionPract
return Boolean.TRUE; return Boolean.TRUE;
} }
@Override
public IPage<QuestionPracticeVo> query(QuestionPracticeQueryDto queryDto) {
Page<QuestionPracticeVo> page = new Page<>(queryDto.getPageNo(), queryDto.getPageSize());
IPage<QuestionPracticeVo> pageResult = practiceMapper.queryQuestionPracticePage(page, queryDto);
return pageResult;
}
} }

@ -0,0 +1,152 @@
package com.wrj.driver.server.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 用户答题练习
* </p>
*
* @author Automated procedures
* @since 2025-06-29
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel("用户答题练习出参")
public class QuestionPracticeVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 练习标识
*/
@ApiModelProperty("练习标识")
private Long practiceId;
/**
* 题目标识
*/
@ApiModelProperty("题目标识")
private Long questionId;
/**
* 题目内容
*/
@ApiModelProperty("题目内容")
private String question;
/**
* 选项A
*/
@ApiModelProperty("选项A")
private String chooseA;
/**
* 选项B
*/
@ApiModelProperty("选项B")
private String chooseB;
/**
* 选项C
*/
@ApiModelProperty("选项C")
private String chooseC;
/**
* 选项D
*/
@ApiModelProperty("选项D")
private String chooseD;
/**
* 选项E
*/
@ApiModelProperty("选项E")
private String chooseE;
/**
* 选项F
*/
@ApiModelProperty("选项F")
private String chooseF;
/**
* 选项G
*/
@ApiModelProperty("选项G")
private String chooseG;
/**
* 正确答案
*/
@ApiModelProperty("正确答案")
private String trueAnswer;
/**
* 题目图片url
*/
@ApiModelProperty("题目图片url")
private String imageUrl;
/**
* 用户标识
*/
@ApiModelProperty("用户标识")
private Long userId;
/**
* 用户名称
*/
@ApiModelProperty("用户名称")
private String userName;
/**
* 用户手机号
*/
@ApiModelProperty("用户手机号")
private String phone;
/**
* 练习类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 5-错题训练 6-收藏训练
*/
@ApiModelProperty("练习类型 1-顺序练习 2-章节练习 3-随机练习 4-模拟考试 5-错题训练 6-收藏训练")
private String practiceType;
/**
* 用户选择的答案
*/
@ApiModelProperty("用户选择的答案")
private String answer;
/**
* 答题结果 1-正确 2-错误
*/
@ApiModelProperty("答题结果 1-正确 2-错误")
private String answerResult;
/**
* 业务标识顺序练习对应顺序练习批次模拟考试对应考试test_id
*/
@ApiModelProperty("业务标识,顺序练习对应顺序练习批次,模拟考试对应考试test_id")
private Long businessCode;
/**
* 练习时间
*/
@ApiModelProperty("答题时间")
private String practiceTime;
}

@ -6,6 +6,56 @@
update update
wrj_question_practice wrj_question_practice
set is_clear = 1 set is_clear = 1
where user_id = #{userId} and practice_type = #{practiceType} where user_id = #{userId} and practice_type = #{practiceType} and is_clear = 0
</update> </update>
<select id="queryQuestionPracticePage" resultType="com.wrj.driver.server.vo.QuestionPracticeVo">
select
wqp.practice_id,
wqp.question_id,
wqp.user_id,
wqp.practice_type,
wqp.answer,
wqp.answer_result,
DATE_FORMAT(wqp.practice_time, '%Y-%m-%d %H:%i:%s') as practiceTime,
su.user_name,
su.phone,
wq.question,
wq.image_url,
wq.choose_a,
wq.choose_b,
wq.choose_c,
wq.choose_d,
wq.choose_e,
wq.choose_f,
wq.true_answer
from wrj_question_practice wqp
left join wrj_question wq on wqp.question_id = wq.question_id
left join sys_user su on su.user_id = wqp.user_id
<where>
<if test="queryDto.questionId !=null">
and wqp.question_id = #{queryDto.questionId}
</if>
<if test="queryDto.practiceType !=null and queryDto.practiceType !=''">
and wqp.practice_type = #{queryDto.practiceType}
</if>
<if test="queryDto.practiceTypeList !=null and queryDto.practiceTypeList.size() > 0 ">
and wqp.practice_type in
<foreach collection="queryDto.practiceTypeList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="queryDto.question !=null and queryDto.question !=''">
and wq.question like concat('%' , #{queryDto.question} , '%')
</if>
<if test="queryDto.userNameOrPhone !=null and queryDto.userNameOrPhone !=''">
and (su.user_name like concat('%' , #{queryDto.userNameOrPhone} , '%')
or su.phone like concat('%' , #{queryDto.userNameOrPhone})
</if>
<if test="queryDto.answerResult !=null and queryDto.answerResult !=''">
and wqp.answer_result = #{queryDto.answerResult}
</if>
</where>
group by wqp.practice_id desc
</select>
</mapper> </mapper>

Loading…
Cancel
Save