From 0f5169c1d716467e8b8868100c7ab87c4bd87a69 Mon Sep 17 00:00:00 2001 From: lbw <1192299468@qq.com> Date: Tue, 30 Dec 2025 10:30:26 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ai):=20=E9=87=8D=E6=9E=84AI=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=B1=BB=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=8F=A5?= =?UTF-8?q?=E5=AD=90=E5=88=86=E6=9E=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 DifyArticleClient 重命名为 DifyClient,调整相关调用引用 - 增加 sendSentenceAnalyze 方法,实现批量词汇句子分析功能 - 更新配置文件,新增 analyzeKey 和 sentenceKey 两个AI接口密钥配置 - 修改LessonPlansServiceImpl中生成连词成句功能,调用新句子分析接口 - 优化LessonPlanConstant常量,调整部分键名格式,去除空格 - 修改相关测试类适配 DifyClient 改动 - 相关VO类添加学生姓名和试题名称字段,丰富展示数据 - 更新前端table组件,替换显示学生姓名、班级名、年级名等信息字段 - 调整路由首页路径为“/”,修改Header组件对应链接 - 其他若干细节修改,如异常日志优化、时间格式展示等 --- .../service/constant/LessonPlanConstant.java | 6 +- .../controller/ExamWordsController.java | 2 + .../service/controller/StudentController.java | 2 + .../enlish/service/model/bo/Sentence.java | 27 +++++++++ .../model/vo/exam/ExamWordsResultRspVO.java | 5 ++ .../model/vo/student/StudentItemRspVO.java | 2 + .../service/service/ExamWordsService.java | 2 + .../service/exam/ExamWordsServiceImpl.java | 5 ++ .../service/plan/LessonPlansServiceImpl.java | 21 ++++--- .../service/student/StudentServiceImpl.java | 7 +-- ...DifyArticleClient.java => DifyClient.java} | 57 ++++++++++++++++-- .../enlish/service/utils/WordExportUtil.java | 2 + .../main/resources/config/application-dev.yml | 4 +- .../templates/tem_study_plan_v4.docx | Bin 0 -> 44109 bytes .../yinlihupo/enlish/service/ai/AITest.java | 34 ++++------- .../exam/ExamWordsJudgeServiceTest.java | 6 +- enlish-vue/src/layouts/components/Header.vue | 2 +- enlish-vue/src/pages/Login.vue | 2 +- enlish-vue/src/pages/class.vue | 7 +-- enlish-vue/src/pages/uploadpng.vue | 11 ++-- enlish-vue/src/router/index.js | 2 +- 21 files changed, 147 insertions(+), 59 deletions(-) create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/Sentence.java rename enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/{DifyArticleClient.java => DifyClient.java} (70%) create mode 100644 enlish-service/src/main/resources/templates/tem_study_plan_v4.docx diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/LessonPlanConstant.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/LessonPlanConstant.java index c0e491e..5addc7f 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/LessonPlanConstant.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/LessonPlanConstant.java @@ -3,8 +3,8 @@ package com.yinlihupo.enlish.service.constant; public interface LessonPlanConstant { String TITLE = "Title"; - String PASSAGE = "The Passage"; + String PASSAGE = "ThePassage"; String QUIZ = "Quiz"; - String ANSWER_KEY_EXPLANATION = "Answer Key & Explanation"; - String FULL_TRANSLATION = "Full Translation"; + String ANSWER_KEY_EXPLANATION = "AnswerKey&Explanation"; + String FULL_TRANSLATION = "FullTranslation"; } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ExamWordsController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ExamWordsController.java index 7939ae3..90a7b56 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ExamWordsController.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ExamWordsController.java @@ -113,6 +113,8 @@ public class ExamWordsController { .builder() .id(examWordsJudgeResultDO.getId()) .studentId(examWordsJudgeResultDO.getStudentId()) + .studentName(studentService.getStudentById(examWordsJudgeResultDO.getStudentId()).getName()) + .examWordsTitle(examWordsService.getExamWordsDOById(examWordsJudgeResultDO.getExamWordsId()).getTitle()) .examWordsId(examWordsJudgeResultDO.getExamWordsId()) .startDate(examWordsJudgeResultDO.getStartDate()) .correctWordCount(examWordsJudgeResultDO.getCorrectWordCount()) 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 e43e381..a290f3a 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 @@ -48,6 +48,8 @@ public class StudentController { .id(studentDO.getId()) .name(studentDO.getName()) .classId(studentDO.getClassId()) + .className(classService.findClassById(studentDO.getClassId()).getTitle()) + .gradeName(gradeService.findByClassId(studentDO.getGradeId()).getTitle()) .gradeId(studentDO.getGradeId()) .build()).toList(); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/Sentence.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/Sentence.java new file mode 100644 index 0000000..5d6e016 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/bo/Sentence.java @@ -0,0 +1,27 @@ +package com.yinlihupo.enlish.service.model.bo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class Sentence { + + @JsonProperty("target_word") + private String targetWord; + @JsonProperty("grade_level") + private String gradeLevel; + @JsonProperty("question") + private String question; + @JsonProperty("chinese_clue") + private String chineseClue; + @JsonProperty("correct_answer") + private String correctAnswer; + @JsonProperty("grammar_point") + private String grammarPoint; +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/exam/ExamWordsResultRspVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/exam/ExamWordsResultRspVO.java index 2852b2b..dd9d13e 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/exam/ExamWordsResultRspVO.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/exam/ExamWordsResultRspVO.java @@ -12,6 +12,7 @@ import java.time.LocalDateTime; @Data @Builder public class ExamWordsResultRspVO { + private Integer id; private String ansSheetPath; @@ -20,6 +21,10 @@ public class ExamWordsResultRspVO { private Integer examWordsId; + private String studentName; + + private String examWordsTitle; + private Integer correctWordCount; private Integer wrongWordCount; diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/StudentItemRspVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/StudentItemRspVO.java index c8ab140..2677363 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/StudentItemRspVO.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/student/StudentItemRspVO.java @@ -15,4 +15,6 @@ public class StudentItemRspVO { private String name; private Integer classId; private Integer gradeId; + private String className; + private String gradeName; } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ExamWordsService.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ExamWordsService.java index c909b2d..947b358 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ExamWordsService.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ExamWordsService.java @@ -13,4 +13,6 @@ public interface ExamWordsService { int saveExamWordsPngToDbAndLocal(MultipartFile file); void updateExamWordsWordIdsOrder(ExamWordsDO examWordsDO); + + ExamWordsDO getExamWordsDOById(Integer id); } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/exam/ExamWordsServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/exam/ExamWordsServiceImpl.java index f108894..db7ed69 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/exam/ExamWordsServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/exam/ExamWordsServiceImpl.java @@ -191,5 +191,10 @@ public class ExamWordsServiceImpl implements ExamWordsService { examWordsDOMapper.updateWordIdsOrder(examWordsDO); } + @Override + public ExamWordsDO getExamWordsDOById(Integer id) { + return examWordsDOMapper.selectById(id); + } + } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/plan/LessonPlansServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/plan/LessonPlansServiceImpl.java index 80b02c8..338b236 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/plan/LessonPlansServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/plan/LessonPlansServiceImpl.java @@ -3,14 +3,14 @@ package com.yinlihupo.enlish.service.service.plan; import com.yinlihupo.enlish.service.constant.LessonPlanConstant; import com.yinlihupo.enlish.service.domain.dataobject.*; import com.yinlihupo.enlish.service.domain.mapper.*; +import com.yinlihupo.enlish.service.model.bo.Sentence; import com.yinlihupo.enlish.service.service.LessonPlansService; -import com.yinlihupo.enlish.service.utils.DifyArticleClient; +import com.yinlihupo.enlish.service.utils.DifyClient; import com.yinlihupo.enlish.service.utils.StringToPlanMapUtil; import com.yinlihupo.framework.common.util.JsonUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.checkerframework.checker.nullness.qual.NonNull; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,11 +35,10 @@ public class LessonPlansServiceImpl implements LessonPlansService { @Resource private GradeDOMapper gradeDOMapper; @Resource - private DifyArticleClient difyArticleClient; + private DifyClient difyClient; @Override - @Transactional(rollbackFor = Exception.class) public void generateLessonPlans(Integer studentId, Integer unitId, Integer wordSize) { List vocabularyBankDOS = vocabularyBankDOMapper.selectVocabularyBankDOAllByUnitId(unitId); UnitDO unitDO = unitDOMapper.selectByPrimaryKey(unitId); @@ -57,14 +56,13 @@ public class LessonPlansServiceImpl implements LessonPlansService { int checkTotal = 50; List> weeksSync = new ArrayList<>(); List> weeksGap = new ArrayList<>(); + int j = 0; for (int i = 0; i < 5; i++) { List syncVocabList; if ((i + 1) * wordSize < syncSize) { syncVocabList = vocabularyBankDOS.subList(i * wordSize, (i + 1) * wordSize); - } else if (i == 4) { - syncVocabList = vocabularyBankDOS.subList(i * wordSize, syncSize); } else { - syncVocabList = vocabularyBankDOS.subList((syncSize - i) * wordSize, Math.min((syncSize - i + 1) * wordSize, syncSize)); + syncVocabList = new ArrayList<>(weeksSync.get(Math.min(j++, weeksSync.size() - 1))); } List gapVocabList = vocabularyBankListStudentNotMaster.subList(i * countGap, Math.min(i * countGap + countGap, gapSize)); weeksSync.add(syncVocabList); @@ -119,7 +117,7 @@ public class LessonPlansServiceImpl implements LessonPlansService { studentLessonPlansDOMapper.insert(studentLessonPlansDO); } catch (Exception e) { - throw new RuntimeException(e); + log.info("生成第{}天计划失败,失败原因 {}", i + 1, e.getMessage()); } log.info("生成第{}天计划成功", i + 1); } @@ -241,6 +239,11 @@ public class LessonPlansServiceImpl implements LessonPlansService { data.put("articleBans", mapB.get(LessonPlanConstant.ANSWER_KEY_EXPLANATION)); data.put("articleBtran", mapB.get(LessonPlanConstant.FULL_TRANSLATION)); + // 连词成句 + List sentences = difyClient.sendSentenceAnalyze(syncVocabList.subList(0, Math.max(10, syncVocabList.size())), gradeDO.getTitle()); + data.put("sentences", sentences); + data.put("sentencesAns", sentences); + log.info( "生成连词成句成功"); // LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); // Configure config = Configure.builder() // .bind("syncVocabList", policy) @@ -271,7 +274,7 @@ public class LessonPlansServiceImpl implements LessonPlansService { int i = 0; do { log.info("第{}次生成文章中文开始", ++i); - String answer = difyArticleClient.sendChat(string, String.valueOf(studentId) + UUID.randomUUID(), null).getAnswer(); + String answer = difyClient.sendChat(string, String.valueOf(studentId) + UUID.randomUUID(), null).getAnswer(); map = StringToPlanMapUtil.parseTextToMap(answer); } while (map.get(LessonPlanConstant.TITLE) == null || map.get(LessonPlanConstant.PASSAGE) == null 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 a6a08ea..823beb0 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 @@ -9,11 +9,10 @@ import com.yinlihupo.enlish.service.model.bo.exam.ExamWordsJudgeResultDetail; import com.yinlihupo.enlish.service.model.bo.exam.WordMasteryDetail; import com.yinlihupo.enlish.service.model.vo.student.AddStudentReqVO; import com.yinlihupo.enlish.service.service.StudentService; -import com.yinlihupo.enlish.service.utils.DifyArticleClient; +import com.yinlihupo.enlish.service.utils.DifyClient; import com.yinlihupo.framework.common.util.JsonUtils; import jakarta.annotation.Resource; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -37,7 +36,7 @@ public class StudentServiceImpl implements StudentService { @Resource private ExamWordsJudgeResultDOMapper examWordsJudgeResultDOMapper; @Resource - private DifyArticleClient difyArticleClient; + private DifyClient difyClient; @Resource private RedisTemplate redisTemplate; @Resource @@ -159,7 +158,7 @@ public class StudentServiceImpl implements StudentService { studentStudyInfo.put("单词掌握情况", wordMasteryDetails); try { - String analyze = difyArticleClient.sendStudentAnalyze(JsonUtils.toJsonString(studentStudyInfo)).getAnswer(); + String analyze = difyClient.sendStudentAnalyze(JsonUtils.toJsonString(studentStudyInfo)).getAnswer(); // 设置过期时间 3 天 redisTemplate.opsForValue().set(key, analyze); redisTemplate.expire(key, 3, TimeUnit.DAYS); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/DifyArticleClient.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/DifyClient.java similarity index 70% rename from enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/DifyArticleClient.java rename to enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/DifyClient.java index 997444a..e982ff2 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/DifyArticleClient.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/DifyClient.java @@ -3,6 +3,9 @@ package com.yinlihupo.enlish.service.utils; // 修改为你的包名 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yinlihupo.enlish.service.domain.dataobject.VocabularyBankDO; +import com.yinlihupo.enlish.service.model.bo.Sentence; +import com.yinlihupo.framework.common.util.JsonUtils; import lombok.Data; import lombok.ToString; import org.springframework.beans.factory.annotation.Value; @@ -14,21 +17,25 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component -public class DifyArticleClient { +public class DifyClient { @Value("${ai.key}") private String apiKey; - private String anaKey = "app-hrUFcopdcpnflsvpHWRuBfCp"; + @Value("${ai.analyzeKey}") + private String analyzeKey; + @Value("${ai.sentenceKey}") + private String sentenceKey; @Value("${ai.url}") private String baseUrl; private final HttpClient httpClient; private final ObjectMapper objectMapper; // 构造函数 - public DifyArticleClient() { + public DifyClient() { this.httpClient = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) // 连接超时 @@ -36,6 +43,48 @@ public class DifyArticleClient { this.objectMapper = new ObjectMapper(); } + public List sendSentenceAnalyze(List list, String grade) throws Exception { + // 1. 构建请求体对象 + ChatRequest payload = new ChatRequest(); + payload.setQuery(JsonUtils.toJsonString(list.stream().map(VocabularyBankDO::getWord).toList())); + payload.setUser("admin"); + + HashMap objectObjectHashMap = new HashMap<>(); + objectObjectHashMap.put("grade", grade); + payload.setResponseMode("blocking"); // 使用阻塞模式,一次性返回 + payload.setInputs(objectObjectHashMap); + + // 2. 序列化为 JSON 字符串 + String jsonBody = objectMapper.writeValueAsString(payload); + + // 3. 构建 HTTP 请求 + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(baseUrl)) + .header("Authorization", "Bearer " + sentenceKey) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) + .timeout(Duration.ofSeconds(30)) // 读取超时 + .build(); + + // 4. 发送请求 + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + + // 5. 检查状态码 + if (response.statusCode() != 200) { + throw new RuntimeException("Dify 请求失败: HTTP " + response.statusCode() + " | Body: " + response.body()); + } + + // 6. 反序列化响应体 + DifyResponse difyResponse = objectMapper.readValue(response.body(), DifyResponse.class); + + String answer = difyResponse.getAnswer(); + answer = answer.replace("json", ""); + answer = answer.replace("```", ""); + + return JsonUtils.parseList(answer, Sentence.class); + + } + public DifyResponse sendStudentAnalyze(String query) throws Exception { String endpoint = this.baseUrl; @@ -52,7 +101,7 @@ public class DifyArticleClient { // 3. 构建 HTTP 请求 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(endpoint)) - .header("Authorization", "Bearer " + anaKey) + .header("Authorization", "Bearer " + analyzeKey) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) .timeout(Duration.ofSeconds(30)) // 读取超时 diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/WordExportUtil.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/WordExportUtil.java index 1621afe..169c809 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/WordExportUtil.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/WordExportUtil.java @@ -50,6 +50,8 @@ public class WordExportUtil { .bind("mixedDrill", policyLessonPlanWeekday) .bind("checkList", policyLessonPlanWeekday) .bind("checkListAns", policyLessonPlanWeekday) + .bind("sentences", policyLessonPlanWeekday) + .bind("sentencesAns", policyLessonPlanWeekday) .build(); LoopRowTableRenderPolicy policyLessonPlan = new LoopRowTableRenderPolicy(); diff --git a/enlish-service/src/main/resources/config/application-dev.yml b/enlish-service/src/main/resources/config/application-dev.yml index 17ed3d5..666c7d4 100644 --- a/enlish-service/src/main/resources/config/application-dev.yml +++ b/enlish-service/src/main/resources/config/application-dev.yml @@ -35,7 +35,7 @@ templates: count: 100 data: C:\project\tess plan: - weekday: C:\project\java\enlish_edu\enlish\enlish-service\src\main\resources\templates\tem_study_plan_v3.docx + weekday: C:\project\java\enlish_edu\enlish\enlish-service\src\main\resources\templates\tem_study_plan_v4.docx weekend: C:\project\java\enlish_edu\enlish\enlish-service\src\main\resources\templates\study_plan_review_v1.docx plan_day: 7 tmp: @@ -43,6 +43,8 @@ tmp: ai: key: app-loC6IrJpj4cS54MAYp73QtGl + analyzeKey: app-hrUFcopdcpnflsvpHWRuBfCp + sentenceKey: app-Emk5YQBaD2YruRXuE5sK1vEU url: https://chat.cosonggle.com/v1/chat-messages aliyun: diff --git a/enlish-service/src/main/resources/templates/tem_study_plan_v4.docx b/enlish-service/src/main/resources/templates/tem_study_plan_v4.docx new file mode 100644 index 0000000000000000000000000000000000000000..8840bafde309539f3268a90d7234e74ef579ffe2 GIT binary patch literal 44109 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 `)op$QCz@4hFg$1{7>7#8*b^J2Zx8!ipLe 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 vocabularyBankDOS = vocabularyBankDOMapper.selectVocabularyBankDOAllByUnitId(269); + List sentences = client.sendSentenceAnalyze(vocabularyBankDOS, "小学4年级"); -// // 3. 第二轮对话 (传入上一轮的 conversation_id 以保持记忆) -// System.out.println("\n--- Round 2 ---"); -// // 注意这里传入了 response1.getConversationId() -// DifyClient.DifyResponse response2 = client.sendChat("我刚才说了我叫什么?", userId, response1.getConversationId()); -// -// System.out.println("AI 回复: " + response2.getAnswer()); - - System.out.println("\n--- Round 2 ---"); - Map stringStringMap = StringToPlanMapUtil.parseTextToMap(response1.getAnswer()); - System.out.println(stringStringMap.get("Title")); - System.out.println(stringStringMap.get("The Passage")); - System.out.println(stringStringMap.get("Quiz")); - System.out.println(stringStringMap.get("Answer Key & Explanation")); - System.out.println(stringStringMap.get("Full Translation")); } catch (Exception e) { e.printStackTrace(); diff --git a/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamWordsJudgeServiceTest.java b/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamWordsJudgeServiceTest.java index 50fdea9..aa135ef 100644 --- a/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamWordsJudgeServiceTest.java +++ b/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamWordsJudgeServiceTest.java @@ -9,7 +9,7 @@ import com.yinlihupo.enlish.service.model.bo.CoordinatesXY; import com.yinlihupo.enlish.service.model.bo.StudentExamId; import com.yinlihupo.enlish.service.service.ExamWordsJudgeService; import com.yinlihupo.enlish.service.service.StudentService; -import com.yinlihupo.enlish.service.utils.DifyArticleClient; +import com.yinlihupo.enlish.service.utils.DifyClient; import com.yinlihupo.enlish.service.utils.PngUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -28,7 +28,7 @@ public class ExamWordsJudgeServiceTest { @Resource private StudentService studentService; @Resource - private DifyArticleClient difyArticleClient; + private DifyClient difyClient; @Resource private ExamWordsDOMapper examWordsDOMapper; @Resource @@ -64,7 +64,7 @@ public class ExamWordsJudgeServiceTest { public void selectExamWordsJudgeResult2() { String s = studentService.analyzeStudentStudy(1); try { - DifyArticleClient.DifyResponse difyResponse = difyArticleClient.sendStudentAnalyze(s); + DifyClient.DifyResponse difyResponse = difyClient.sendStudentAnalyze(s); String answer = difyResponse.getAnswer(); log.info("answer:{}", answer); } catch (Exception e) { diff --git a/enlish-vue/src/layouts/components/Header.vue b/enlish-vue/src/layouts/components/Header.vue index 30e4ecd..08342e1 100644 --- a/enlish-vue/src/layouts/components/Header.vue +++ b/enlish-vue/src/layouts/components/Header.vue @@ -59,7 +59,7 @@ aria-current="page">Home
  • - 班级 diff --git a/enlish-vue/src/pages/Login.vue b/enlish-vue/src/pages/Login.vue index 39ac83e..e275006 100644 --- a/enlish-vue/src/pages/Login.vue +++ b/enlish-vue/src/pages/Login.vue @@ -155,7 +155,7 @@ async function userLogin() { if (mode.value === 'login') { try { setToken(data.data) } catch { } ElMessage.success('登录成功') - router.push('/class') + router.push('/') } else { ElMessage.success('注册成功') mode.value = 'login' diff --git a/enlish-vue/src/pages/class.vue b/enlish-vue/src/pages/class.vue index 3876038..59fb2c4 100644 --- a/enlish-vue/src/pages/class.vue +++ b/enlish-vue/src/pages/class.vue @@ -13,7 +13,6 @@
    班级列表
    - @@ -57,10 +56,9 @@ - - - + + - + + +
    diff --git a/enlish-vue/src/router/index.js b/enlish-vue/src/router/index.js index 59a1d5b..48e63e0 100644 --- a/enlish-vue/src/router/index.js +++ b/enlish-vue/src/router/index.js @@ -10,7 +10,7 @@ import Login from '@/pages/Login.vue' // 统一在这里声明所有路由 const routes = [ { - path: '/class', + path: '/', component: Class, meta: { title: '班级'