获取视频

dev
caolin 2023-08-21 01:46:03 +08:00
parent 8ab9529030
commit 00d4f131f1
31 changed files with 466 additions and 222 deletions

View File

@ -52,6 +52,13 @@
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>

View File

@ -35,10 +35,10 @@ public class Constants {
//科目四
public static String SUBJECT_FOUR = "4";
//单选
//判断
public static String QUESTION_TYPE_ONE = "1";
//判断
//单选
public static String QUESTION_TYPE_TWO = "2";
//多选题

View File

@ -0,0 +1,36 @@
package com.jwl.driver.server.controller;
import com.jwl.driver.server.dto.ProjectDto;
import com.jwl.driver.server.response.BaseResponse;
import com.jwl.driver.server.service.ITdProjectService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Api(tags = "考试项目")
@RestController
@RequestMapping("/tdTestProject")
@Slf4j
public class TdProjectController {
@Autowired
private ITdProjectService projectService;
@ApiOperation("获取项目列表 (考试项目和基础操作)")
@PostMapping("/queryProjectList")
public BaseResponse list(@RequestBody ProjectDto projectDto) {
log.info("获取考试项目=========》projectDto{}",projectDto);
return BaseResponse.success(projectService.queryProjectList(projectDto));
}
}

View File

@ -2,6 +2,7 @@ package com.jwl.driver.server.controller;
import com.jwl.driver.server.dto.QuestionQueryDto;
import com.jwl.driver.server.dto.TestQueryDto;
import com.jwl.driver.server.dto.TestSubmitDto;
import com.jwl.driver.server.response.BaseResponse;
import com.jwl.driver.server.service.ITdQuestionService;
@ -40,7 +41,10 @@ public class TdQuestionTestController {
return BaseResponse.success(testService.testSubmit(submitDto));
}
@ApiOperation("获取考试统计")
@PostMapping("/testTotal")
public BaseResponse testTotal(@RequestBody @Valid TestQueryDto queryDto) {
log.info("考试统计查询======>queryDto:{}", queryDto);
return BaseResponse.success(testService.testTotal(queryDto));
}
}

View File

@ -1,20 +0,0 @@
package com.jwl.driver.server.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Controller
@RequestMapping("//tdTestProject")
public class TdTestProjectController {
}

View File

@ -1,20 +0,0 @@
package com.jwl.driver.server.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Controller
@RequestMapping("//tdTestProjectVideos")
public class TdTestProjectVideosController {
}

View File

@ -0,0 +1,55 @@
package com.jwl.driver.server.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Data
@Accessors(chain = true)
@ApiModel("考试项目查询入参")
public class ProjectDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
@ApiModelProperty("考试项目")
private Integer projectId;
/**
*
*/
@ApiModelProperty("类型 1:考试项目 2:基础操作")
private String type;
/**
*
*/
@ApiModelProperty("所属科目")
private String subject;
/**
*
*/
@ApiModelProperty("车型标识")
private Integer carTypeId;
/**
* A2:B2
*/
@ApiModelProperty("驾驶类型")
private String driveType;
}

View File

@ -0,0 +1,35 @@
package com.jwl.driver.server.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* @author
* @description
* @create 2023/8/14 21:22
*/
@Data
@Accessors(chain = true)
@ApiModel("成绩查询入参")
public class TestQueryDto {
/**
*
*/
@ApiModelProperty(value = "车型标识",required = true)
@NotNull(message = "车型标识不能为空")
private Integer carTypeId;
/**
*
*/
@ApiModelProperty(value = "科目",required = true)
@NotNull(message = "考试科目不能为空")
private String subject ;
}

View File

