feat: 集成腾讯混元AI模型,为所有玄学模块添加AI分析功能
- 新增HunYuanAiService服务类,实现腾讯混元API调用 - 新增PromptTemplates提示词模板类,为各模块设计专业提示词 - 修改所有Controller集成AI服务(八字、紫微、六爻、梅花、奇门、大六壬、塔罗、占星) - 修改前端所有结果页面显示AI分析结果 - 添加OkHttp依赖用于HTTP请求
This commit is contained in:
1 parent
db9a63d309
commit
01283f1db7
19 files changed
+1030
-1391
No files matched your search
@@ -1,12 +1,17 @@
|
||||
package xuan.controller;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import xuan.service.HunYuanAiService;
|
||||
import xuan.service.PromptTemplates;
|
||||
|
||||
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", "创造力、技能、意志力、自信", "欺骗、操纵、缺乏计划", "代表运用技能实现目标"),
|
||||
@@ -32,8 +37,6 @@ public class TaLuoController {
|
||||
createCard(21, "世界", "The World", "完成、成就、整合、圆满", "未完成、缺乏闭合、延迟成功", "代表完成和圆满")
|
||||
);
|
||||
|
||||
private static final List<Map<String, Object>> MINOR_ARCANA = createMinorArcana();
|
||||
|
||||
private static Map<String, Object> createCard(int number, String name, String englishName,
|
||||
String uprightMeaning, String reversedMeaning, String description) {
|
||||
Map<String, Object> card = new HashMap<>();
|
||||
@@ -43,82 +46,10 @@ public class TaLuoController {
|
||||
card.put("uprightMeaning", uprightMeaning);
|
||||
card.put("reversedMeaning", reversedMeaning);
|
||||
card.put("description", description);
|
||||
card.put("type", number < 22 ? "major" : "minor");
|
||||
card.put("type", "major");
|
||||
return card;
|
||||
}
|
||||
|
||||
private static List<Map<String, Object>> createMinorArcana() {
|
||||
List<Map<String, Object>> cards = new ArrayList<>();
|
||||
|
||||
String[] suits = {"权杖", "圣杯", "宝剑", "星币"};
|
||||
String[] suitMeanings = {"行动与创造", "情感与关系", "思想与沟通", "物质与现实"};
|
||||
String[] ranks = {"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "侍从", "骑士", "王后", "国王"};
|
||||
|
||||
int cardNumber = 22;
|
||||
for (int suitIndex = 0; suitIndex < suits.length; suitIndex++) {
|
||||
String suit = suits[suitIndex];
|
||||
String suitMeaning = suitMeanings[suitIndex];
|
||||
|
||||
for (int rankIndex = 0; rankIndex < ranks.length; rankIndex++) {
|
||||
String rank = ranks[rankIndex];
|
||||
String cardName = suit + rank;
|
||||
|
||||
Map<String, Object> card = new HashMap<>();
|
||||
card.put("number", cardNumber++);
|
||||
card.put("name", cardName);
|
||||
card.put("englishName", rank + " of " + getSuitEnglish(suit));
|
||||
card.put("suit", suit);
|
||||
card.put("rank", rank);
|
||||
card.put("uprightMeaning", generateUprightMeaning(suit, rank, suitMeaning));
|
||||
card.put("reversedMeaning", generateReversedMeaning(suit, rank, suitMeaning));
|
||||
card.put("description", suitMeaning + "领域的" + getRankDescription(rank));
|
||||
card.put("type", "minor");
|
||||
|
||||
cards.add(card);
|
||||
}
|
||||
}
|
||||
|
||||
return cards;
|
||||
}
|
||||
|
||||
private static String getSuitEnglish(String suit) {
|
||||
switch (suit) {
|
||||
case "权杖": return "Wands";
|
||||
case "圣杯": return "Cups";
|
||||
case "宝剑": return "Swords";
|
||||
case "星币": return "Pentacles";
|
||||
default: return suit;
|
||||
}
|
||||
}
|
||||
|
||||
private static String getRankDescription(String rank) {
|
||||
switch (rank) {
|
||||
case "Ace": return "新的开始";
|
||||
case "Two": return "选择与平衡";
|
||||
case "Three": return "发展与创造";
|
||||
case "Four": return "稳定与基础";
|
||||
case "Five": return "冲突与挑战";
|
||||
case "Six": return "和谐与胜利";
|
||||
case "Seven": return "评估与选择";
|
||||
case "Eight": return "行动与速度";
|
||||
case "Nine": return "接近完成";
|
||||
case "Ten": return "完成与圆满";
|
||||
case "侍从": return "学习与探索";
|
||||
case "骑士": return "行动与追求";
|
||||
case "王后": return "内在智慧";
|
||||
case "国王": return "掌控与权威";
|
||||
default: return rank;
|
||||
}
|
||||
}
|
||||
|
||||
private static String generateUprightMeaning(String suit, String rank, String suitMeaning) {
|
||||
return suitMeaning + "方面的" + getRankDescription(rank) + ",正位时能量流动顺畅";
|
||||
}
|
||||
|
||||
private static String generateReversedMeaning(String suit, String rank, String suitMeaning) {
|
||||
return suitMeaning + "方面的" + getRankDescription(rank) + ",逆位时需要反思调整";
|
||||
}
|
||||
|
||||
@PostMapping("/divine")
|
||||
public Map<String, Object> divine(@RequestBody TaLuoRequest request) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
@@ -126,9 +57,7 @@ public class TaLuoController {
|
||||
String spreadType = request.getSpreadType() != null ? request.getSpreadType() : "single";
|
||||
int cardCount = getCardCount(spreadType);
|
||||
|
||||
List<Map<String, Object>> allCards = new ArrayList<>();
|
||||
allCards.addAll(MAJOR_ARCANA);
|
||||
allCards.addAll(MINOR_ARCANA);
|
||||
List<Map<String, Object>> allCards = new ArrayList<>(MAJOR_ARCANA);
|
||||
|
||||
Collections.shuffle(allCards, new Random());
|
||||
|
||||
@@ -147,10 +76,14 @@ public class TaLuoController {
|
||||
data.put("spreadName", getSpreadName(spreadType));
|
||||
data.put("question", request.getQuestion());
|
||||
data.put("cards", selectedCards);
|
||||
data.put("interpretation", generateInterpretation(selectedCards, spreadType, request.getQuestion()));
|
||||
data.put("summary", generateSummary(selectedCards, spreadType));
|
||||
data.put("timestamp", new Date());
|
||||
|
||||
String aiAnalysis = aiService.chat(
|
||||
PromptTemplates.getTaLuoSystemPrompt(),
|
||||
PromptTemplates.getTaLuoUserPrompt(data)
|
||||
);
|
||||
data.put("aiAnalysis", aiAnalysis);
|
||||
|
||||
result.put("success", true);
|
||||
result.put("data", data);
|
||||
} catch (Exception e) {
|
||||
@@ -206,317 +139,6 @@ public class TaLuoController {
|
||||
return "未知";
|
||||
}
|
||||
|
||||
private String generateInterpretation(List<Map<String, Object>> cards, String spreadType, String question) {
|
||||
StringBuilder interpretation = new StringBuilder();
|
||||
|
||||
if ("single".equals(spreadType)) {
|
||||
Map<String, Object> card = cards.get(0);
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning");
|
||||
|
||||
interpretation.append("您抽到的牌是【").append(name).append("】");
|
||||
interpretation.append(isReversed ? "(逆位)" : "(正位)").append("。\n\n");
|
||||
interpretation.append("牌义解读:").append(meaning).append("。\n\n");
|
||||
interpretation.append((String) card.get("description"));
|
||||
} else if ("three".equals(spreadType)) {
|
||||
interpretation.append("三张牌阵解读:\n\n");
|
||||
|
||||
for (Map<String, Object> 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");
|
||||
|
||||
interpretation.append("【").append(position).append("】");
|
||||
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append("\n");
|
||||
interpretation.append(meaning).append("\n\n");
|
||||
}
|
||||
|
||||
interpretation.append("综合解读:从过去到现在再到未来,牌面展示了事情的发展脉络。");
|
||||
} else if ("celtic".equals(spreadType)) {
|
||||
interpretation.append("凯尔特十字牌阵解读:\n\n");
|
||||
interpretation.append("核心区域(位置1-6):\n");
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
Map<String, Object> card = cards.get(i);
|
||||
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");
|
||||
|
||||
interpretation.append("【").append(position).append("】");
|
||||
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append(":");
|
||||
interpretation.append(meaning).append("\n");
|
||||
}
|
||||
|
||||
interpretation.append("\n延伸区域(位置7-10):\n");
|
||||
|
||||
for (int i = 6; i < 10; i++) {
|
||||
Map<String, Object> card = cards.get(i);
|
||||
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");
|
||||
|
||||
interpretation.append("【").append(position).append("】");
|
||||
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append(":");
|
||||
interpretation.append(meaning).append("\n");
|
||||
}
|
||||
|
||||
interpretation.append("\n综合解读:凯尔特十字牌阵为您提供了全方位的视角,帮助您深入理解问题的各个方面。");
|
||||
}
|
||||
|
||||
return interpretation.toString();
|
||||
}
|
||||
|
||||
private Map<String, String> generateSummary(List<Map<String, Object>> cards, String spreadType) {
|
||||
Map<String, String> summary = new HashMap<>();
|
||||
|
||||
summary.put("personality", generatePersonalityAnalysis(cards));
|
||||
summary.put("emotion", generateEmotionAnalysis(cards));
|
||||
summary.put("career", generateCareerAnalysis(cards));
|
||||
summary.put("overall", generateOverallAdvice(cards, spreadType));
|
||||
|
||||
return summary;
|
||||
}
|
||||
|
||||
private String generatePersonalityAnalysis(List<Map<String, Object>> cards) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
int majorCount = 0;
|
||||
int reversedCount = 0;
|
||||
boolean hasFool = false, hasMagician = false, hasHighPriestess = false, hasEmperor = false;
|
||||
|
||||
for (Map<String, Object> card : cards) {
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String type = (String) card.get("type");
|
||||
|
||||
if ("major".equals(type)) majorCount++;
|
||||
if (isReversed) reversedCount++;
|
||||
|
||||
if ("愚者".equals(name)) hasFool = true;
|
||||
if ("魔术师".equals(name)) hasMagician = true;
|
||||
if ("女祭司".equals(name)) hasHighPriestess = true;
|
||||
if ("皇帝".equals(name)) hasEmperor = true;
|
||||
}
|
||||
|
||||
sb.append("【性格特质】\n");
|
||||
|
||||
if (majorCount > cards.size() / 2) {
|
||||
sb.append("你的内心世界很丰富,经常思考人生的大问题。你是个有深度的人,不满足于表面的东西,总想探索更深层的意义。");
|
||||
} else {
|
||||
sb.append("你是个务实的人,更关注日常生活中的具体事务。你脚踏实地,做事有条理,是个值得信赖的人。");
|
||||
}
|
||||
|
||||
sb.append("\n\n");
|
||||
|
||||
if (reversedCount > cards.size() / 2) {
|
||||
sb.append("最近你可能感到有些迷茫,内心有些矛盾。这是正常的,说明你在反思和成长。给自己一点时间,不要着急。");
|
||||
} else {
|
||||
sb.append("你目前的状态比较积极向上,心态比较平和。继续保持这种状态,会让你更容易应对生活中的挑战。");
|
||||
}
|
||||
|
||||
sb.append("\n\n");
|
||||
|
||||
if (hasFool) {
|
||||
sb.append("你有一颗年轻的心,充满好奇心和冒险精神。你愿意尝试新事物,不怕失败,这是很宝贵的品质。");
|
||||
}
|
||||
if (hasMagician) {
|
||||
sb.append("你很有创造力和执行力,能够把自己的想法变成现实。你善于利用身边的资源,是个有能力的人。");
|
||||
}
|
||||
if (hasHighPriestess) {
|
||||
sb.append("你的直觉很敏锐,常常能感知到别人察觉不到的东西。你善于倾听内心的声音,这是你的优势。");
|
||||
}
|
||||
if (hasEmperor) {
|
||||
sb.append("你有领导才能,善于规划和组织。你做事有原则,有责任感,是个可以依靠的人。");
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private String generateEmotionAnalysis(List<Map<String, Object>> cards) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append("【感情运势】\n");
|
||||
|
||||
boolean hasLovers = false, hasEmpress = false, hasStar = false, hasMoon = false;
|
||||
boolean hasCups = false;
|
||||
int reversedCount = 0;
|
||||
|
||||
for (Map<String, Object> card : cards) {
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String suit = (String) card.get("suit");
|
||||
|
||||
if (isReversed) reversedCount++;
|
||||
if ("恋人".equals(name)) hasLovers = true;
|
||||
if ("女皇".equals(name)) hasEmpress = true;
|
||||
if ("星星".equals(name)) hasStar = true;
|
||||
if ("月亮".equals(name)) hasMoon = true;
|
||||
if ("圣杯".equals(suit)) hasCups = true;
|
||||
}
|
||||
|
||||
if (hasLovers) {
|
||||
sb.append("牌面显示你正在面临或即将面临一个重要的感情选择。这可能是一个转折点,需要你认真思考自己真正想要的是什么。");
|
||||
} else if (hasEmpress) {
|
||||
sb.append("你的感情生活充满温暖和关爱。你懂得如何去爱,也值得被爱。这段时期适合培养和加深感情关系。");
|
||||
} else if (hasStar) {
|
||||
sb.append("感情方面充满希望。如果你在寻找爱情,很快就会遇到让你心动的人。如果已有伴侣,你们的关系会更加和谐美满。");
|
||||
} else if (hasMoon) {
|
||||
sb.append("在感情方面,你可能感到有些困惑或不确定。这可能是因为信息不完整,或者你还没有看清事情的全貌。建议多沟通,不要急于下结论。");
|
||||
} else if (hasCups) {
|
||||
sb.append("你的感情世界比较丰富,最近可能会有一些情感上的波动。这是正常的,说明你对感情很投入。");
|
||||
} else {
|
||||
if (reversedCount > cards.size() / 2) {
|
||||
sb.append("最近感情方面可能有些不太顺利,但这只是暂时的。保持开放的心态,真诚地对待他人,情况会慢慢好转。");
|
||||
} else {
|
||||
sb.append("你的感情生活比较平稳。虽然没有大的波澜,但这种平静也是一种幸福。珍惜身边的人,用心经营感情。");
|
||||
}
|
||||
}
|
||||
|
||||
sb.append("\n\n");
|
||||
sb.append("建议:在感情中要保持真诚和耐心。不要因为一时的情绪波动而做出冲动的决定。多倾听对方的心声,也要勇敢表达自己的感受。");
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private String generateCareerAnalysis(List<Map<String, Object>> cards) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append("【事业发展】\n");
|
||||
|
||||
boolean hasMagician = false, hasEmperor = false, hasChariot = false, hasWheel = false;
|
||||
boolean hasWands = false, hasPentacles = false;
|
||||
int reversedCount = 0;
|
||||
|
||||
for (Map<String, Object> card : cards) {
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String suit = (String) card.get("suit");
|
||||
|
||||
if (isReversed) reversedCount++;
|
||||
if ("魔术师".equals(name)) hasMagician = true;
|
||||
if ("皇帝".equals(name)) hasEmperor = true;
|
||||
if ("战车".equals(name)) hasChariot = true;
|
||||
if ("命运之轮".equals(name)) hasWheel = true;
|
||||
if ("权杖".equals(suit)) hasWands = true;
|
||||
if ("星币".equals(suit)) hasPentacles = true;
|
||||
}
|
||||
|
||||
if (hasMagician) {
|
||||
sb.append("你目前的工作能力很强,能够很好地运用自己的技能和资源。这是个展现才华的好时机,不要害怕表现自己。");
|
||||
} else if (hasEmperor) {
|
||||
sb.append("你在工作中展现出领导才能,善于管理和规划。如果有机会,可以尝试承担更多的责任,这会带来更好的发展机会。");
|
||||
} else if (hasChariot) {
|
||||
sb.append("事业正处于上升期,你的努力正在得到回报。保持这种势头,继续前进,你会取得更大的成功。");
|
||||
} else if (hasWheel) {
|
||||
sb.append("事业方面即将迎来转机,可能是新的机会或者环境的改变。保持开放的心态,抓住机遇,但也要做好充分的准备。");
|
||||
} else if (hasWands) {
|
||||
sb.append("工作中充满活力和创造力,你有很多好的想法和计划。现在是付诸行动的好时机,不要让机会从手中溜走。");
|
||||
} else if (hasPentacles) {
|
||||
sb.append("你的工作比较稳定,财务状况也不错。这是个积累的好时期,为未来打下坚实的基础。");
|
||||
} else {
|
||||
if (reversedCount > cards.size() / 2) {
|
||||
sb.append("最近工作方面可能遇到一些挑战或阻碍。不要灰心,这些困难都是暂时的。调整好心态,寻找解决问题的方法。");
|
||||
} else {
|
||||
sb.append("你的事业发展比较平稳。虽然没有大的突破,但稳扎稳打也是一种进步。继续保持,机会总会来的。");
|
||||
}
|
||||
}
|
||||
|
||||
sb.append("\n\n");
|
||||
sb.append("建议:在工作中要保持学习和成长的心态。不要满足于现状,要不断提升自己的能力。同时,也要注意工作与生活的平衡,不要过度劳累。");
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private String generateOverallAdvice(List<Map<String, Object>> cards, String spreadType) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append("【总体建议】\n\n");
|
||||
|
||||
int reversedCount = 0;
|
||||
int majorCount = 0;
|
||||
boolean hasSun = false, hasWorld = false, hasTower = false, hasDeath = false;
|
||||
|
||||
for (Map<String, Object> card : cards) {
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String type = (String) card.get("type");
|
||||
|
||||
if (isReversed) reversedCount++;
|
||||
if ("major".equals(type)) majorCount++;
|
||||
if ("太阳".equals(name)) hasSun = true;
|
||||
if ("世界".equals(name)) hasWorld = true;
|
||||
if ("塔".equals(name)) hasTower = true;
|
||||
if ("死神".equals(name)) hasDeath = true;
|
||||
}
|
||||
|
||||
if (hasSun || hasWorld) {
|
||||
sb.append("这是一个非常积极的信号!你正走在正确的道路上,未来充满光明和希望。继续保持积极的心态,好事即将发生。\n\n");
|
||||
}
|
||||
|
||||
if (hasTower || hasDeath) {
|
||||
sb.append("牌面显示可能会有一些变化或转折。不要害怕改变,有时候结束是为了更好的开始。接受变化,适应新的情况,你会发现新的机会。\n\n");
|
||||
}
|
||||
|
||||
if (reversedCount > cards.size() / 2) {
|
||||
sb.append("整体来看,你目前可能处于一个需要反思和调整的阶段。这并不是坏事,反而是一个重新审视自己、做出改变的好机会。");
|
||||
} else {
|
||||
sb.append("整体来看,你目前的状态不错,各方面都比较平衡。继续保持,同时也要注意细节,不要因为顺利而掉以轻心。");
|
||||
}
|
||||
|
||||
sb.append("\n\n");
|
||||
|
||||
if (majorCount > cards.size() / 2) {
|
||||
sb.append("这次占卜显示的都是大阿卡纳牌,说明你正在经历或即将经历一些重要的人生阶段。这些经历会让你成长,帮助你更好地理解自己和人生。");
|
||||
}
|
||||
|
||||
sb.append("\n\n最后,记住塔罗牌只是提供指引,真正的决定权在你手中。相信自己的直觉,勇敢地面对生活,你一定能够创造属于自己的美好未来!");
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@GetMapping("/cards")
|
||||
public Map<String, Object> getAllCards() {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
List<Map<String, Object>> allCards = new ArrayList<>();
|
||||
allCards.addAll(MAJOR_ARCANA);
|
||||
allCards.addAll(MINOR_ARCANA);
|
||||
|
||||
result.put("success", true);
|
||||
result.put("data", allCards);
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("error", e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@GetMapping("/card/{number}")
|
||||
public Map<String, Object> getCard(@PathVariable int number) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
List<Map<String, Object>> allCards = new ArrayList<>();
|
||||
allCards.addAll(MAJOR_ARCANA);
|
||||
allCards.addAll(MINOR_ARCANA);
|
||||
|
||||
if (number >= 0 && number < allCards.size()) {
|
||||
result.put("success", true);
|
||||
result.put("data", allCards.get(number));
|
||||
} else {
|
||||
result.put("success", false);
|
||||
result.put("error", "Card not found");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("error", e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static class TaLuoRequest {
|
||||
private String question;
|
||||
private String spreadType;
|
||||
|
||||
Reference in new issue
Block a user