Java 在线考试系统开发:发布试卷、查询试卷、在线答题和自动阅卷接口实现

本文将基于 Java 技术,详细讲解如何开发一个在线考试系统,包括发布试卷、查询试卷、用户在线答题和自动阅卷功能的接口实现。代码示例涵盖了数据模型、接口定义、实现类和代码注释,并遵循了规范的开发原则。

业务需求:

  1. 用户管理:支持用户的增删改查,支持对用户分配角色。且需要支持班级管理,班级和用户的关系是一对多。
  2. 角色管理:支持对角色的增删改查,角色需支持(管理员、教师、班长、学生等),并且支持查看对应角色下的用户集合,并支持用户集合的删除和新增。
  3. 试卷管理:支持对试卷的增删改查,并且需支持添加试题集合,删除试题,发布试卷,给试卷设置开放和结束时间等功能。
  4. 试题管理:需要支持试题的增删改查,试题需支持题型,分数等,并且需要支持单选题、多选题、填空题、问答题等多种选项配置。
  5. 在线答题:需要支持学生在规定的实际端内完成试卷的在线答题,并记录答题状态,且针对答题情况自动评分。
  6. 成绩管理:管理员或教师可以汇总查询一个班级或者多个学生的考试成绩,并筛选出常出错的试题或题型。

技术开发规范:

  1. 请默认我已经事先配置好了 redis,mybatis-plus,mysql,swagger,lombok的相关配置,你可以直接引用。
  2. 所有生成的 javabean 需要接入 swagger 注解,如类上加上 @ApiModel 注解,字段上加上 @ApiModelProperty 注解等。
  3. 接口类名由大写字母 I 开头,对应实现类以 Impl 结尾。
  4. 所有的接口方法入参如果有多个属性字段,必须要封装成一个 DTO 对象。
  5. 如果是通用的增删改查方法,请用 add/edit/delete/query 定义方法名,其它方法按照实际情况生成。
  6. 分页查询请使用 PageHelper,返回的对应是 PageInfo 对象。
  7. 要求生成复制即可用的代码,不要省略 import 的引用。
  8. 请详细写清楚代码注释,这一条非常重要!不可缺少。

预置的 javabean:

import lombok.Data;

@Data
@ApiModel(description = '用户实体类')
public class User {
    @ApiModelProperty(value = '用户ID')
    private Integer id;

    @ApiModelProperty(value = '用户名')
    private String username;

    @ApiModelProperty(value = '密码')
    private String password;

    @ApiModelProperty(value = '角色ID')
    private Integer roleId;

    @ApiModelProperty(value = '班级ID')
    private Integer classId;
}

import lombok.Data;

@Data
@ApiModel(description = '角色实体类')
public class Role {
    @ApiModelProperty(value = '角色ID')
    private Integer id;

    @ApiModelProperty(value = '角色名')
    private String roleName;

    @ApiModelProperty(value = '角色描述')
    private String roleDesc;
}

import lombok.Data;

@Data
@ApiModel(description = '班级实体类')
public class Class {
    @ApiModelProperty(value = '班级ID')
    private Integer id;

    @ApiModelProperty(value = '班级名')
    private String className;

    @ApiModelProperty(value = '年级')
    private String grade;

    @ApiModelProperty(value = '专业')
    private String major;
}

import lombok.Data;

@Data
@ApiModel(description = '选项实体类')
public class Option {
    @ApiModelProperty(value = '选项内容')
    private String optionContent;

    @ApiModelProperty(value = '是否为正确答案')
    private Boolean isCorrect;
}

import io.swagger.annotations.ApiModel;

@ApiModel(description = '题目类型枚举类')
public enum QuestionType {
    SINGLE_CHOICE('单选题'),      // 单选
    MULTI_CHOICE('多选题'),       // 多选
    FILL_BLANK('填空题'),         // 填空
    SHORT_ANSWER('问答题');       // 问答

    private String type;

