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);