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<ChapterQuizCorrectqueryChapterQuizCorrectByUsernameAndCourseId(String username,Integer courseId);