3.8 *主页信息

获取主页的右下角的错题信息:
首先修改前段的bug,在src/views/Home.vue文件,第149行代码:
改成:
let t=response.data.data;

进入主页后,前端会自动发起一个get请求,发送参数username和courseId到main,然后后台将发回的json结构如下:
{    
    "code": "200",
    "info": "",
    "data": {
        "cqcList": [
            {
                "chapterQuizStudyId": "41832",
                "score": 0,
                "datetime": "2025-03-01 21:52:53",
                "stat": "3",
                "teacherId": "system",
                "comment": "错误",
                "chapterQuizStudy": {
                    "chapterQuiz": {
                        "chapter": Object{...},
                        "code": "",
                        "codeLang": "java",
                        "title": "jdk是java的运行环境,它可以解析java文件并运行",
                        "subjectType": {
                            "name": "判断",
                            "id": "5"
                        },
                        "content": "",
                        "valid": "1",
                        "score": 2,
                        "instruments": "",
                        "answer": "true",
                        "chapterId": "187",
                        "hint": "",
                        "typeId": "5",
                        "id": "30",
                        "keyword": "jdk",
                        "queue": 1
                    },
                    "studentId": "abc",
                    "stat": "0",
                    "answer": "false",
                    "quizId": "30",
                    "startTime": "2025-03-01 14:35:31",
                    "endTime": "2025-03-01 14:36:07",
                    "id": "41832",
                    "user": {
                        "role": "9",
                        "isValid": "1",
                        "nickname": "java",
                        "createDate": "2020-09-16 16:44:32",
                        "username": "abc"
                    }
                },
                "id": "28430",
                "user": {
                    "role": "1",
                    "isValid": "1",
                    "nickname": "系统",
                    "createDate": "2018-04-03",
                    "username": "system"
                }
            },
            //这些Object是其他错题,省略
            Object{...},
            Object{...},
            Object{...},
            Object{...}
        ],
        "courseName": "Java程序设计",
        "code": "010200",
        "chapterName": "1.2  Java编程环境",
        "courseId": "1",
        "percent": "0.6666666666666666"
    }
}
data部分的cqcList,实际上查询的表格是chapterQuizCorrect,这个表表示批改表,与之紧密关联的表示chapterQuizStudy,表示学生做题表,ChapterQuiz则是练习题表,最后,ChapterQuiz关联了Chapter表这四个表数据库设置了外键关联。以下表都要生成实体类:
实体类说明
Chapter保存章节的表,章节的标题,内容
ChapterQuiz保存练习题的表,里面有一个Chapter的外键,记录题目是哪个章节的
ChapterQuizStudy学员完成一道练习题的记录,里面有一个chapterQuiz的外键,记录答题对应的练习
ChapterQuizCorrect系统批改一道学员答题的记录,里面有一个chapterQuizStudy的外键,记录本次批改对应的答题
SubjectType记录练习题类型,ChapterQuiz只记录一个数字id,id对于的文字在这个表里面
外键关联的表格,SpringBoot生成的实体类的时候,会把关联的主键,额外多生成一个对象,例如下面的ChapterQuiz类,除了关联的ChapterId之外,还有Chapter对象chapter:
package cn.jssp.entity;
import com.alibaba.fastjson.annotation.JSONField;
import javax.persistence.*;
import java.util.Collection;
import java.util.Objects;
@Entity 
@Table(name="chapter_quiz",schema="javaidc_jssp")
public class ChapterQuiz{
    private String id;
    private String chapterId;
    private Chapter chapter;
    private String title;
    private String content;
    private String code;
    private String codeLang;
    private String instruments;
    private String typeId;
    private String hint;
    private String answer;
    private String keyword;
    private String fqa;
    private Integer queue;
    private Integer score;
    private String valid;
    private SubjectType subjectType;
    @JSONField(serialize=false)
    private Collection chapterQuizStudiesById;
    @JSONField(serialize=false)
    private Collection sectionQuizsById;
    /**
     其他代码省略
     */
    }
对比下面的chapter_quiz表格的结构,可以看到每个数据库的字段都有一个属性对应,但是这里要注意:第10行代码,chapterId已经映射了chapter_id,第11行代码又有一个chapter也是映射chapter_id。这就是SpringBoot把一个外键直接关联成对象,如果查询这个ChapterQuiz,那么也会同时把关联的Chapter信息也查出来。

现在再回头去看看上面的json:
对此,我们不需要做什么,直接查询就能得到关联的表的信息,下面这个查询是本章节最核心的查询,根据用户名和课程id查询练习批改信息的函数,它应该在哪个Repository里面?
/**
根据用户名和课程id查找批改有错误的结果
 */
@Query("select c from ChapterQuizCorrect as c where c.chapterQuizStudy.student.username=?1 and c.comment<>'' and c.chapterQuizStudy.chapterQuiz.chapter.course.id=?2 order by c.datetime desc")
List<ChapterQuizCorrect> queryChapterQuizCorrectByUsernameAndCourseId(String username,Integer courseId);