diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/SaTokenConfigure.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/SaTokenConfigure.java index c186508..8d2bb3a 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/SaTokenConfigure.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/SaTokenConfigure.java @@ -34,6 +34,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { .notMatch("/studentLessonPlans/list") .notMatch("/studentLessonPlans/history") .notMatch("/student/analyze") + .notMatch("/student/mastery/detail") .notMatch("/unit/list") .notMatch("/vocabulary/list") .notMatch("/plan/download") diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/StudentController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/StudentController.java index 580db9a..e43e381 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/StudentController.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/StudentController.java @@ -4,6 +4,8 @@ package com.yinlihupo.enlish.service.controller; import com.yinlihupo.enlish.service.domain.dataobject.ClassDO; import com.yinlihupo.enlish.service.domain.dataobject.GradeDO; import com.yinlihupo.enlish.service.domain.dataobject.StudentDO; +import com.yinlihupo.enlish.service.model.bo.StudentDetail; +import com.yinlihupo.enlish.service.model.bo.exam.WordMasteryDetail; import com.yinlihupo.enlish.service.model.vo.student.*; import com.yinlihupo.enlish.service.service.ClassService; import com.yinlihupo.enlish.service.service.GradeService; @@ -92,4 +94,21 @@ public class StudentController { String analyzeStudentStudy = studentService.analyzeStudentStudy(analyzeStudentStudyReqVO.getStudentId()); return Response.success(analyzeStudentStudy); } + + @PostMapping("mastery/detail") + @ApiOperationLog(description = "查询学生单词掌握详情") + public Response> findStudentMasteryDetail(@RequestBody FindStudentMasteryDetailReqVO findStudentMasteryDetailReqVO) { + Integer studentId = findStudentMasteryDetailReqVO.getStudentId(); + List studentWordMasteryDetail = studentService.findStudentWordMasteryDetail(studentId); + + List list = studentWordMasteryDetail.stream().map(wordMasteryDetail -> FindStudentMasteryDetailRspVO.builder() + .word(wordMasteryDetail.getWord()) + .reviewCount(wordMasteryDetail.getReviewCount()) + .memoryStrength(wordMasteryDetail.getMemoryStrength()) + .updateTime(wordMasteryDetail.getUpdate_time()) + .build() + ).toList(); + + return Response.success(list); + } } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/WordMasteryLogDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/WordMasteryLogDOMapper.java index 434e19c..67d78e8 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/WordMasteryLogDOMapper.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/WordMasteryLogDOMapper.java @@ -18,4 +18,6 @@ public interface WordMasteryLogDOMapper { int selectStudentStrengthCount(@Param("studentId") Integer studentId); List selectByStudentIdAndLimitTime(@Param("studentId") Integer studentId); + + List selectAllByStudentId(@Param("studentId") Integer studentId); } \ No newline at end of file diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/FindStudentMasteryDetailReqVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/FindStudentMasteryDetailReqVO.java new file mode 100644 index 0000000..6da0653 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/FindStudentMasteryDetailReqVO.java @@ -0,0 +1,15 @@ +package com.yinlihupo.enlish.service.model.vo.student; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class FindStudentMasteryDetailReqVO { + + private Integer studentId; +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/FindStudentMasteryDetailRspVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/FindStudentMasteryDetailRspVO.java new file mode 100644 index 0000000..07df1a8 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/FindStudentMasteryDetailRspVO.java @@ -0,0 +1,22 @@ +package com.yinlihupo.enlish.service.model.vo.student; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class FindStudentMasteryDetailRspVO { + private String word; + + private Integer reviewCount; + + private Double memoryStrength; + + private LocalDateTime updateTime; +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/StudentService.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/StudentService.java index 58605ad..049fef2 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/StudentService.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/StudentService.java @@ -3,6 +3,7 @@ package com.yinlihupo.enlish.service.service; import com.yinlihupo.enlish.service.domain.dataobject.StudentDO; import com.yinlihupo.enlish.service.model.bo.StudentDetail; +import com.yinlihupo.enlish.service.model.bo.exam.WordMasteryDetail; import com.yinlihupo.enlish.service.model.vo.student.AddStudentReqVO; import java.util.List; @@ -22,4 +23,6 @@ public interface StudentService { void deleteStudent(Integer studentId); String analyzeStudentStudy(Integer studentId); + + List findStudentWordMasteryDetail(Integer studentId); } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/student/StudentServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/student/StudentServiceImpl.java index b2eab3f..0901dcc 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/student/StudentServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/student/StudentServiceImpl.java @@ -167,4 +167,22 @@ public class StudentServiceImpl implements StudentService { } } + + @Override + public List findStudentWordMasteryDetail(Integer studentId) { + + List wordMasteryLogDOS = wordMasteryLogDOMapper.selectAllByStudentId(studentId); + List masteredWords = vocabularyBankMapper.selectVocabularyBankDOListByIds(wordMasteryLogDOS.stream().map(WordMasteryLogDO::getWordId).toList()); + Map id2MasteryWord = masteredWords.stream().collect(Collectors.toMap(VocabularyBankDO::getId, vocabularyBankDO -> vocabularyBankDO)); + List wordMasteryDetails = new ArrayList<>(); + for (WordMasteryLogDO wordMasteryLogDO : wordMasteryLogDOS) { + wordMasteryDetails.add(WordMasteryDetail.builder() + .word(id2MasteryWord.get(wordMasteryLogDO.getWordId()).getWord()) + .reviewCount(wordMasteryLogDO.getReviewCount()) + .memoryStrength(wordMasteryLogDO.getMemoryStrength()) + .update_time(wordMasteryLogDO.getUpdate_time()) + .build()); + } + return wordMasteryDetails; + } } diff --git a/enlish-service/src/main/resources/mapper/WordMasteryLogDOMapper.xml b/enlish-service/src/main/resources/mapper/WordMasteryLogDOMapper.xml index 83992ec..5250858 100644 --- a/enlish-service/src/main/resources/mapper/WordMasteryLogDOMapper.xml +++ b/enlish-service/src/main/resources/mapper/WordMasteryLogDOMapper.xml @@ -58,4 +58,9 @@ where student_id = #{studentId} and update_time between date_sub(now(), interval 7 day) and now() + \ No newline at end of file diff --git a/enlish-vue/src/api/student.js b/enlish-vue/src/api/student.js index 546d0c9..bf16618 100644 --- a/enlish-vue/src/api/student.js +++ b/enlish-vue/src/api/student.js @@ -31,3 +31,9 @@ export function getStudentStudyAnalyze(data) { timeout: 20000 }) } + +export function getStudentWordMastery(id) { + return axios.post('/student/mastery/detail', { + studentId: id + }) +} diff --git a/enlish-vue/src/layouts/components/student/WordMasteryHeatmap.vue b/enlish-vue/src/layouts/components/student/WordMasteryHeatmap.vue new file mode 100644 index 0000000..9ab989e --- /dev/null +++ b/enlish-vue/src/layouts/components/student/WordMasteryHeatmap.vue @@ -0,0 +1,215 @@ + + + + + diff --git a/enlish-vue/src/pages/student.vue b/enlish-vue/src/pages/student.vue index fbdf53b..13cdf0b 100644 --- a/enlish-vue/src/pages/student.vue +++ b/enlish-vue/src/pages/student.vue @@ -32,6 +32,10 @@
学生学案记录
+
+
词汇掌握热力图
+ +
学习分析
@@ -61,6 +65,7 @@ import { getStudentDetail, getStudentStudyAnalyze } from '@/api/student' import { getStudentExamHistory } from '@/api/exam' import ExamHistoryChart from '@/layouts/components/student/ExamHistoryChart.vue' import PlanHistoryChart from '@/layouts/components/student/PlanHistoryChart.vue' +import WordMasteryHeatmap from '@/layouts/components/student/WordMasteryHeatmap.vue' import MarkdownIt from 'markdown-it' const loading = ref(false)