From aff862d161cc43f43b607207eb89d68313762885 Mon Sep 17 00:00:00 2001 From: lbw <1192299468@qq.com> Date: Wed, 24 Dec 2025 16:26:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(student):=20=E6=96=B0=E5=A2=9E=E5=AD=A6?= =?UTF-8?q?=E7=94=9F=E8=AF=8D=E6=B1=87=E6=8E=8C=E6=8F=A1=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E5=8F=8A=E7=83=AD=E5=8A=9B=E5=9B=BE=E5=B1=95=E7=A4=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增FindStudentMasteryDetailReqVO和FindStudentMasteryDetailRspVO数据类 - 学生接口新增/ student/mastery/detail,用于查询学生词汇掌握详情 - StudentService及实现类添加查询词汇掌握详情的方法 - WordMasteryLogDOMapper新增selectAllByStudentId方法支持查询 - SaTokenConfigure增加对新接口的免认证配置 - 前端api新增getStudentWordMastery方法 - 学生页面新增WordMasteryHeatmap组件并展示词汇掌握热力图 - 创建WordMasteryHeatmap组件,支持动态请求数据及Echarts热力图渲染 - 热力图按记忆强度排序,提供丰富的鼠标悬停提示信息 --- .../service/config/SaTokenConfigure.java | 1 + .../service/controller/StudentController.java | 19 ++ .../domain/mapper/WordMasteryLogDOMapper.java | 2 + .../FindStudentMasteryDetailReqVO.java | 15 ++ .../FindStudentMasteryDetailRspVO.java | 22 ++ .../service/service/StudentService.java | 3 + .../service/student/StudentServiceImpl.java | 18 ++ .../mapper/WordMasteryLogDOMapper.xml | 5 + enlish-vue/src/api/student.js | 6 + .../components/student/WordMasteryHeatmap.vue | 215 ++++++++++++++++++ enlish-vue/src/pages/student.vue | 5 + 11 files changed, 311 insertions(+) create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/FindStudentMasteryDetailReqVO.java create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/FindStudentMasteryDetailRspVO.java create mode 100644 enlish-vue/src/layouts/components/student/WordMasteryHeatmap.vue 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)