From 7e3f534ef444deb96c7aecbb2192ec5d54eb9edd Mon Sep 17 00:00:00 2001 From: H1d3rOne Date: Tue, 10 Mar 2026 20:46:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A1=94=E7=BD=97=E7=89=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0AI=E8=A7=A3=E8=AF=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端添加HunYuanAiService调用生成AI解读 - 添加DeductRecord保存测算记录 - 前端传递userId参数 --- .../java/xuan/controller/TaLuoController.java | 97 ++++++++----------- xuan-deduct-uniapp/src/pages/taluo/taluo.vue | 1 + 2 files changed, 41 insertions(+), 57 deletions(-) diff --git a/src/main/java/xuan/controller/TaLuoController.java b/src/main/java/xuan/controller/TaLuoController.java index 34954b1..bed282a 100644 --- a/src/main/java/xuan/controller/TaLuoController.java +++ b/src/main/java/xuan/controller/TaLuoController.java @@ -1,12 +1,24 @@ package xuan.controller; import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; +import xuan.service.DeductRecordService; +import xuan.entity.DeductRecord; +import com.alibaba.fastjson.JSON; + import java.util.*; @RestController @RequestMapping("/api/taluo") public class TaLuoController { + private final HunYuanAiService aiService = new HunYuanAiService(); + + @Autowired + private DeductRecordService recordService; + private static final List> MAJOR_ARCANA = Arrays.asList( createCard(0, "愚者", "The Fool", "新的开始、冒险、天真、自由", "鲁莽、冲动、不负责任", "代表新的旅程和无限可能"), createCard(1, "魔术师", "The Magician", "创造力、技能、意志力、自信", "欺骗、操纵、缺乏计划", "代表运用技能实现目标"), @@ -142,15 +154,38 @@ public class TaLuoController { selectedCards.add(card); } + String interpretation = generateInterpretation(selectedCards, spreadType, request.getQuestion()); + + Map aiData = new HashMap<>(); + aiData.put("question", request.getQuestion()); + aiData.put("spreadName", getSpreadName(spreadType)); + aiData.put("cards", selectedCards); + + String aiAnalysis = aiService.chat( + PromptTemplates.getTaLuoSystemPrompt(), + PromptTemplates.getTaLuoUserPrompt(aiData) + ); + Map data = new HashMap<>(); data.put("spreadType", spreadType); data.put("spreadName", getSpreadName(spreadType)); data.put("question", request.getQuestion()); data.put("cards", selectedCards); - data.put("interpretation", generateInterpretation(selectedCards, spreadType, request.getQuestion())); - data.put("aiAnalysis", generateAiAnalysis(selectedCards, spreadType, request.getQuestion())); + data.put("interpretation", interpretation); + data.put("aiAnalysis", aiAnalysis); data.put("timestamp", new Date()); + DeductRecord record = new DeductRecord(); + record.setUserId(request.getUserId() != null ? request.getUserId() : "default_user"); + record.setType("taluo"); + record.setName(request.getQuestion() != null ? request.getQuestion() : "塔罗占卜"); + record.setInputData(JSON.toJSONString(request)); + record.setResultData(JSON.toJSONString(data)); + record.setAiAnalysis(aiAnalysis); + recordService.saveRecord(record); + + data.put("recordId", record.getId()); + result.put("success", true); result.put("data", data); } catch (Exception e) { @@ -270,61 +305,6 @@ public class TaLuoController { return interpretation.toString(); } - private String generateAiAnalysis(List> cards, String spreadType, String question) { - StringBuilder analysis = new StringBuilder(); - - analysis.append("## 塔罗牌深度解读\n\n"); - - if (question != null && !question.isEmpty()) { - analysis.append("**您的问题:**").append(question).append("\n\n"); - } - - analysis.append("### 牌面分析\n\n"); - - for (Map card : cards) { - String name = (String) card.get("name"); - boolean isReversed = (Boolean) card.get("isReversed"); - String position = (String) card.get("positionMeaning"); - String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning"); - - analysis.append("**").append(position).append(" - ").append(name).append("**"); - analysis.append(isReversed ? "(逆位)\n\n" : "(正位)\n\n"); - analysis.append(meaning).append("\n\n"); - } - - analysis.append("### 综合解读\n\n"); - - if ("single".equals(spreadType)) { - Map card = cards.get(0); - String name = (String) card.get("name"); - boolean isReversed = (Boolean) card.get("isReversed"); - - analysis.append("这张").append(name).append("为您揭示了当前的能量状态。"); - if (isReversed) { - analysis.append("逆位的出现提示您需要关注内在的阻碍和挑战,建议您停下来反思,寻找内在的平衡。"); - } else { - analysis.append("正位的出现表示能量流动顺畅,是采取行动的好时机。"); - } - } else if ("three".equals(spreadType)) { - analysis.append("三张牌阵为您展示了时间的流动:\n\n"); - analysis.append("- **过去**:影响了现在的因素\n"); - analysis.append("- **现在**:当前的状态和挑战\n"); - analysis.append("- **未来**:可能的发展方向\n\n"); - analysis.append("请结合三张牌的含义,理解事情的发展脉络,做出明智的选择。"); - } else if ("celtic".equals(spreadType)) { - analysis.append("凯尔特十字牌阵为您提供了全面的视角:\n\n"); - analysis.append("- **核心区域(1-6)**:揭示问题的核心和内在动力\n"); - analysis.append("- **延伸区域(7-10)**:展示外部环境和未来走向\n\n"); - analysis.append("请仔细体会每张牌的含义,它们共同为您描绘出完整的图景。"); - } - - analysis.append("\n### 建议\n\n"); - analysis.append("塔罗牌是一面镜子,反映您内心的智慧和直觉。请信任自己的判断,"); - analysis.append("将牌面的启示与实际情况结合,做出最适合自己的决定。"); - - return analysis.toString(); - } - @GetMapping("/cards") public Map getAllCards() { Map result = new HashMap<>(); @@ -365,9 +345,12 @@ public class TaLuoController { } public static class TaLuoRequest { + private String userId; private String question; private String spreadType; + public String getUserId() { return userId; } + public void setUserId(String userId) { this.userId = userId; } public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } public String getSpreadType() { return spreadType; } diff --git a/xuan-deduct-uniapp/src/pages/taluo/taluo.vue b/xuan-deduct-uniapp/src/pages/taluo/taluo.vue index 9134e68..9e1bb1d 100644 --- a/xuan-deduct-uniapp/src/pages/taluo/taluo.vue +++ b/xuan-deduct-uniapp/src/pages/taluo/taluo.vue @@ -102,6 +102,7 @@ export default { try { const result = await api.taLuoApi.divine({ + userId: this.userId, question: this.question || '请给我指引', spreadType: this.spreadType })