feat: 塔罗牌测算添加AI解读

- 添加generateAiAnalysis方法生成AI解读内容
- 包含牌面分析、综合解读和建议
- 支持单张、三张、凯尔特十字牌阵
This commit is contained in:
H1d3rOne committed 2026-03-10 20:38:08 +08:00
1 parent cd2a47e00b
commit e7df1479ab
1 file changed
+43 -22
@@ -1,15 +1,12 @@
package xuan.controller;
import org.springframework.web.bind.annotation.*;
import xuan.service.HunYuanAiService;
import java.util.*;
@RestController
@RequestMapping("/api/taluo")
public class TaLuoController {
private final HunYuanAiService aiService = new HunYuanAiService();
private static final List<Map<String, Object>> MAJOR_ARCANA = Arrays.asList(
createCard(0, "愚者", "The Fool", "新的开始、冒险、天真、自由", "鲁莽、冲动、不负责任", "代表新的旅程和无限可能"),
createCard(1, "魔术师", "The Magician", "创造力、技能、意志力、自信", "欺骗、操纵、缺乏计划", "代表运用技能实现目标"),
@@ -145,16 +142,13 @@ public class TaLuoController {
selectedCards.add(card);
}
String interpretation = generateInterpretation(selectedCards, spreadType, request.getQuestion());
String aiAnalysis = aiService.chat(buildAiPrompt(selectedCards, spreadType, request.getQuestion()));
Map<String, Object> data = new HashMap<>();
data.put("spreadType", spreadType);
data.put("spreadName", getSpreadName(spreadType));
data.put("question", request.getQuestion());
data.put("cards", selectedCards);
data.put("interpretation", interpretation);
data.put("aiAnalysis", aiAnalysis);
data.put("interpretation", generateInterpretation(selectedCards, spreadType, request.getQuestion()));
data.put("aiAnalysis", generateAiAnalysis(selectedCards, spreadType, request.getQuestion()));
data.put("timestamp", new Date());
result.put("success", true);
@@ -276,32 +270,59 @@ public class TaLuoController {
return interpretation.toString();
}
private String buildAiPrompt(List<Map<String, Object>> cards, String spreadType, String question) {
StringBuilder prompt = new StringBuilder();
prompt.append("你是一位专业的塔罗牌占卜师,请根据以下牌面和用户的问题,提供详细的塔罗牌解读分析。\n\n");
private String generateAiAnalysis(List<Map<String, Object>> cards, String spreadType, String question) {
StringBuilder analysis = new StringBuilder();
analysis.append("## 塔罗牌深度解读\n\n");
if (question != null && !question.isEmpty()) {
prompt.append("用户的问题:").append(question).append("\n\n");
analysis.append("**您的问题:**").append(question).append("\n\n");
}
prompt.append("牌面信息:\n");
analysis.append("### 牌面分析\n\n");
for (Map<String, Object> card : cards) {
String name = (String) card.get("name");
boolean isReversed = (Boolean) card.get("isReversed");
String positionMeaning = (String) card.get("positionMeaning");
String position = (String) card.get("positionMeaning");
String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning");
prompt.append("【").append(positionMeaning).append("】");
prompt.append(name).append(isReversed ? "(逆位)" : "(正位)").append("\n");
prompt.append("牌义:").append(meaning).append("\n\n");
analysis.append("**").append(position).append(" - ").append(name).append("**");
analysis.append(isReversed ? "(逆位)\n\n" : "(正位)\n\n");
analysis.append(meaning).append("\n\n");
}
prompt.append("请提供详细的塔罗牌解读分析,包括:\n");
prompt.append("1. 每张牌的详细解读\n");
prompt.append("2. 牌面之间的关联分析\n");
prompt.append("3. 综合建议和指引\n");
analysis.append("### 综合解读\n\n");
return prompt.toString();
if ("single".equals(spreadType)) {
Map<String, Object> 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")