    QuestionType(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

import java.util.List;

import lombok.Data;

@Data
@ApiModel(description = '试题实体类')
public class Question {
    @ApiModelProperty(value = '试题ID')
    private Integer id;

    @ApiModelProperty(value = '题目')
    private String question;

    @ApiModelProperty(value = '选项集合')
    private List<Option> optionList;

    @ApiModelProperty(value = '答案')
    private String answer;

    @ApiModelProperty(value = '分数')
    private Double score;

    @ApiModelProperty(value = '题型')
    private QuestionType questionType;
}

import java.util.Date;
import java.util.List;

import lombok.Data;

@Data
@ApiModel(description = '试卷实体类')
public class Paper {
    @ApiModelProperty(value = '试卷ID')
    private Integer id;

    @ApiModelProperty(value = '试卷名')
    private String paperName;

    @ApiModelProperty(value = '试题ID集合')
    private List<Integer> questionList;

    @ApiModelProperty(value = '开放时间')
    private Date openTime;

    @ApiModelProperty(value = '结束时间')
    private Date endTime;
}

import lombok.Data;

@Data
@ApiModel(description = '成绩实体类')
public class Grade {
    @ApiModelProperty(value = '成绩ID')
    private Integer id;

    @ApiModelProperty(value = '学生ID')
    private Integer studentId;

    @ApiModelProperty(value = '试卷ID')
    private Integer paperId;

    @ApiModelProperty(value = '得分')
    private Double score;
}

import lombok.Data;

@Data
@ApiModel(description = '考试记录实体类')
public class ExamRecord {
    @ApiModelProperty(value = '考试记录ID')
    private Integer id;

    @ApiModelProperty(value = '学生ID')
    private Integer studentId;

    @ApiModelProperty(value = '试卷ID')
    private Integer paperId;

    @ApiModelProperty(value = '答题情况')
    private String answerStatus;

    @ApiModelProperty(value = '得分')
    private Double score;
}

接口实现:

1. 发布试卷接口

// 接口定义
public interface IPaperService {
    void publishPaper(PaperDTO paperDTO);
}

// 实现类
@Service
public class PaperServiceImpl implements IPaperService {

    @Autowired
    private PaperMapper paperMapper;

    @Autowired
    private PaperQuestionMapper paperQuestionMapper;

    @Override
    public void publishPaper(PaperDTO paperDTO) {
        // 保存试卷信息
        Paper paper = new Paper();
        BeanUtils.copyProperties(paperDTO, paper);
        paperMapper.insert(paper);

        // 保存试题集合
        List<Integer> questionList = paperDTO.getQuestionList();
        for (Integer questionId : questionList) {
            PaperQuestion paperQuestion = new PaperQuestion();
            paperQuestion.setPaperId(paper.getId());
            paperQuestion.setQuestionId(questionId);
            paperQuestionMapper.insert(paperQuestion);
        }
    }
}

2. 查询一个完整的试卷接口

// 接口定义
public interface IPaperService {
    PaperDTO getPaperById(Integer paperId);
}

// 实现类
@Service
public class PaperServiceImpl implements IPaperService {

    @Autowired
    private PaperMapper paperMapper;

    @Autowired
    private PaperQuestionMapper paperQuestionMapper;

    @Autowired
    private QuestionMapper questionMapper;

    @Override
    public PaperDTO getPaperById(Integer paperId) {
        // 查询试卷信息
        Paper paper = paperMapper.selectById(paperId);

        // 查询试题集合
        List<Integer> questionIdList = paperQuestionMapper.selectQuestionIdListByPaperId(paperId);
        List<Question> questionList = questionMapper.selectBatchIds(questionIdList);

        // 封装结果
        PaperDTO paperDTO = new PaperDTO();
        BeanUtils.copyProperties(paper, paperDTO);
        paperDTO.setQuestionList(questionIdList);
        paperDTO.setQuestionList(questionList);

        return paperDTO;
    }
}

3. 用户在线答题和自动阅卷接口

// 接口定义
public interface IExamService {
    void submitPaper(ExamRecordDTO examRecordDTO);
}

// 实现类
@Service
public class ExamServiceImpl implements IExamService {

    @Autowired
    private ExamRecordMapper examRecordMapper;

    @Autowired
    private GradeMapper gradeMapper;

    @Override
    public void submitPaper(ExamRecordDTO examRecordDTO) {
        // 保存考试记录
        ExamRecord examRecord = new ExamRecord();
        BeanUtils.copyProperties(examRecordDTO, examRecord);
        examRecordMapper.insert(examRecord);

        // 自动阅卷
        int paperId = examRecordDTO.getPaperId();
        PaperDTO paperDTO = getPaperById(paperId);
        List<Question> questionList = paperDTO.getQuestionList();
        String answerStatus = examRecordDTO.getAnswerStatus();
        double score = 0;
        for (int i = 0; i < questionList.size(); i++) {
            String answer = questionList.get(i).getAnswer();
            String userAnswer = answerStatus.split(',')[i];
            if (answer.equals(userAnswer)) {
                score += questionList.get(i).getScore();
            }
        }

        // 保存成绩
        Grade grade = new Grade();
        grade.setStudentId(examRecordDTO.getStudentId());
        grade.setPaperId(examRecordDTO.getPaperId());
        grade.setScore(score);
        gradeMapper.insert(grade);
    }
}

注意:

  • 上述代码示例中省略了部分数据库操作的代码,具体实现需要根据实际情况进行调整。
  • 为了简化代码示例,一些错误处理和异常处理也未进行展示,实际开发中需要进行完善。
  • 代码中的getPaperById()方法是来自IPaperService接口,需要在ExamServiceImpl中注入IPaperService实现类以使用。

希望本文能够帮助您了解如何使用 Java 开发一个在线考试系统。如果您有任何疑问,请随时留言。

Java 在线考试系统开发:发布试卷、查询试卷、在线答题和自动阅卷接口实现

原文地址: https://www.cveoy.top/t/topic/oo61 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录