测验游戏-为管理员创建问题,答案和历史记录

时间:2019-03-01 18:11:37

标签: spring hibernate spring-boot jpa spring-data-jpa

我正在开发具有两种类型用户的游戏;管理员和用户,因此管理员可以根据需要生成尽可能多的问题,因此这些问题可以是NORMAL, MULTICHOICE, BINARI, SMALL_DESCRIPTION,因此,每次管理员要创建一个问题时,他都必须决定要对此问题回答哪种类型,也要确定主题这个问题(可以是一个子主题)。

他可以生成测验,而生成测验的方式是他必须选择之前创建的问题。

他还可以检查用户的历史记录,这意味着通过呼叫端点,他应该能够检查该用户所做的问题(包括分数,哪个问题失败,他回答了什么)。

从现在开始,我有了QuestionAnswer类,但是我有点卡住问题生成和分配给主题的答案,然后创建测验,因为在这两部分中我也都缺少用户,以了解哪个用户创建了问题/测验,哪个用户回答了该问题/测验并存储了一些数据以进行历史记录。

我的问题类具有:

@Entity(name="question")
public class Question extends DateAudit {
@Id
@Column(name = "question_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "question_seq")
@SequenceGenerator(name = "question_seq", allocationSize = 1)
private Long id;

@Column(name = "text_question")
private String textQuestion; //The question itself "What's the name of ..."

@Column(name = "answerDescription")
@NotBlank(message = "Answer description")
private String answerDescription; //The answer to the question as an explanation

@Column(name = "isExamQuestion", nullable = false) 
private Boolean isExamQuestion; //A flag for the user to filter when he wants to do a question he only will see those that are not isExamQuestion, isExamQuestion are the questions that are going to appear when he wants to create a Quiz

@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
private Set<Answer> answers; //List of answers...

@Column(name = "answer_type", nullable = false) 
private String answerType; //I don't know if it goes here, but the answerType mentioned before NORMAL,MULTICHOICE,.... is to render on the user app

答案

@Entity(name = "answer")
public class Answer extends DateAudit {

    @Id
    @Column(name = "answer_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "answer_seq")
    @SequenceGenerator(name = "answer_seq", allocationSize = 1)
    private Long id;

    @Column(name = "answerToQuestion") 
    @NotBlank(message = "Answer to question name can not be blank") 
    private String answerToQuestion; //If the questions is what's 2*2 this could be 3

    @ManyToOne 
    private Question question; //In what question appear that answer

    //Here I'm wondering if I have to add a flag saying isCorrect to detect if it's the correct answer or not

如您所见,我缺少主题资料,历史记录和测验,并且我没有引用哪个用户做了问题或测验或解决了测验/问题,请您指导我如何做这个?

编辑

我收到的问题:

  

该问题仅针对一个用户还是一组用户?

对于不同的用户,可以回答相同的问题或测验,这意味着Q1可以由40个用户完成。

  

测验与主题有关吗?

创建测验时,请选择一个主题以选择具有该主题的问题。 示例:创建一个学习总结的测验,我必须按主题过滤:数学,然后是SubTopic和,以便我选择要放入测验中的问题。

  

您打算如何创建主题或子主题?

管理员应该具有创建主题或子主题的端点,从现在开始只有一个子主题,没有子主题的子主题,从现在开始是主题:数学子主题:平方根。因此,在创建问题或测验之前,管理员应首先创建一个主题,如果他想添加一个子主题,然后创建一个主题,那么当他尝试创建一个问题时,他可以说该问题来自X主题/子主题。这个问题可以分配给那个。

  

“历史”是什么意思?

好,对于Admin而言,Admin应该具有一个端点,该端点具有用户的ID或名称,该端点将返回用户已完成的所有测验(第一个端点)或所有问题(第二个端点),并且分数,失败次数/正确次数,但我想知道这应该是前端进行计算,我的意思是,端点返回所有此信息,问题总数/测验已完成,分数,什么问题失败等等。然后在前端进行更多计算。

1 个答案:

答案 0 :(得分:0)

对不起,我没有为答案添加注释。你找出他们。都是实体。不需要“答案”实体,或者它取决于您的问题类型。让他们自己拥有课程,并填写用户表格。有选择的例子。

您可以管理谁可以从Controller创建测验。您可以将测验添加到您的用户实体:<vtable url="orders/filter" :columns="columns" :filters="filters"></vtable> List<Quiz> myQuizesAsAdmin;

您可以从用户实体查询中查看历史记录;使用List<Quiz> myQuizesAsAnswerer;对其进行过滤和排序。您还可以像为学校班级那样添加班级,并添加Quizes他们要做的事情。

编码方法:管理员创建List<Quiz> myQuizesAsAnswerer;

现在您有一个原始的测验,因此您已使用唯一ID对其进行了复制或克隆。我向Quiz.class添加了一个构造函数来实现。 Quiz myQuiz = new Quiz(name, QuizId, Questions, StartDate, EndDate, etc...)现在,答题者可以进行测验并回答问题。填充后将其保存到数据库。现在,在您的数据库中,您将有一个“原始测验”和它的副本,这些内容是被回答的测验。

Quiz iDoThisQuiz = new Quiz (this.QuizRepository.findByQuizIdAndByOriginal(thisQuisId, true));

-

    public class Quiz {
               private String name;
               private boolean original;
               private long id; // This is unique for every entity
               private String quizId; // this is for this quiz general id. Like a name. Unique for this quiz.
               private List<Question> questions;
               private User answerer;
               private User admin;
               private Date endDateToDoDate; // and another dates like when it has been done.
               private double totalPoints; // If you want to on

        }
public Quiz(Quiz originalQuiz) {
     this.id= this has to be unique, autogenerated or what you use to generate ids. 
     this.quizId = originalQuiz.quizId;
     this.name = originalQuiz.name;
     this.question = new Question(originalQuiz.question);
     this.original = false;
     ...