@ -28,6 +28,13 @@ public class TestSubmitDto {
@NotNull(message = "车型标识不能为空")
private Integer carTypeId;
/**
*
*/
@ApiModelProperty(value = "科目",required = true)
@NotNull(message = "考试科目不能为空")
private String subject ;
/**
*
*/

View File

@ -76,8 +76,8 @@ public class TdMember implements Serializable {
/**
*
*/
@TableField("DESC")
private String desc;
@TableField("DESCRIPTION")
private String DESCRIPTION;
/**
*

View File

@ -19,15 +19,21 @@ import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TdTestProject implements Serializable {
public class TdProject implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId("TEST_PROJECT_ID")
private Integer testProjectId;
@TableId("PROJECT_ID")
private Integer projectId;
/**
*
*/
@TableField("TYPE")
private String type;
/**
*
@ -47,6 +53,12 @@ public class TdTestProject implements Serializable {
@TableField("DRIVE_TYPE")
private String driveType;
/**
*
*/
@TableField("DESCRIPTION")
private String description;
/**
*
*/

View File

@ -36,6 +36,12 @@ public class TdQuestionTest implements Serializable {
@TableField("CAR_TYPE_ID")
private Integer carTypeId;
/**
*
*/
@TableField("SUBJECT")
private String subject;
/**
*
*/

View File

@ -1,62 +0,0 @@
package com.jwl.driver.server.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TdTestProjectVideos implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "VIDEO_ID", type = IdType.AUTO)
private Integer videoId;
/**
*
*/
@TableField("TEST_PROJECT_ID")
private Integer testProjectId;
/**
*
*/
private String videoImage;
/**
*
*/
private String videoUrl;
/**
*
*/
@TableField("CREATE_TIME")
private LocalDateTime createTime;
/**
*
*/
@TableField("IS_ACTIVE")
private String isActive;
}

View File

@ -1,15 +1,15 @@
package com.jwl.driver.server.generator;
public class MysqlParamGenerator {
private static final String host = "127.0.0.1:3306";
private static final String database = "driver_test";
private static final String host = "118.31.23.45";
private static final String database = "driver_server";
private static final String url = "jdbc:mysql://" + host + "/" + database + "?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&failOverReadOnly=false";
private static final String userName = "root";
private static final String password = "123456";
private static final String password = "admin231280";
private static final String module = "com.jwl.driver.server";
// projectPath项为空即可
private static final String projectPath = "/driver-server";
private static final String projectPath = "";
// todo 实体类是否继承基础类-具备开始时间和结束时间实体类的基础属性
private static final String superEntityClass = "";

View File

@ -1,6 +1,6 @@
package com.jwl.driver.server.mapper;
import com.jwl.driver.server.entity.TdTestProject;
import com.jwl.driver.server.entity.TdProject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
@ -11,6 +11,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @author Automated procedures
* @since 2023-08-10
*/
public interface TdTestProjectMapper extends BaseMapper<TdTestProject> {
public interface TdProjectMapper extends BaseMapper<TdProject> {
}

View File

@ -1,16 +0,0 @@
package com.jwl.driver.server.mapper;
import com.jwl.driver.server.entity.TdTestProjectVideos;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* ; Mapper
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
public interface TdTestProjectVideosMapper extends BaseMapper<TdTestProjectVideos> {
}

View File

@ -0,0 +1,26 @@
package com.jwl.driver.server.service;
import com.jwl.driver.server.dto.ProjectDto;
import com.jwl.driver.server.entity.TdProject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jwl.driver.server.vo.ProjectVo;
import java.util.List;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
public interface ITdProjectService extends IService<TdProject> {
/**
*
* @param queryDto
* @return
*/
List<ProjectVo> queryProjectList(ProjectDto queryDto);
}

View File

@ -1,8 +1,10 @@
package com.jwl.driver.server.service;
import com.jwl.driver.server.dto.TestQueryDto;
import com.jwl.driver.server.dto.TestSubmitDto;
import com.jwl.driver.server.entity.TdQuestionTest;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jwl.driver.server.vo.TestTotalVo;
/**
* <p>
@ -19,5 +21,12 @@ public interface ITdQuestionTestService extends IService<TdQuestionTest> {
* @param submitDto
* @return
*/
Boolean testSubmit(TestSubmitDto submitDto);
TdQuestionTest testSubmit(TestSubmitDto submitDto);
/**
*
* @param queryDto
* @return
*/
TestTotalVo testTotal(TestQueryDto queryDto);
}

View File

@ -1,16 +0,0 @@
package com.jwl.driver.server.service;
import com.jwl.driver.server.entity.TdTestProject;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
public interface ITdTestProjectService extends IService<TdTestProject> {
}

View File

@ -1,16 +0,0 @@
package com.jwl.driver.server.service;
import com.jwl.driver.server.entity.TdTestProjectVideos;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
public interface ITdTestProjectVideosService extends IService<TdTestProjectVideos> {
}

View File

@ -0,0 +1,65 @@
package com.jwl.driver.server.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jwl.driver.server.constant.Constants;
import com.jwl.driver.server.dto.ProjectDto;
import com.jwl.driver.server.entity.TdProject;
import com.jwl.driver.server.entity.TdVideos;
import com.jwl.driver.server.mapper.TdProjectMapper;
import com.jwl.driver.server.service.ITdProjectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jwl.driver.server.service.ITdVideosService;
import com.jwl.driver.server.vo.ProjectVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Service
public class TdProjectServiceImpl extends ServiceImpl<TdProjectMapper, TdProject> implements ITdProjectService {
@Autowired
private ITdVideosService videosService;
@Override
public List<ProjectVo> queryProjectList(ProjectDto queryDto) {
List<ProjectVo> resultList = new ArrayList<>();
LambdaQueryWrapper<TdProject> queryWrapper = new LambdaQueryWrapper<TdProject>()
.eq(TdProject::getProjectId,queryDto.getProjectId())
.eq(TdProject::getType,queryDto.getType())
.eq(TdProject::getCarTypeId,queryDto.getCarTypeId())
.eq(TdProject::getSubject,queryDto.getSubject())
.eq(TdProject::getDriveType,queryDto.getDriveType())
.eq(TdProject::getIsActive, Constants.IS_ACTIVE_TRUE)
.orderByAsc(TdProject::getShowOrder);
List<TdProject> tdProjects = this.getBaseMapper().selectList(queryWrapper);
if (CollectionUtil.isNotEmpty(tdProjects)){
for (TdProject tdProject : tdProjects) {
ProjectVo projectVo = new ProjectVo();
BeanUtils.copyProperties(tdProject,projectVo);
//查询项目视频
List<TdVideos> videoList = videosService.list(new QueryWrapper<TdVideos>().lambda().eq(TdVideos::getTypeId, tdProject.getProjectId()).orderByAsc(TdVideos::getShowOrder));
if (CollectionUtil.isNotEmpty(videoList)){
projectVo.setVideoList(videoList);
projectVo.setImageUrl(videoList.get(0).getVideoImage());
}
resultList.add(projectVo);
}
}
return resultList;
}
}

View File

@ -67,11 +67,11 @@ public class TdQuestionServiceImpl extends ServiceImpl<TdQuestionMapper, TdQuest
if (StrUtil.equals(Constants.SUBJECT_ONE,queryDto.getSubject())){
//40道判断题 60道单选 每题1分
queryDto.setType(Constants.QUESTION_TYPE_ONE)
.setNum(60);
.setNum(40);
resultList.addAll(this.getBaseMapper().queryQuestionByRandom(queryDto));
queryDto.setType(Constants.QUESTION_TYPE_TWO)
.setNum(40);
.setNum(60);
resultList.addAll(this.getBaseMapper().queryQuestionByRandom(queryDto));
}else if(StrUtil.equals(Constants.SUBJECT_FOUR,queryDto.getSubject())){
@ -145,7 +145,7 @@ public class TdQuestionServiceImpl extends ServiceImpl<TdQuestionMapper, TdQuest
for (QuestionVo questionVo : questionVos) {
//如果选项A没有值 则为判断题
List<QuestionVo.QuestionOption> optionList = new ArrayList<>();
if (StrUtil.isBlank(questionVo.getChooseA())){
if (StrUtil.isBlank(questionVo.getChooseA()) || StrUtil.equals(questionVo.getType(),Constants.QUESTION_TYPE_ONE)){
optionList.add(new QuestionVo.QuestionOption("A","正确","1"));
optionList.add(new QuestionVo.QuestionOption("B","错误","2"));
}else {

View File

@ -1,17 +1,26 @@
package com.jwl.driver.server.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jwl.driver.server.dto.SecurityUser;
import com.jwl.driver.server.dto.TestQueryDto;
import com.jwl.driver.server.dto.TestSubmitDto;
import com.jwl.driver.server.entity.TdQuestionTest;
import com.jwl.driver.server.mapper.TdQuestionTestMapper;
import com.jwl.driver.server.service.ITdQuestionTestService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jwl.driver.server.util.SecurityUtil;
import com.jwl.driver.server.vo.TestTotalVo;
import io.swagger.models.auth.In;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.OptionalDouble;
/**
* <p>
@ -26,13 +35,43 @@ public class TdQuestionTestServiceImpl extends ServiceImpl<TdQuestionTestMapper,
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean testSubmit(TestSubmitDto submitDto) {
public TdQuestionTest testSubmit(TestSubmitDto submitDto) {
TdQuestionTest questionTest = new TdQuestionTest();
BeanUtils.copyProperties(submitDto, questionTest);
questionTest.setUserId(SecurityUtil.getUserId())
.setCreateTime(LocalDateTime.now());
return this.save(questionTest);
return questionTest;
}
@Override
public TestTotalVo testTotal(TestQueryDto queryDto) {
TestTotalVo testTotalVo = new TestTotalVo();
LambdaQueryWrapper<TdQuestionTest> queryWrapper = new LambdaQueryWrapper<TdQuestionTest>()
.eq(TdQuestionTest::getCarTypeId, queryDto.getCarTypeId())
.eq(TdQuestionTest::getSubject, queryDto.getSubject())
.eq(TdQuestionTest::getUserId, SecurityUtil.getUserId())
.orderByDesc(TdQuestionTest::getCreateTime);
List<TdQuestionTest> list = this.list(queryWrapper);
Long passNum = list.stream().filter(s -> s.getScore() >= 90).count();
testTotalVo.setTestNum(list.size())
.setPassNum(passNum.intValue());
//取最近的五次
if (CollectionUtil.isNotEmpty(list) && list.size() > 5) {
list = list.subList(0, 5);
}
List<TdQuestionTest> recentTestList = CollectionUtil.reverse(list);
//最近五次的平均分
OptionalDouble averaged = recentTestList.stream().mapToInt(TdQuestionTest::getScore).average();
Integer average = 0;
if (averaged.isPresent()){
Double averageScore = averaged.getAsDouble();
average = averageScore.intValue();
}
testTotalVo.setRecentTestList(recentTestList)
.setRecentAverageScore(average);
return testTotalVo;
}
}

View File

@ -1,20 +0,0 @@
package com.jwl.driver.server.service.impl;
import com.jwl.driver.server.entity.TdTestProject;
import com.jwl.driver.server.mapper.TdTestProjectMapper;
import com.jwl.driver.server.service.ITdTestProjectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Service
public class TdTestProjectServiceImpl extends ServiceImpl<TdTestProjectMapper, TdTestProject> implements ITdTestProjectService {
}

View File

@ -1,20 +0,0 @@
package com.jwl.driver.server.service.impl;
import com.jwl.driver.server.entity.TdTestProjectVideos;
import com.jwl.driver.server.mapper.TdTestProjectVideosMapper;
import com.jwl.driver.server.service.ITdTestProjectVideosService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Service
public class TdTestProjectVideosServiceImpl extends ServiceImpl<TdTestProjectVideosMapper, TdTestProjectVideos> implements ITdTestProjectVideosService {
}

View File

@ -89,7 +89,7 @@ public class MemberVo {
*
*/
@ApiModelProperty("会员描述")
private String desc;
private String description;
/**
*

View File

@ -0,0 +1,91 @@
package com.jwl.driver.server.vo;
import com.jwl.driver.server.entity.TdVideos;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
* ;
* </p>
*
* @author Automated procedures
* @since 2023-08-10
*/
@Data
@Accessors(chain = true)
@ApiModel("考试项目出参")
public class ProjectVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
@ApiModelProperty("考试项目")
private Integer projectId;
/**
*
*/
@ApiModelProperty("类型")
private String type;
/**
*
*/
@ApiModelProperty("所属科目")
private String subject;
/**
*
*/
@ApiModelProperty("车型标识")
private Integer carTypeId;
/**
* A2:B2
*/
@ApiModelProperty("驾驶类型")
private String driveType;
/**
*
*/
@ApiModelProperty("描述")
private String description;
/**
*
*/
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
/**
*
*/
@ApiModelProperty("是否生效")
private String isActive;
/**
*
*/
@ApiModelProperty("显示序号")
private Integer showOrder;
/**
* url
*/
@ApiModelProperty("图片url")
private String imageUrl;
@ApiModelProperty("视频列表")
private List<TdVideos> videoList;
}

View File

@ -0,0 +1,47 @@
package com.jwl.driver.server.vo;
import com.jwl.driver.server.entity.TdQuestionTest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author
* @description
* @create 2023/8/21 0:39
*/
@Data
@Accessors(chain = true)
@ApiModel("考试成绩统计出参")
public class TestTotalVo {
private static final long serialVersionUID = 1L;
/**
*
*/
@ApiModelProperty("考试次数")
private Integer testNum;
/**
*
*/
@ApiModelProperty("合格次数")
private Integer passNum;
/**
*
*/
@ApiModelProperty("最近考试平均得分(超过五次按最近五次计算)")
private Integer recentAverageScore;
/**
*
*/
@ApiModelProperty("最近考试情况(超过五次返回最近五次)")
private List<TdQuestionTest> recentTestList;
}

View File

@ -12,7 +12,7 @@
tm.DURATION,
tm.SUBJECTS,
tm.UNIT,
tm.DESC,
tm.DESCRIPTION,
tm.IS_ACTIVE
from
td_member tm
@ -42,7 +42,7 @@
tm.DURATION,
tm.SUBJECTS,
tm.UNIT,
tm.DESC,
tm.DESCRIPTION,
tm.IS_ACTIVE
from
td_sys_user_member tsum

View File

@ -1,5 +1,5 @@
<?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.jwl.driver.server.mapper.TdTestProjectMapper">
<mapper namespace="com.jwl.driver.server.mapper.TdProjectMapper">
</mapper>

View File

@ -1,5 +0,0 @@
<?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.jwl.driver.server.mapper.TdTestProjectVideosMapper">
</mapper>