From 01283f1db7ad400cd4df363f2e0649c55b06a232 Mon Sep 17 00:00:00 2001 From: xuan-bot Date: Sat, 7 Mar 2026 07:43:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=9B=86=E6=88=90=E8=85=BE=E8=AE=AF?= =?UTF-8?q?=E6=B7=B7=E5=85=83AI=E6=A8=A1=E5=9E=8B=EF=BC=8C=E4=B8=BA?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=8E=84=E5=AD=A6=E6=A8=A1=E5=9D=97=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0AI=E5=88=86=E6=9E=90=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增HunYuanAiService服务类,实现腾讯混元API调用 - 新增PromptTemplates提示词模板类,为各模块设计专业提示词 - 修改所有Controller集成AI服务(八字、紫微、六爻、梅花、奇门、大六壬、塔罗、占星) - 修改前端所有结果页面显示AI分析结果 - 添加OkHttp依赖用于HTTP请求 --- pom.xml | 6 + .../java/xuan/controller/BaZiController.java | 34 +- .../xuan/controller/DaLiuRenController.java | 77 +-- .../xuan/controller/LiuYaoController.java | 104 +--- .../xuan/controller/MeiHuaController.java | 114 +--- .../java/xuan/controller/QiMenController.java | 117 +--- .../java/xuan/controller/TaLuoController.java | 404 +------------- .../xuan/controller/ZhanXingController.java | 13 +- .../java/xuan/controller/ZiWeiController.java | 516 +----------------- .../java/xuan/service/HunYuanAiService.java | 188 +++++++ .../java/xuan/service/PromptTemplates.java | 407 ++++++++++++++ xuan-deduct-uniapp/src/pages/bazi/result.vue | 84 +-- .../src/pages/daliuren/result.vue | 27 +- .../src/pages/liuyao/result.vue | 66 ++- .../src/pages/meihua/result.vue | 66 ++- xuan-deduct-uniapp/src/pages/qimen/result.vue | 55 ++ xuan-deduct-uniapp/src/pages/taluo/result.vue | 34 +- .../src/pages/zhanxing/result.vue | 30 +- xuan-deduct-uniapp/src/pages/ziwei/result.vue | 79 +-- 19 files changed, 1030 insertions(+), 1391 deletions(-) create mode 100644 src/main/java/xuan/service/HunYuanAiService.java create mode 100644 src/main/java/xuan/service/PromptTemplates.java diff --git a/pom.xml b/pom.xml index 6570d63..b09f9ae 100644 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,12 @@ lunar ${lunar.version} + + + com.squareup.okhttp3 + okhttp + 4.9.3 + diff --git a/src/main/java/xuan/controller/BaZiController.java b/src/main/java/xuan/controller/BaZiController.java index 2c11f54..6e77653 100644 --- a/src/main/java/xuan/controller/BaZiController.java +++ b/src/main/java/xuan/controller/BaZiController.java @@ -5,7 +5,8 @@ import xuan.core.bazi.BaZi; import xuan.core.bazi.settings.BaZiJiChuSetting; import xuan.core.bazi.settings.BaZiShenShaSetting; import xuan.core.bazi.settings.BaZiGanZhiLiuYiSetting; -import xuan.core.bazi.utils.BaZiAnalysisUtil; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; import java.util.HashMap; import java.util.Map; @@ -14,6 +15,8 @@ import java.util.Map; @RequestMapping("/api/bazi") public class BaZiController { + private final HunYuanAiService aiService = new HunYuanAiService(); + @PostMapping("/paipan") public Map paiPan(@RequestBody BaZiRequest request) { Map result = new HashMap<>(); @@ -38,8 +41,16 @@ public class BaZiController { baZi.baZiShenShaSetting(new BaZiShenShaSetting()); baZi.baZiGanZhiLiuYiSetting(new BaZiGanZhiLiuYiSetting()); + Map data = buildBaZiData(baZi); + + String aiAnalysis = aiService.chat( + PromptTemplates.getBaZiSystemPrompt(), + PromptTemplates.getBaZiUserPrompt(data) + ); + data.put("aiAnalysis", aiAnalysis); + result.put("success", true); - result.put("data", buildBaZiData(baZi)); + result.put("data", data); } catch (Exception e) { result.put("success", false); result.put("error", e.getMessage()); @@ -79,27 +90,9 @@ public class BaZiController { data.put("monthGanZhiShenSha", baZi.getMonthGanZhiShenSha()); data.put("dayGanZhiShenSha", baZi.getDayGanZhiShenSha()); data.put("hourGanZhiShenSha", baZi.getHourGanZhiShenSha()); - - data.put("analysis", buildAnalysis(baZi)); return data; } - private Map buildAnalysis(BaZi baZi) { - Map analysis = new HashMap<>(); - - BaZiAnalysisUtil analysisUtil = new BaZiAnalysisUtil(baZi); - - analysis.put("summary", analysisUtil.generateSummary()); - analysis.put("personality", analysisUtil.generatePersonality()); - analysis.put("career", analysisUtil.generateCareer()); - analysis.put("marriage", analysisUtil.generateMarriage()); - analysis.put("wealth", analysisUtil.generateWealth()); - analysis.put("health", analysisUtil.generateHealth()); - analysis.put("advice", analysisUtil.generateAdvice()); - - return analysis; - } - public static class BaZiRequest { private String name; private String occupy; @@ -145,5 +138,4 @@ public class BaZiController { public Integer getDayGanZhiType() { return dayGanZhiType; } public void setDayGanZhiType(Integer dayGanZhiType) { this.dayGanZhiType = dayGanZhiType; } } - } diff --git a/src/main/java/xuan/controller/DaLiuRenController.java b/src/main/java/xuan/controller/DaLiuRenController.java index e9b60fb..fe2c89e 100644 --- a/src/main/java/xuan/controller/DaLiuRenController.java +++ b/src/main/java/xuan/controller/DaLiuRenController.java @@ -4,6 +4,8 @@ import org.springframework.web.bind.annotation.*; import xuan.core.daliuren.DaLiuRen; import xuan.core.daliuren.settings.DaLiuRenJiChuSetting; import xuan.core.daliuren.settings.DaLiuRenShenShaSetting; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; import java.util.*; @@ -11,6 +13,8 @@ import java.util.*; @RequestMapping("/api/daliuren") public class DaLiuRenController { + private final HunYuanAiService aiService = new HunYuanAiService(); + @PostMapping("/paipan") public Map paiPan(@RequestBody DaLiuRenRequest request) { Map result = new HashMap<>(); @@ -32,8 +36,16 @@ public class DaLiuRenController { DaLiuRen daLiuRen = new DaLiuRen(setting); daLiuRen.daLiuRenShenShaSetting(new DaLiuRenShenShaSetting()); + Map data = buildDaLiuRenData(daLiuRen); + + String aiAnalysis = aiService.chat( + PromptTemplates.getDaLiuRenSystemPrompt(), + PromptTemplates.getDaLiuRenUserPrompt(data) + ); + data.put("aiAnalysis", aiAnalysis); + result.put("success", true); - result.put("data", buildDaLiuRenData(daLiuRen)); + result.put("data", data); } catch (Exception e) { result.put("success", false); result.put("error", e.getMessage()); @@ -52,85 +64,24 @@ public class DaLiuRenController { data.put("solar", daLiuRen.getSolarStr2()); data.put("lunar", daLiuRen.getLunarStr2()); - data.put("xingQi", daLiuRen.getXingQi()); - data.put("jiJie", daLiuRen.getJiJie()); data.put("shengXiao", daLiuRen.getShengXiao()); - data.put("xingZuo", daLiuRen.getXingZuo()); data.put("yearGanZhi", daLiuRen.getYearGanZhi()); data.put("monthGanZhi", daLiuRen.getMonthGanZhi()); data.put("dayGanZhi", daLiuRen.getDayGanZhi()); data.put("hourGanZhi", daLiuRen.getHourGanZhi()); - data.put("yearGan", daLiuRen.getYearGan()); - data.put("monthGan", daLiuRen.getMonthGan()); - data.put("dayGan", daLiuRen.getDayGan()); - data.put("hourGan", daLiuRen.getHourGan()); - - data.put("yearZhi", daLiuRen.getYearZhi()); - data.put("monthZhi", daLiuRen.getMonthZhi()); - data.put("dayZhi", daLiuRen.getDayZhi()); - data.put("hourZhi", daLiuRen.getHourZhi()); - - data.put("yearGanWuXing", daLiuRen.getYearGanWuXing()); - data.put("monthGanWuXing", daLiuRen.getMonthGanWuXing()); - data.put("dayGanWuXing", daLiuRen.getDayGanWuXing()); - data.put("hourGanWuXing", daLiuRen.getHourGanWuXing()); - - data.put("yearZhiWuXing", daLiuRen.getYearZhiWuXing()); - data.put("monthZhiWuXing", daLiuRen.getMonthZhiWuXing()); - data.put("dayZhiWuXing", daLiuRen.getDayZhiWuXing()); - data.put("hourZhiWuXing", daLiuRen.getHourZhiWuXing()); - - data.put("yearGanZhiNaYin", daLiuRen.getYearGanZhiNaYin()); - data.put("monthGanZhiNaYin", daLiuRen.getMonthGanZhiNaYin()); - data.put("dayGanZhiNaYin", daLiuRen.getDayGanZhiNaYin()); - data.put("hourGanZhiNaYin", daLiuRen.getHourGanZhiNaYin()); - - data.put("yearGanZhiKongWang", daLiuRen.getYearGanZhiKongWang()); - data.put("monthGanZhiKongWang", daLiuRen.getMonthGanZhiKongWang()); - data.put("dayGanZhiKongWang", daLiuRen.getDayGanZhiKongWang()); - data.put("hourGanZhiKongWang", daLiuRen.getHourGanZhiKongWang()); - - data.put("wuXingWangShuai", daLiuRen.getWuXingWangShuai()); - - data.put("prevJie", daLiuRen.getPrevJie()); - data.put("nextJie", daLiuRen.getNextJie()); - data.put("prevJieDateStr", daLiuRen.getPrevJieDateStr()); - data.put("nextJieDateStr", daLiuRen.getNextJieDateStr()); - data.put("prevJieDay", daLiuRen.getPrevJieDay()); - data.put("nextJieDay", daLiuRen.getNextJieDay()); data.put("chuShengJie", daLiuRen.getChuShengJie()); - - data.put("prevQi", daLiuRen.getPrevQi()); - data.put("nextQi", daLiuRen.getNextQi()); - data.put("prevQiDateStr", daLiuRen.getPrevQiDateStr()); - data.put("nextQiDateStr", daLiuRen.getNextQiDateStr()); - data.put("prevQiDay", daLiuRen.getPrevQiDay()); - data.put("nextQiDay", daLiuRen.getNextQiDay()); - data.put("chuShengQi", daLiuRen.getChuShengQi()); - - data.put("yueXiang", daLiuRen.getYueXiang()); data.put("yueJiang", daLiuRen.getYueJiang()); - data.put("yueJiangShen", daLiuRen.getYueJiangShen()); - - data.put("wuBuYuShi", daLiuRen.getWuBuYuShi()); data.put("tianDiPanType", daLiuRen.getTianDiPanType()); - data.put("tianGan", daLiuRen.getTianGan()); - data.put("diPan", daLiuRen.getDiPan()); data.put("tianPan", daLiuRen.getTianPan()); - data.put("shenPan", daLiuRen.getShenPan()); + data.put("diPan", daLiuRen.getDiPan()); data.put("siKe", daLiuRen.getSiKe()); - data.put("siKeDunGan", daLiuRen.getSiKeDunGan()); - data.put("siKeShenJiang", daLiuRen.getSiKeShenJiang()); - data.put("sanChuan", daLiuRen.getSanChuan()); data.put("sanChuanDunGan", daLiuRen.getSanChuanDunGan()); - data.put("sanChuanShenJiang", daLiuRen.getSanChuanShenJiang()); data.put("sanChuanLiuQin", daLiuRen.getSanChuanLiuQin()); - data.put("sanChuanQuFa", daLiuRen.getSanChuanQuFa()); return data; } diff --git a/src/main/java/xuan/controller/LiuYaoController.java b/src/main/java/xuan/controller/LiuYaoController.java index 09bf3b4..f94bf7e 100644 --- a/src/main/java/xuan/controller/LiuYaoController.java +++ b/src/main/java/xuan/controller/LiuYaoController.java @@ -4,6 +4,8 @@ import org.springframework.web.bind.annotation.*; import xuan.core.liuyao.LiuYao; import xuan.core.liuyao.settings.LiuYaoJiChuSetting; import xuan.core.liuyao.settings.LiuYaoShenShaSetting; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; import java.util.HashMap; import java.util.Map; @@ -12,6 +14,8 @@ import java.util.Map; @RequestMapping("/api/liuyao") public class LiuYaoController { + private final HunYuanAiService aiService = new HunYuanAiService(); + @PostMapping("/paipan") public Map paiPan(@RequestBody LiuYaoRequest request) { Map result = new HashMap<>(); @@ -44,8 +48,16 @@ public class LiuYaoController { LiuYao liuYao = new LiuYao(setting); liuYao.liuYaoShenShaSetting(new LiuYaoShenShaSetting()); + Map data = buildLiuYaoData(liuYao); + + String aiAnalysis = aiService.chat( + PromptTemplates.getLiuYaoSystemPrompt(), + PromptTemplates.getLiuYaoUserPrompt(data) + ); + data.put("aiAnalysis", aiAnalysis); + result.put("success", true); - result.put("data", buildLiuYaoData(liuYao)); + result.put("data", data); } catch (Exception e) { result.put("success", false); result.put("error", e.getMessage()); @@ -57,6 +69,7 @@ public class LiuYaoController { Map data = new HashMap<>(); data.put("name", liuYao.getName()); + data.put("occupy", liuYao.getOccupy()); data.put("sex", liuYao.getSex()); data.put("age", liuYao.getAge()); data.put("solar", liuYao.getSolarStr2()); @@ -84,101 +97,13 @@ public class LiuYaoController { data.put("zongGuaName", liuYao.getZongGuaName()); data.put("fuGuaName", liuYao.getFuGuaName()); - data.put("shangGuaAs", liuYao.getShangGuaAs()); - data.put("xiaGuaAs", liuYao.getXiaGuaAs()); - data.put("benGuaAs", liuYao.getBenGuaAs()); - data.put("bianGuaAs", liuYao.getBianGuaAs()); - data.put("huGuaAs", liuYao.getHuGuaAs()); - data.put("cuoGuaAs", liuYao.getCuoGuaAs()); - data.put("zongGuaAs", liuYao.getZongGuaAs()); - data.put("fuGuaAs", liuYao.getFuGuaAs()); - - data.put("benGuaType", liuYao.getBenGuaType()); - data.put("bianGuaType", liuYao.getBianGuaType()); - data.put("huGuaType", liuYao.getHuGuaType()); - data.put("cuoGuaType", liuYao.getCuoGuaType()); - data.put("zongGuaType", liuYao.getZongGuaType()); - data.put("fuGuaType", liuYao.getFuGuaType()); - - data.put("benGuaGuaShen", liuYao.getBenGuaGuaShen()); - data.put("bianGuaGuaShen", liuYao.getBianGuaGuaShen()); - data.put("huGuaGuaShen", liuYao.getHuGuaGuaShen()); - data.put("cuoGuaGuaShen", liuYao.getCuoGuaGuaShen()); - data.put("zongGuaGuaShen", liuYao.getZongGuaGuaShen()); - data.put("fuGuaGuaShen", liuYao.getFuGuaGuaShen()); - data.put("benGuaGuaCi", liuYao.getBenGuaGuaCi()); data.put("bianGuaGuaCi", liuYao.getBianGuaGuaCi()); - data.put("huGuaGuaCi", liuYao.getHuGuaGuaCi()); - data.put("cuoGuaGuaCi", liuYao.getCuoGuaGuaCi()); - data.put("zongGuaGuaCi", liuYao.getZongGuaGuaCi()); - data.put("fuGuaGuaCi", liuYao.getFuGuaGuaCi()); data.put("benGuaLiuYaoName", liuYao.getBenGuaLiuYaoName()); - data.put("bianGuaLiuYaoName", liuYao.getBianGuaLiuYaoName()); - data.put("huGuaLiuYaoName", liuYao.getHuGuaLiuYaoName()); - data.put("cuoGuaLiuYaoName", liuYao.getCuoGuaLiuYaoName()); - data.put("zongGuaLiuYaoName", liuYao.getZongGuaLiuYaoName()); - data.put("fuGuaLiuYaoName", liuYao.getFuGuaLiuYaoName()); - - data.put("benGuaLiuYaoAs", liuYao.getBenGuaLiuYaoAs()); - data.put("bianGuaLiuYaoAs", liuYao.getBianGuaLiuYaoAs()); - data.put("huGuaLiuYaoAs", liuYao.getHuGuaLiuYaoAs()); - data.put("cuoGuaLiuYaoAs", liuYao.getCuoGuaLiuYaoAs()); - data.put("zongGuaLiuYaoAs", liuYao.getZongGuaLiuYaoAs()); - data.put("fuGuaLiuYaoAs", liuYao.getFuGuaLiuYaoAs()); - data.put("benGuaLiuYaoShiYing", liuYao.getBenGuaLiuYaoShiYing()); - data.put("bianGuaLiuYaoShiYing", liuYao.getBianGuaLiuYaoShiYing()); - data.put("huGuaLiuYaoShiYing", liuYao.getHuGuaLiuYaoShiYing()); - data.put("cuoGuaLiuYaoShiYing", liuYao.getCuoGuaLiuYaoShiYing()); - data.put("zongGuaLiuYaoShiYing", liuYao.getZongGuaLiuYaoShiYing()); - data.put("fuGuaLiuYaoShiYing", liuYao.getFuGuaLiuYaoShiYing()); - data.put("benGuaLiuYaoLiuQin", liuYao.getBenGuaLiuYaoLiuQin()); - data.put("bianGuaLiuYaoLiuQin", liuYao.getBianGuaLiuYaoLiuQin()); - data.put("huGuaLiuYaoLiuQin", liuYao.getHuGuaLiuYaoLiuQin()); - data.put("cuoGuaLiuYaoLiuQin", liuYao.getCuoGuaLiuYaoLiuQin()); - data.put("zongGuaLiuYaoLiuQin", liuYao.getZongGuaLiuYaoLiuQin()); - data.put("fuGuaLiuYaoLiuQin", liuYao.getFuGuaLiuYaoLiuQin()); - - data.put("benGuaLiuYaoGanZhi", liuYao.getBenGuaLiuYaoGanZhi()); - data.put("bianGuaLiuYaoGanZhi", liuYao.getBianGuaLiuYaoGanZhi()); - data.put("huGuaLiuYaoGanZhi", liuYao.getHuGuaLiuYaoGanZhi()); - data.put("cuoGuaLiuYaoGanZhi", liuYao.getCuoGuaLiuYaoGanZhi()); - data.put("zongGuaLiuYaoGanZhi", liuYao.getZongGuaLiuYaoGanZhi()); - data.put("fuGuaLiuYaoGanZhi", liuYao.getFuGuaLiuYaoGanZhi()); - - data.put("benGuaLiuYaoWuXing", liuYao.getBenGuaLiuYaoWuXing()); - data.put("bianGuaLiuYaoWuXing", liuYao.getBianGuaLiuYaoWuXing()); - data.put("huGuaLiuYaoWuXing", liuYao.getHuGuaLiuYaoWuXing()); - data.put("cuoGuaLiuYaoWuXing", liuYao.getCuoGuaLiuYaoWuXing()); - data.put("zongGuaLiuYaoWuXing", liuYao.getZongGuaLiuYaoWuXing()); - data.put("fuGuaLiuYaoWuXing", liuYao.getFuGuaLiuYaoWuXing()); - data.put("benGuaLiuYaoLiuShen", liuYao.getBenGuaLiuYaoLiuShen()); - data.put("bianGuaLiuYaoLiuShen", liuYao.getBianGuaLiuYaoLiuShen()); - data.put("huGuaLiuYaoLiuShen", liuYao.getHuGuaLiuYaoLiuShen()); - data.put("cuoGuaLiuYaoLiuShen", liuYao.getCuoGuaLiuYaoLiuShen()); - data.put("zongGuaLiuYaoLiuShen", liuYao.getZongGuaLiuYaoLiuShen()); - data.put("fuGuaLiuYaoLiuShen", liuYao.getFuGuaLiuYaoLiuShen()); - - data.put("benGuaLiuYaoYaoCi", liuYao.getBenGuaLiuYaoYaoCi()); - data.put("bianGuaLiuYaoYaoCi", liuYao.getBianGuaLiuYaoYaoCi()); - data.put("huGuaLiuYaoYaoCi", liuYao.getHuGuaLiuYaoYaoCi()); - data.put("cuoGuaLiuYaoYaoCi", liuYao.getCuoGuaLiuYaoYaoCi()); - data.put("zongGuaLiuYaoYaoCi", liuYao.getZongGuaLiuYaoYaoCi()); - data.put("fuGuaLiuYaoYaoCi", liuYao.getFuGuaLiuYaoYaoCi()); - - data.put("benGuaLiuYaoNaYin", liuYao.getBenGuaLiuYaoNaYin()); - data.put("bianGuaLiuYaoNaYin", liuYao.getBianGuaLiuYaoNaYin()); - data.put("huGuaLiuYaoNaYin", liuYao.getHuGuaLiuYaoNaYin()); - data.put("cuoGuaLiuYaoNaYin", liuYao.getCuoGuaLiuYaoNaYin()); - data.put("zongGuaLiuYaoNaYin", liuYao.getZongGuaLiuYaoNaYin()); - data.put("fuGuaLiuYaoNaYin", liuYao.getFuGuaLiuYaoNaYin()); - - data.put("fuGuaLiuYaoFuShen", liuYao.getFuGuaLiuYaoFuShen()); - data.put("shenSha", liuYao.getShenSha()); return data; } @@ -225,5 +150,4 @@ public class LiuYaoController { public String getLiuYaoYaoXiang() { return liuYaoYaoXiang; } public void setLiuYaoYaoXiang(String liuYaoYaoXiang) { this.liuYaoYaoXiang = liuYaoYaoXiang; } } - } diff --git a/src/main/java/xuan/controller/MeiHuaController.java b/src/main/java/xuan/controller/MeiHuaController.java index df6d1cb..670e29a 100644 --- a/src/main/java/xuan/controller/MeiHuaController.java +++ b/src/main/java/xuan/controller/MeiHuaController.java @@ -3,6 +3,8 @@ package xuan.controller; import org.springframework.web.bind.annotation.*; import xuan.core.meihua.MeiHua; import xuan.core.meihua.settings.MeiHuaJiChuSetting; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; import java.util.HashMap; import java.util.Map; @@ -11,6 +13,8 @@ import java.util.Map; @RequestMapping("/api/meihua") public class MeiHuaController { + private final HunYuanAiService aiService = new HunYuanAiService(); + @PostMapping("/paipan") public Map paiPan(@RequestBody MeiHuaRequest request) { Map result = new HashMap<>(); @@ -37,8 +41,16 @@ public class MeiHuaController { MeiHua meiHua = new MeiHua(setting); + Map data = buildMeiHuaData(meiHua); + + String aiAnalysis = aiService.chat( + PromptTemplates.getMeiHuaSystemPrompt(), + PromptTemplates.getMeiHuaUserPrompt(data) + ); + data.put("aiAnalysis", aiAnalysis); + result.put("success", true); - result.put("data", buildMeiHuaData(meiHua)); + result.put("data", data); } catch (Exception e) { result.put("success", false); result.put("error", e.getMessage()); @@ -50,6 +62,7 @@ public class MeiHuaController { Map data = new HashMap<>(); data.put("name", meiHua.getName()); + data.put("occupy", meiHua.getOccupy()); data.put("sex", meiHua.getSex()); data.put("age", meiHua.getAge()); data.put("solar", meiHua.getSolarStr2()); @@ -58,120 +71,22 @@ public class MeiHuaController { data.put("jiJie", meiHua.getJiJie()); data.put("shengXiao", meiHua.getShengXiao()); data.put("xingZuo", meiHua.getXingZuo()); - data.put("yueXiang", meiHua.getYueXiang()); - data.put("yueJiang", meiHua.getYueJiang()); - data.put("yueJiangShen", meiHua.getYueJiangShen()); - data.put("wuBuYuShi", meiHua.getWuBuYuShi()); data.put("yearGanZhi", meiHua.getYearGanZhi()); data.put("monthGanZhi", meiHua.getMonthGanZhi()); data.put("dayGanZhi", meiHua.getDayGanZhi()); data.put("hourGanZhi", meiHua.getHourGanZhi()); - data.put("yearGanZhiWuXing", meiHua.getYearGanZhiWuXing()); - data.put("monthGanZhiWuXing", meiHua.getMonthGanZhiWuXing()); - data.put("dayGanZhiWuXing", meiHua.getDayGanZhiWuXing()); - data.put("hourGanZhiWuXing", meiHua.getHourGanZhiWuXing()); - - data.put("yearGanZhiNaYin", meiHua.getYearGanZhiNaYin()); - data.put("monthGanZhiNaYin", meiHua.getMonthGanZhiNaYin()); - data.put("dayGanZhiNaYin", meiHua.getDayGanZhiNaYin()); - data.put("hourGanZhiNaYin", meiHua.getHourGanZhiNaYin()); - - data.put("yearGanZhiKongWang", meiHua.getYearGanZhiKongWang()); - data.put("monthGanZhiKongWang", meiHua.getMonthGanZhiKongWang()); - data.put("dayGanZhiKongWang", meiHua.getDayGanZhiKongWang()); - data.put("hourGanZhiKongWang", meiHua.getHourGanZhiKongWang()); - - data.put("prevJie", meiHua.getPrevJie()); - data.put("prevJieDateStr", meiHua.getPrevJieDateStr()); - data.put("prevJieDay", meiHua.getPrevJieDay()); - data.put("nextJie", meiHua.getNextJie()); - data.put("nextJieDateStr", meiHua.getNextJieDateStr()); - data.put("nextJieDay", meiHua.getNextJieDay()); - data.put("chuShengJie", meiHua.getChuShengJie()); - - data.put("prevQi", meiHua.getPrevQi()); - data.put("prevQiDateStr", meiHua.getPrevQiDateStr()); - data.put("prevQiDay", meiHua.getPrevQiDay()); - data.put("nextQi", meiHua.getNextQi()); - data.put("nextQiDateStr", meiHua.getNextQiDateStr()); - data.put("nextQiDay", meiHua.getNextQiDay()); - data.put("chuShengQi", meiHua.getChuShengQi()); - data.put("shangGuaName", meiHua.getShangGuaName()); data.put("xiaGuaName", meiHua.getXiaGuaName()); data.put("benGuaName", meiHua.getBenGuaName()); data.put("bianGuaName", meiHua.getBianGuaName()); - data.put("huGuaName", meiHua.getHuGuaName()); - data.put("cuoGuaName", meiHua.getCuoGuaName()); - data.put("zongGuaName", meiHua.getZongGuaName()); - - data.put("shangGuaAs", meiHua.getShangGuaAs()); - data.put("xiaGuaAs", meiHua.getXiaGuaAs()); - data.put("benGuaAs", meiHua.getBenGuaAs()); - data.put("bianGuaAs", meiHua.getBianGuaAs()); - data.put("huGuaAs", meiHua.getHuGuaAs()); - data.put("cuoGuaAs", meiHua.getCuoGuaAs()); - data.put("zongGuaAs", meiHua.getZongGuaAs()); data.put("benGuaGuaCi", meiHua.getBenGuaGuaCi()); data.put("bianGuaGuaCi", meiHua.getBianGuaGuaCi()); - data.put("huGuaGuaCi", meiHua.getHuGuaGuaCi()); - data.put("cuoGuaGuaCi", meiHua.getCuoGuaGuaCi()); - data.put("zongGuaGuaCi", meiHua.getZongGuaGuaCi()); - - data.put("benGuaShangGuaName", meiHua.getBenGuaShangGuaName()); - data.put("bianGuaShangGuaName", meiHua.getBianGuaShangGuaName()); - data.put("huGuaShangGuaName", meiHua.getHuGuaShangGuaName()); - data.put("cuoGuaShangGuaName", meiHua.getCuoGuaShangGuaName()); - data.put("zongGuaShangGuaName", meiHua.getZongGuaShangGuaName()); - - data.put("benGuaXiaGuaName", meiHua.getBenGuaXiaGuaName()); - data.put("bianGuaXiaGuaName", meiHua.getBianGuaXiaGuaName()); - data.put("huGuaXiaGuaName", meiHua.getHuGuaXiaGuaName()); - data.put("cuoGuaXiaGuaName", meiHua.getCuoGuaXiaGuaName()); - data.put("zongGuaXiaGuaName", meiHua.getZongGuaXiaGuaName()); - - data.put("benGuaShangGuaAs", meiHua.getBenGuaShangGuaAs()); - data.put("bianGuaShangGuaAs", meiHua.getBianGuaShangGuaAs()); - data.put("huGuaShangGuaAs", meiHua.getHuGuaShangGuaAs()); - data.put("cuoGuaShangGuaAs", meiHua.getCuoGuaShangGuaAs()); - data.put("zongGuaShangGuaAs", meiHua.getZongGuaShangGuaAs()); - - data.put("benGuaXiaGuaAs", meiHua.getBenGuaXiaGuaAs()); - data.put("bianGuaXiaGuaAs", meiHua.getBianGuaXiaGuaAs()); - data.put("huGuaXiaGuaAs", meiHua.getHuGuaXiaGuaAs()); - data.put("cuoGuaXiaGuaAs", meiHua.getCuoGuaXiaGuaAs()); - data.put("zongGuaXiaGuaAs", meiHua.getZongGuaXiaGuaAs()); data.put("benGuaLiuYaoName", meiHua.getBenGuaLiuYaoName()); - data.put("bianGuaLiuYaoName", meiHua.getBianGuaLiuYaoName()); - data.put("huGuaLiuYaoName", meiHua.getHuGuaLiuYaoName()); - data.put("cuoGuaLiuYaoName", meiHua.getCuoGuaLiuYaoName()); - data.put("zongGuaLiuYaoName", meiHua.getZongGuaLiuYaoName()); - - data.put("benGuaLiuYaoAs", meiHua.getBenGuaLiuYaoAs()); - data.put("bianGuaLiuYaoAs", meiHua.getBianGuaLiuYaoAs()); - data.put("huGuaLiuYaoAs", meiHua.getHuGuaLiuYaoAs()); - data.put("cuoGuaLiuYaoAs", meiHua.getCuoGuaLiuYaoAs()); - data.put("zongGuaLiuYaoAs", meiHua.getZongGuaLiuYaoAs()); - - data.put("benGuaLiuYaoYaoCi", meiHua.getBenGuaLiuYaoYaoCi()); - data.put("bianGuaLiuYaoYaoCi", meiHua.getBianGuaLiuYaoYaoCi()); - data.put("huGuaLiuYaoYaoCi", meiHua.getHuGuaLiuYaoYaoCi()); - data.put("cuoGuaLiuYaoYaoCi", meiHua.getCuoGuaLiuYaoYaoCi()); - data.put("zongGuaLiuYaoYaoCi", meiHua.getZongGuaLiuYaoYaoCi()); - - data.put("benGuaLink", meiHua.getBenGuaLink()); - data.put("bianGuaLink", meiHua.getBianGuaLink()); - data.put("huGuaLink", meiHua.getHuGuaLink()); - data.put("cuoGuaLink", meiHua.getCuoGuaLink()); - data.put("zongGuaLink", meiHua.getZongGuaLink()); - - data.put("dongYao", meiHua.getDongYao()); data.put("dongYaoStr", meiHua.getDongYaoStr()); - data.put("guaMa", meiHua.getGuaMa()); return data; } @@ -233,5 +148,4 @@ public class MeiHuaController { public Integer getDongYaoType() { return dongYaoType; } public void setDongYaoType(Integer dongYaoType) { this.dongYaoType = dongYaoType; } } - } diff --git a/src/main/java/xuan/controller/QiMenController.java b/src/main/java/xuan/controller/QiMenController.java index cb35273..f31f8ea 100644 --- a/src/main/java/xuan/controller/QiMenController.java +++ b/src/main/java/xuan/controller/QiMenController.java @@ -3,6 +3,8 @@ package xuan.controller; import org.springframework.web.bind.annotation.*; import xuan.core.qimen.zhuan.QiMenZhuanPan; import xuan.core.qimen.zhuan.settings.QiMenZhuanPanJiChuSetting; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; import java.util.HashMap; import java.util.Map; @@ -11,6 +13,8 @@ import java.util.Map; @RequestMapping("/api/qimen") public class QiMenController { + private final HunYuanAiService aiService = new HunYuanAiService(); + @PostMapping("/paipan") public Map paiPan(@RequestBody QiMenRequest request) { Map result = new HashMap<>(); @@ -33,8 +37,16 @@ public class QiMenController { QiMenZhuanPan qiMen = new QiMenZhuanPan(setting); + Map data = buildQiMenData(qiMen); + + String aiAnalysis = aiService.chat( + PromptTemplates.getQiMenSystemPrompt(), + PromptTemplates.getQiMenUserPrompt(data) + ); + data.put("aiAnalysis", aiAnalysis); + result.put("success", true); - result.put("data", buildQiMenData(qiMen)); + result.put("data", data); } catch (Exception e) { result.put("success", false); result.put("error", e.getMessage()); @@ -49,126 +61,24 @@ public class QiMenController { data.put("occupy", qiMen.getOccupy()); data.put("sex", qiMen.getSex()); data.put("age", qiMen.getAge()); - data.put("zao", qiMen.getZao()); data.put("solar", qiMen.getSolarStr2()); data.put("lunar", qiMen.getLunarStr2()); - data.put("xingQi", qiMen.getXingQi()); - data.put("jiJie", qiMen.getJiJie()); - data.put("shengXiao", qiMen.getShengXiao()); - data.put("xingZuo", qiMen.getXingZuo()); - data.put("yueXiang", qiMen.getYueXiang()); - data.put("yueJiang", qiMen.getYueJiang()); - data.put("yueJiangShen", qiMen.getYueJiangShen()); - data.put("wuBuYuShi", qiMen.getWuBuYuShi()); - data.put("yearGan", qiMen.getYearGan()); - data.put("monthGan", qiMen.getMonthGan()); - data.put("dayGan", qiMen.getDayGan()); - data.put("hourGan", qiMen.getHourGan()); - data.put("yearZhi", qiMen.getYearZhi()); - data.put("monthZhi", qiMen.getMonthZhi()); - data.put("dayZhi", qiMen.getDayZhi()); - data.put("hourZhi", qiMen.getHourZhi()); data.put("yearGanZhi", qiMen.getYearGanZhi()); data.put("monthGanZhi", qiMen.getMonthGanZhi()); data.put("dayGanZhi", qiMen.getDayGanZhi()); data.put("hourGanZhi", qiMen.getHourGanZhi()); - data.put("yearGanWuXing", qiMen.getYearGanWuXing()); - data.put("monthGanWuXing", qiMen.getMonthGanWuXing()); - data.put("dayGanWuXing", qiMen.getDayGanWuXing()); - data.put("hourGanWuXing", qiMen.getHourGanWuXing()); - data.put("yearZhiWuXing", qiMen.getYearZhiWuXing()); - data.put("monthZhiWuXing", qiMen.getMonthZhiWuXing()); - data.put("dayZhiWuXing", qiMen.getDayZhiWuXing()); - data.put("hourZhiWuXing", qiMen.getHourZhiWuXing()); - data.put("yearGanZhiWuXing", qiMen.getYearGanZhiWuXing()); - data.put("monthGanZhiWuXing", qiMen.getMonthGanZhiWuXing()); - data.put("dayGanZhiWuXing", qiMen.getDayGanZhiWuXing()); - data.put("hourGanZhiWuXing", qiMen.getHourGanZhiWuXing()); - - data.put("yearGanZhiNaYin", qiMen.getYearGanZhiNaYin()); - data.put("monthGanZhiNaYin", qiMen.getMonthGanZhiNaYin()); - data.put("dayGanZhiNaYin", qiMen.getDayGanZhiNaYin()); - data.put("hourGanZhiNaYin", qiMen.getHourGanZhiNaYin()); - data.put("yearGanZhiKongWang", qiMen.getYearGanZhiKongWang()); - data.put("monthGanZhiKongWang", qiMen.getMonthGanZhiKongWang()); - data.put("dayGanZhiKongWang", qiMen.getDayGanZhiKongWang()); - data.put("hourGanZhiKongWang", qiMen.getHourGanZhiKongWang()); - - data.put("prevJie", qiMen.getPrevJie()); - data.put("prevJieDateStr", qiMen.getPrevJieDateStr()); - data.put("prevJieDay", qiMen.getPrevJieDay()); - data.put("nextJie", qiMen.getNextJie()); - data.put("nextJieDateStr", qiMen.getNextJieDateStr()); - data.put("nextJieDay", qiMen.getNextJieDay()); - data.put("chuShengJie", qiMen.getChuShengJie()); - data.put("prevQi", qiMen.getPrevQi()); - data.put("prevQiDateStr", qiMen.getPrevQiDateStr()); - data.put("prevQiDay", qiMen.getPrevQiDay()); - data.put("nextQi", qiMen.getNextQi()); - data.put("nextQiDateStr", qiMen.getNextQiDateStr()); - data.put("nextQiDay", qiMen.getNextQiDay()); - data.put("chuShengQi", qiMen.getChuShengQi()); - - data.put("fuTou", qiMen.getFuTou()); data.put("jieQi", qiMen.getJieQi()); - data.put("sanYuan", qiMen.getSanYuan()); data.put("juShu", qiMen.getJuShu()); data.put("yinYangDun", qiMen.getYinYangDun()); - data.put("xunShou", qiMen.getXunShou()); - data.put("xunShouYiZhang", qiMen.getXunShouYiZhang()); data.put("zhiFu", qiMen.getZhiFu()); data.put("zhiShi", qiMen.getZhiShi()); - data.put("liuJiaXunKong", qiMen.getLiuJiaXunKong()); - data.put("liuJiaXunKongGongWei", qiMen.getLiuJiaXunKongGongWei()); - data.put("liuJiaXunKongGongWeiMark", qiMen.getLiuJiaXunKongGongWeiMark()); - data.put("yiMa", qiMen.getYiMa()); - data.put("yiMaGongWei", qiMen.getYiMaGongWei()); - data.put("yiMaGongWeiMark", qiMen.getYiMaGongWeiMark()); - data.put("diPan", qiMen.getDiPan()); data.put("tianPan", qiMen.getTianPan()); data.put("renPan", qiMen.getRenPan()); data.put("shenPan", qiMen.getShenPan()); - data.put("tianPanQiYiTianQinNo", qiMen.getTianPanQiYiTianQinNo()); - data.put("tianPanQiYiTianQinYes", qiMen.getTianPanQiYiTianQinYes()); - - data.put("tianYi", qiMen.getTianYi()); - data.put("diYi", qiMen.getDiYi()); - data.put("taiYi", qiMen.getTaiYi()); - data.put("jiuDun", qiMen.getJiuDun()); - data.put("neiWaiGongWeiMark", qiMen.getNeiWaiGongWeiMark()); - data.put("neiWaiGongWeiInfo", qiMen.getNeiWaiGongWeiInfo()); - data.put("tianMen", qiMen.getTianMen()); - data.put("diHu", qiMen.getDiHu()); - - data.put("fuYin", qiMen.getFuYin()); - data.put("fanYin", qiMen.getFanYin()); - data.put("liuYiJiXing", qiMen.getLiuYiJiXing()); - data.put("qiYiRuMu", qiMen.getQiYiRuMu()); - data.put("liuYiJiXingRuMuTianQinNoStatus", qiMen.getLiuYiJiXingRuMuTianQinNoStatus()); - data.put("liuYiJiXingRuMuTianQinYesStatus", qiMen.getLiuYiJiXingRuMuTianQinYesStatus()); - data.put("menPoStatus", qiMen.getMenPoStatus()); - - data.put("shiGanKeYing", qiMen.getShiGanKeYing()); - data.put("baMenKeYing", qiMen.getBaMenKeYing()); - data.put("baMenJingYing", qiMen.getBaMenJingYing()); - data.put("baMenDongYing", qiMen.getBaMenDongYing()); - data.put("xingMenKeYing", qiMen.getXingMenKeYing()); - data.put("jiuXingShiYing", qiMen.getJiuXingShiYing()); - - data.put("baGuaWangShuai", qiMen.getBaGuaWangShuai()); - data.put("baMenWangShuai", qiMen.getBaMenWangShuai()); - data.put("jiuXingWangShuai", qiMen.getJiuXingWangShuai()); - data.put("baShenLuoGongStatus", qiMen.getBaShenLuoGongStatus()); - data.put("baMenLuoGongStatus", qiMen.getBaMenLuoGongStatus()); - data.put("jiuXingLuoGongStatus", qiMen.getJiuXingLuoGongStatus()); - - data.put("diPanQiYiLuoGongLink", qiMen.getDiPanQiYiLuoGongLink()); - data.put("tianPanQiYiLuoGongTianQinNoLink", qiMen.getTianPanQiYiLuoGongTianQinNoLink()); - data.put("tianPanQiYiLuoGongTianQinYesLink", qiMen.getTianPanQiYiLuoGongTianQinYesLink()); return data; } @@ -218,5 +128,4 @@ public class QiMenController { public Integer getDayGanZhiType() { return dayGanZhiType; } public void setDayGanZhiType(Integer dayGanZhiType) { this.dayGanZhiType = dayGanZhiType; } } - } diff --git a/src/main/java/xuan/controller/TaLuoController.java b/src/main/java/xuan/controller/TaLuoController.java index ee04e51..1c472fe 100644 --- a/src/main/java/xuan/controller/TaLuoController.java +++ b/src/main/java/xuan/controller/TaLuoController.java @@ -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> 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> MINOR_ARCANA = createMinorArcana(); - private static Map createCard(int number, String name, String englishName, String uprightMeaning, String reversedMeaning, String description) { Map 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> createMinorArcana() { - List> 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 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 divine(@RequestBody TaLuoRequest request) { Map result = new HashMap<>(); @@ -126,9 +57,7 @@ public class TaLuoController { String spreadType = request.getSpreadType() != null ? request.getSpreadType() : "single"; int cardCount = getCardCount(spreadType); - List> allCards = new ArrayList<>(); - allCards.addAll(MAJOR_ARCANA); - allCards.addAll(MINOR_ARCANA); + List> 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> cards, String spreadType, String question) { - StringBuilder interpretation = new StringBuilder(); - - if ("single".equals(spreadType)) { - Map 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 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 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 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 generateSummary(List> cards, String spreadType) { - Map 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> cards) { - StringBuilder sb = new StringBuilder(); - - int majorCount = 0; - int reversedCount = 0; - boolean hasFool = false, hasMagician = false, hasHighPriestess = false, hasEmperor = false; - - for (Map 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> 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 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> 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 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> 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 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 getAllCards() { - Map result = new HashMap<>(); - try { - List> 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 getCard(@PathVariable int number) { - Map result = new HashMap<>(); - try { - List> 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; diff --git a/src/main/java/xuan/controller/ZhanXingController.java b/src/main/java/xuan/controller/ZhanXingController.java index 6da5229..61627bd 100644 --- a/src/main/java/xuan/controller/ZhanXingController.java +++ b/src/main/java/xuan/controller/ZhanXingController.java @@ -1,17 +1,29 @@ package xuan.controller; import org.springframework.web.bind.annotation.*; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; + import java.util.*; @RestController @RequestMapping("/api/zhanxing") public class ZhanXingController { + private final HunYuanAiService aiService = new HunYuanAiService(); + @PostMapping("/paipan") public Map paiPan(@RequestBody ZhanXingRequest request) { Map result = new HashMap<>(); try { Map data = buildZhanXingData(request); + + String aiAnalysis = aiService.chat( + PromptTemplates.getZhanXingSystemPrompt(), + PromptTemplates.getZhanXingUserPrompt(data) + ); + data.put("aiAnalysis", aiAnalysis); + result.put("success", true); result.put("data", data); } catch (Exception e) { @@ -180,5 +192,4 @@ public class ZhanXingController { public String getBirthPlace() { return birthPlace; } public void setBirthPlace(String birthPlace) { this.birthPlace = birthPlace; } } - } diff --git a/src/main/java/xuan/controller/ZiWeiController.java b/src/main/java/xuan/controller/ZiWeiController.java index 8b4abcf..1b0c084 100644 --- a/src/main/java/xuan/controller/ZiWeiController.java +++ b/src/main/java/xuan/controller/ZiWeiController.java @@ -3,6 +3,8 @@ package xuan.controller; import org.springframework.web.bind.annotation.*; import xuan.core.ziwei.ZiWei; import xuan.core.ziwei.settings.ZiWeiJiChuSetting; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; import java.util.*; @@ -10,6 +12,8 @@ import java.util.*; @RequestMapping("/api/ziwei") public class ZiWeiController { + private final HunYuanAiService aiService = new HunYuanAiService(); + @PostMapping("/paipan") public Map paiPan(@RequestBody ZiWeiRequest request) { Map result = new HashMap<>(); @@ -30,8 +34,16 @@ public class ZiWeiController { ZiWei ziWei = new ZiWei(setting); + Map data = buildZiWeiData(ziWei); + + String aiAnalysis = aiService.chat( + PromptTemplates.getZiWeiSystemPrompt(), + PromptTemplates.getZiWeiUserPrompt(data) + ); + data.put("aiAnalysis", aiAnalysis); + result.put("success", true); - result.put("data", buildZiWeiData(ziWei)); + result.put("data", data); } catch (Exception e) { result.put("success", false); result.put("error", e.getMessage()); @@ -78,509 +90,8 @@ public class ZiWeiController { data.put("huaKeXingGongWeiJieDu", ziWei.getHuaKeXingGongWeiJieDu()); data.put("huaJiXingGongWeiJieDu", ziWei.getHuaJiXingGongWeiJieDu()); - data.put("jieDu", buildJieDu(ziWei, shiErGongZhuXing)); - return data; } - - private Map buildJieDu(ZiWei ziWei, List> shiErGongZhuXing) { - Map jieDu = new HashMap<>(); - - List shiErMingGong = ziWei.getShiErMingGong(); - int mingGongIndex = ziWei.getMingGongGongWei() - 1; - List mingGongStars = shiErGongZhuXing.get(mingGongIndex); - - List mainStars = getMainStars(mingGongStars); - - String xingGe = analyzeXingGe(mainStars); - String shiYe = analyzeShiYe(mainStars, ziWei, shiErMingGong, shiErGongZhuXing); - String ganQing = analyzeGanQing(ziWei, shiErMingGong, shiErGongZhuXing); - String caiYun = analyzeCaiYun(ziWei, shiErMingGong, shiErGongZhuXing); - - jieDu.put("xingGe", xingGe); - jieDu.put("shiYe", shiYe); - jieDu.put("ganQing", ganQing); - jieDu.put("caiYun", caiYun); - - String zongJie = buildZongJie(ziWei, mainStars, xingGe, shiYe, ganQing, caiYun); - jieDu.put("zongJie", zongJie); - - return jieDu; - } - - private List getMainStars(List stars) { - Set mainStarSet = new HashSet<>(Arrays.asList( - "紫微", "天机", "太阳", "武曲", "天同", "廉贞", - "天府", "太阴", "贪狼", "巨门", "天相", "天梁", "七杀", "破军" - )); - List mainStars = new ArrayList<>(); - for (String star : stars) { - if (mainStarSet.contains(star)) { - mainStars.add(star); - } - } - return mainStars; - } - - private int getGongIndex(List shiErMingGong, String gongName) { - for (int i = 0; i < shiErMingGong.size(); i++) { - if (gongName.equals(shiErMingGong.get(i))) { - return i; - } - } - return -1; - } - - private String analyzeXingGe(List mainStars) { - StringBuilder sb = new StringBuilder(); - - if (mainStars.isEmpty()) { - return "你是一个性格比较随和的人,没有特别强的主见,容易受环境影响。做事比较灵活,能够适应各种情况,但有时候也会显得优柔寡断。建议多培养自己的主见,学会独立思考。"; - } - - String firstStar = mainStars.get(0); - - switch (firstStar) { - case "紫微": - sb.append("你是一个很有气场的人,天生就有一种领导范儿。"); - if (mainStars.contains("天府")) { - sb.append("性格稳重踏实,做事有条理,不喜欢冒险。"); - } else if (mainStars.contains("贪狼")) { - sb.append("既有野心又懂得享受生活,是个有情趣的人。"); - } else if (mainStars.contains("天相")) { - sb.append("为人正直,讲究原则,是个值得信赖的人。"); - } - sb.append("你比较注重面子,喜欢被人尊重的感觉,有时候会显得有点强势。"); - break; - - case "天机": - sb.append("你是一个很聪明的人,脑子转得快,想法多。"); - sb.append("善于分析问题,喜欢琢磨事情,但有时候想得太多反而会犹豫不决。"); - sb.append("你比较敏感,能够察觉到别人的情绪变化,是个很好的倾听者。"); - break; - - case "太阳": - sb.append("你是一个阳光开朗的人,热情大方,喜欢交朋友。"); - sb.append("做事积极主动,不喜欢拖拖拉拉,但有时候会显得有点急躁。"); - sb.append("你很有正义感,看不惯不公平的事,愿意帮助别人。"); - break; - - case "武曲": - sb.append("你是一个很务实的人,做事讲究效率,不喜欢虚头巴脑的东西。"); - sb.append("性格比较刚强,有话直说,有时候会得罪人。"); - sb.append("你对金钱比较敏感,有理财头脑,是个会过日子的人。"); - break; - - case "天同": - sb.append("你是一个很温和的人,性格随和,不爱和人计较。"); - sb.append("喜欢安逸的生活,不喜欢太累太辛苦的事。"); - sb.append("你人缘很好,大家都愿意和你相处,是个有福气的人。"); - break; - - case "廉贞": - sb.append("你是一个很有魅力的人,感情丰富,有艺术细胞。"); - sb.append("做事有冲劲,但有时候会情绪化。"); - sb.append("你比较注重外表和形象,喜欢美好的事物。"); - break; - - case "天府": - sb.append("你是一个稳重踏实的人,做事有条不紊,不喜欢冒险。"); - sb.append("很会理财,懂得积累,是个有财运的人。"); - sb.append("你比较保守,不喜欢变动,追求安稳的生活。"); - break; - - case "太阴": - sb.append("你是一个心思细腻的人,感情丰富,直觉很准。"); - sb.append("比较内向,不太喜欢太热闹的场合,喜欢安静的环境。"); - sb.append("你很有艺术天分,对美的事物有独特的见解。"); - break; - - case "贪狼": - sb.append("你是一个很有活力的人,兴趣广泛,喜欢尝试新鲜事物。"); - sb.append("社交能力强,朋友多,但有时候会三分钟热度。"); - sb.append("你比较追求物质享受,喜欢美好的生活。"); - break; - - case "巨门": - sb.append("你是一个很会说话的人,口才好,善于表达。"); - sb.append("观察力强,能够看到别人看不到的问题,但有时候会想太多。"); - sb.append("你比较敏感,容易多心,建议学会放宽心态。"); - break; - - case "天相": - sb.append("你是一个正直善良的人,讲究原则,有正义感。"); - sb.append("做事稳重,不喜欢投机取巧,是个值得信赖的人。"); - sb.append("你很注重人际关系,懂得如何与人相处。"); - break; - - case "天梁": - sb.append("你是一个很有爱心的人,喜欢帮助别人,有长辈缘。"); - sb.append("性格成熟稳重,做事有担当,是个可靠的人。"); - sb.append("你比较传统,重视家庭,是个顾家的人。"); - break; - - case "七杀": - sb.append("你是一个很有魄力的人,做事果断,敢想敢干。"); - sb.append("性格比较强势,不喜欢被人管,有独立精神。"); - sb.append("你很有领导才能,但有时候会显得太冲动。"); - break; - - case "破军": - sb.append("你是一个很有个性的人,不喜欢墨守成规,喜欢打破常规。"); - sb.append("做事有冲劲,但有时候会显得太急躁。"); - sb.append("你的人生变动比较多,建议学会稳中求进。"); - break; - - default: - sb.append("你是一个性格独特的人,有自己的想法和追求。"); - } - - return sb.toString(); - } - - private String analyzeShiYe(List mainStars, ZiWei ziWei, List shiErMingGong, List> shiErGongZhuXing) { - StringBuilder sb = new StringBuilder(); - - int guanLuIndex = getGongIndex(shiErMingGong, "官禄宫"); - int qianYiIndex = getGongIndex(shiErMingGong, "迁移宫"); - - List guanLuStars = guanLuIndex >= 0 ? getMainStars(shiErGongZhuXing.get(guanLuIndex)) : new ArrayList<>(); - List qianYiStars = qianYiIndex >= 0 ? getMainStars(shiErGongZhuXing.get(qianYiIndex)) : new ArrayList<>(); - - String firstStar = mainStars.isEmpty() ? "" : mainStars.get(0); - - sb.append("【适合的工作方向】\n"); - - switch (firstStar) { - case "紫微": - case "天府": - sb.append("你天生就是当领导的料,适合做管理工作。"); - sb.append("可以考虑往企业管理、政府部门、大型机构发展。"); - sb.append("你比较适合稳定的平台,不太适合从零开始创业。"); - break; - - case "天机": - case "太阴": - sb.append("你脑子好使,适合做需要动脑子的工作。"); - sb.append("可以考虑策划、咨询、设计、写作、研究等方向。"); - sb.append("你比较适合在专业领域深耕,成为某个领域的专家。"); - break; - - case "太阳": - case "天相": - sb.append("你适合做需要和人打交道的工作。"); - sb.append("可以考虑公务员、律师、教师、人力资源等方向。"); - sb.append("你比较适合稳定的体制内工作,或者大型正规企业。"); - break; - - case "武曲": - sb.append("你对数字敏感,适合做和钱打交道的工作。"); - sb.append("可以考虑金融、财务、投资、商业等方向。"); - sb.append("你比较务实,适合实实在在能赚钱的行业。"); - break; - - case "贪狼": - case "廉贞": - sb.append("你适合做需要表现力和社交能力的工作。"); - sb.append("可以考虑销售、演艺、公关、市场营销等方向。"); - sb.append("你比较适合能发挥个人魅力的行业。"); - break; - - case "七杀": - case "破军": - sb.append("你适合做有挑战性的工作,不喜欢一成不变。"); - sb.append("可以考虑创业、投资、军警、体育等方向。"); - sb.append("你比较适合能发挥个人能力的舞台,不太适合被人管着。"); - break; - - case "天同": - case "天梁": - sb.append("你适合做服务性质的工作,有耐心有爱心。"); - sb.append("可以考虑医疗、教育、社工、服务业等方向。"); - sb.append("你比较适合稳定、压力不太大的工作环境。"); - break; - - case "巨门": - sb.append("你口才好,适合做需要说话的工作。"); - sb.append("可以考虑律师、教师、主持人、销售、咨询等方向。"); - sb.append("你比较适合能发挥口才优势的行业。"); - break; - - default: - sb.append("你可以根据自己的兴趣和特长选择发展方向。"); - sb.append("建议多尝试不同的工作,找到最适合自己的方向。"); - } - - sb.append("\n\n【事业发展建议】\n"); - - if (!guanLuStars.isEmpty()) { - String guanLuStar = guanLuStars.get(0); - if ("紫微".equals(guanLuStar) || "天府".equals(guanLuStar)) { - sb.append("你的事业运势不错,容易得到贵人相助,发展会比较顺利。"); - } else if ("七杀".equals(guanLuStar) || "破军".equals(guanLuStar)) { - sb.append("你的事业变动会比较多,建议稳扎稳打,不要急于求成。"); - } else if ("太阳".equals(guanLuStar)) { - sb.append("你的事业运势旺盛,适合往外发展,多接触外面的机会。"); - } else if ("太阴".equals(guanLuStar)) { - sb.append("你的事业发展比较平稳,适合稳中求进,不要太冒进。"); - } - } - - return sb.toString(); - } - - private String analyzeGanQing(ZiWei ziWei, List shiErMingGong, List> shiErGongZhuXing) { - StringBuilder sb = new StringBuilder(); - - int fuQiIndex = getGongIndex(shiErMingGong, "夫妻宫"); - int ziNvIndex = getGongIndex(shiErMingGong, "子女宫"); - - List fuQiStars = fuQiIndex >= 0 ? getMainStars(shiErGongZhuXing.get(fuQiIndex)) : new ArrayList<>(); - - sb.append("【感情婚姻分析】\n"); - - if (fuQiStars.isEmpty()) { - sb.append("你的感情运势比较平淡,婚姻生活相对稳定。"); - sb.append("另一半可能是一个性格温和、不张扬的人。"); - sb.append("你们的感情不会太轰轰烈烈,但会比较长久稳定。"); - } else { - String fuQiStar = fuQiStars.get(0); - - switch (fuQiStar) { - case "紫微": - case "天府": - sb.append("你的另一半可能是一个有能力、有地位的人。"); - sb.append("对方性格比较强势,在家里可能说一不二。"); - sb.append("你们的婚姻比较稳定,但要注意互相尊重。"); - break; - - case "天机": - case "太阴": - sb.append("你的另一半可能是一个心思细腻、温柔体贴的人。"); - sb.append("对方比较顾家,会照顾人,但有时候会想太多。"); - sb.append("你们的感情比较细腻,需要多沟通。"); - break; - - case "太阳": - sb.append("你的另一半可能是一个开朗热情的人。"); - sb.append("对方比较外向,喜欢社交,人缘很好。"); - sb.append("你们的感情比较阳光,充满正能量。"); - break; - - case "武曲": - sb.append("你的另一半可能是一个务实、有经济头脑的人。"); - sb.append("对方比较会过日子,但有时候会显得太现实。"); - sb.append("你们的婚姻比较务实,注重物质基础。"); - break; - - case "贪狼": - case "廉贞": - sb.append("你的另一半可能是一个有魅力、有情趣的人。"); - sb.append("对方比较会享受生活,但有时候会显得花心。"); - sb.append("你们的感情比较浪漫,但要注意专一。"); - break; - - case "七杀": - case "破军": - sb.append("你的另一半可能是一个有个性、有主见的人。"); - sb.append("对方性格比较强势,不喜欢被人管。"); - sb.append("你们的感情可能会有波折,需要多包容。"); - break; - - case "天同": - sb.append("你的另一半可能是一个温和、好相处的人。"); - sb.append("对方比较随和,不喜欢争吵。"); - sb.append("你们的感情比较和谐,生活平淡但幸福。"); - break; - - case "巨门": - sb.append("你的另一半可能是一个能说会道的人。"); - sb.append("对方口才好,但有时候会和你抬杠。"); - sb.append("你们的感情需要多沟通,避免误会。"); - break; - - case "天相": - sb.append("你的另一半可能是一个正直、有原则的人。"); - sb.append("对方比较传统,重视家庭。"); - sb.append("你们的感情比较稳定,互相尊重。"); - break; - - case "天梁": - sb.append("你的另一半可能是一个成熟、有担当的人。"); - sb.append("对方比较顾家,会照顾人。"); - sb.append("你们的感情比较稳定,对方会给你安全感。"); - break; - - default: - sb.append("你的感情运势比较正常,婚姻生活相对平稳。"); - } - } - - sb.append("\n\n【感情建议】\n"); - sb.append("感情需要经营,建议多沟通、多理解、多包容。"); - sb.append("遇到问题及时解决,不要冷战。"); - sb.append("珍惜眼前人,用心经营你的感情。"); - - return sb.toString(); - } - - private String analyzeCaiYun(ZiWei ziWei, List shiErMingGong, List> shiErGongZhuXing) { - StringBuilder sb = new StringBuilder(); - - int caiBoIndex = getGongIndex(shiErMingGong, "财帛宫"); - - List caiBoStars = caiBoIndex >= 0 ? getMainStars(shiErGongZhuXing.get(caiBoIndex)) : new ArrayList<>(); - - sb.append("【财运分析】\n"); - - if (caiBoStars.isEmpty()) { - sb.append("你的财运比较平稳,不会大起大落。"); - sb.append("收入来源比较稳定,但不会有太多意外之财。"); - sb.append("建议量入为出,做好理财规划。"); - } else { - String caiBoStar = caiBoStars.get(0); - - switch (caiBoStar) { - case "紫微": - case "天府": - sb.append("你的财运不错,容易积累财富。"); - sb.append("收入稳定,有存钱的习惯。"); - sb.append("适合稳健投资,不宜冒险。"); - break; - - case "武曲": - sb.append("你是一个有财运的人,对金钱敏感。"); - sb.append("理财能力强,会赚钱也会存钱。"); - sb.append("适合做和钱打交道的工作,财运会比较旺。"); - break; - - case "太阴": - sb.append("你的财运比较平稳,适合慢慢积累。"); - sb.append("不宜冒险投资,稳健为主。"); - sb.append("可能有一些偏财运,但不要指望一夜暴富。"); - break; - - case "贪狼": - sb.append("你的财运起伏比较大,有时候很旺,有时候一般。"); - sb.append("可能有一些偏财运,但不要贪心。"); - sb.append("建议稳健理财,不要投机取巧。"); - break; - - case "太阳": - sb.append("你的财运和事业挂钩,事业好财运就好。"); - sb.append("适合靠努力工作赚钱,不太适合投资。"); - sb.append("收入可能比较公开透明。"); - break; - - case "七杀": - case "破军": - sb.append("你的财运起伏比较大,可能有大起大落。"); - sb.append("有时候会有一笔大收入,但花销也大。"); - sb.append("建议做好财务规划,不要冲动消费。"); - break; - - case "天机": - sb.append("你的财运需要动脑子,靠智慧赚钱。"); - sb.append("适合做一些需要策划、分析的工作。"); - sb.append("收入可能不太稳定,但总体还行。"); - break; - - case "天同": - sb.append("你的财运比较平稳,不会太差也不会太好。"); - sb.append("适合安稳的工作,不太适合冒险。"); - sb.append("可能有一些意外之财,但不要指望。"); - break; - - case "廉贞": - sb.append("你的财运和人际关系有关,靠人脉赚钱。"); - sb.append("可能有一些偏财运,但要注意风险。"); - sb.append("建议稳健为主,不要贪心。"); - break; - - default: - sb.append("你的财运比较正常,不会大富大贵,也不会太差。"); - sb.append("建议量入为出,做好理财规划。"); - } - } - - sb.append("\n\n【理财建议】\n"); - sb.append("不管财运好坏,都要学会理财。"); - sb.append("收入再高,不会理财也是白搭。"); - sb.append("建议养成记账的习惯,控制不必要的开支。"); - - return sb.toString(); - } - - private String buildZongJie(ZiWei ziWei, List mainStars, String xingGe, String shiYe, String ganQing, String caiYun) { - StringBuilder sb = new StringBuilder(); - - sb.append("【命盘总评】\n\n"); - - sb.append("根据你的出生时间排出的紫微命盘,以下是通俗易懂的解读:\n\n"); - - sb.append("你的命宫在").append(ziWei.getMingGongDiZhi()).append("宫"); - if (!mainStars.isEmpty()) { - sb.append(",主星是").append(String.join("和", mainStars)); - } - sb.append("。").append(ziWei.getWuXingJu()).append(",说明你的人生节奏是").append(getWuXingJuDesc(ziWei.getWuXingJu())).append("。\n\n"); - - sb.append("命主").append(ziWei.getMingZhu()).append(",身主").append(ziWei.getShenZhu()).append("。"); - sb.append("这说明你内在追求的是").append(getMingZhuDesc(ziWei.getMingZhu())); - sb.append(",外在表现的是").append(getShenZhuDesc(ziWei.getShenZhu())).append("。\n\n"); - - sb.append("【重要提醒】\n"); - sb.append("命盘只是参考,命运掌握在自己手中。"); - sb.append("了解自己的优势和短板,扬长避短,才能过上更好的生活。"); - sb.append("不管命盘如何,努力和善良永远是最重要的。"); - - return sb.toString(); - } - - private String getWuXingJuDesc(String wuXingJu) { - if (wuXingJu.contains("水二")) { - return "比较灵活多变,适应能力强"; - } else if (wuXingJu.contains("木三")) { - return "比较稳健,有成长性"; - } else if (wuXingJu.contains("金四")) { - return "比较务实,注重实际"; - } else if (wuXingJu.contains("土五")) { - return "比较稳重,厚积薄发"; - } else if (wuXingJu.contains("火六")) { - return "比较快速,有冲劲"; - } - return "比较平稳"; - } - - private String getMingZhuDesc(String mingZhu) { - Map descMap = new HashMap<>(); - descMap.put("贪狼", "物质享受和人生体验"); - descMap.put("巨门", "表达和沟通"); - descMap.put("禄存", "稳定和积累"); - descMap.put("文曲", "文艺和才华"); - descMap.put("廉贞", "情感和魅力"); - descMap.put("武曲", "财富和成就"); - descMap.put("破军", "变革和突破"); - descMap.put("左辅", "帮助和服务"); - descMap.put("右弼", "支持和配合"); - descMap.put("文昌", "学业和知识"); - descMap.put("天相", "公正和平衡"); - descMap.put("天梁", "庇护和关怀"); - descMap.put("七杀", "权力和掌控"); - descMap.put("天同", "安逸和享受"); - return descMap.getOrDefault(mingZhu, "自我实现"); - } - - private String getShenZhuDesc(String shenZhu) { - Map descMap = new HashMap<>(); - descMap.put("火星", "热情和行动力"); - descMap.put("铃星", "内敛和思考"); - descMap.put("天相", "正直和公正"); - descMap.put("天梁", "稳重和可靠"); - descMap.put("天同", "温和和随和"); - descMap.put("文昌", "学习和思考"); - descMap.put("文曲", "艺术和浪漫"); - return descMap.getOrDefault(shenZhu, "个人特质"); - } public static class ZiWeiRequest { private String name; @@ -621,5 +132,4 @@ public class ZiWeiController { public Integer getDayGanZhiType() { return dayGanZhiType; } public void setDayGanZhiType(Integer dayGanZhiType) { this.dayGanZhiType = dayGanZhiType; } } - } diff --git a/src/main/java/xuan/service/HunYuanAiService.java b/src/main/java/xuan/service/HunYuanAiService.java new file mode 100644 index 0000000..15a4d20 --- /dev/null +++ b/src/main/java/xuan/service/HunYuanAiService.java @@ -0,0 +1,188 @@ +package xuan.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import okhttp3.*; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class HunYuanAiService { + + private static final String SECRET_ID = System.getenv("TENCENT_SECRET_ID"); + private static final String SECRET_KEY = System.getenv("TENCENT_SECRET_KEY"); + private static final String SERVICE = "hunyuan"; + private static final String HOST = "hunyuan.tencentcloudapi.com"; + private static final String REGION = "ap-guangzhou"; + private static final String ACTION = "ChatCompletions"; + private static final String VERSION = "2023-09-01"; + + private static final OkHttpClient client = new OkHttpClient.Builder() + .connectTimeout(60, TimeUnit.SECONDS) + .readTimeout(120, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS) + .build(); + + public String chat(String systemPrompt, String userMessage) { + try { + String response = sendRequest(systemPrompt, userMessage); + return parseResponse(response); + } catch (Exception e) { + e.printStackTrace(); + return "AI分析暂时不可用,请稍后再试。错误信息:" + e.getMessage(); + } + } + + private String sendRequest(String systemPrompt, String userMessage) throws IOException { + String timestamp = String.valueOf(System.currentTimeMillis() / 1000); + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date(Long.parseLong(timestamp) * 1000)); + + JSONObject requestBody = new JSONObject(); + requestBody.put("Model", "hunyuan-lite"); + + JSONArray messages = new JSONArray(); + + JSONObject systemMsg = new JSONObject(); + systemMsg.put("Role", "system"); + systemMsg.put("Content", systemPrompt); + messages.add(systemMsg); + + JSONObject userMsg = new JSONObject(); + userMsg.put("Role", "user"); + userMsg.put("Content", userMessage); + messages.add(userMsg); + + requestBody.put("Messages", messages); + requestBody.put("Temperature", 0.7); + requestBody.put("TopP", 0.8); + + String payload = requestBody.toJSONString(); + + String credential = generateCredential(timestamp, date, payload); + + JSONObject headers = new JSONObject(); + headers.put("Authorization", credential); + headers.put("Content-Type", "application/json"); + headers.put("Host", HOST); + headers.put("X-TC-Action", ACTION); + headers.put("X-TC-Version", VERSION); + headers.put("X-TC-Timestamp", timestamp); + headers.put("X-TC-Region", REGION); + + Request request = new Request.Builder() + .url("https://" + HOST) + .post(RequestBody.create(payload, MediaType.parse("application/json"))) + .addHeader("Authorization", credential) + .addHeader("Content-Type", "application/json") + .addHeader("Host", HOST) + .addHeader("X-TC-Action", ACTION) + .addHeader("X-TC-Version", VERSION) + .addHeader("X-TC-Timestamp", timestamp) + .addHeader("X-TC-Region", REGION) + .build(); + + try (Response response = client.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new IOException("Unexpected response code: " + response.code()); + } + return response.body().string(); + } + } + + private String generateCredential(String timestamp, String date, String payload) { + try { + String httpRequestMethod = "POST"; + String canonicalUri = "/"; + String canonicalQueryString = ""; + String canonicalHeaders = "content-type:application/json\nhost:" + HOST + "\n"; + String signedHeaders = "content-type;host"; + + String hashedRequestPayload = sha256Hex(payload); + + String canonicalRequest = httpRequestMethod + "\n" + + canonicalUri + "\n" + + canonicalQueryString + "\n" + + canonicalHeaders + "\n" + + signedHeaders + "\n" + + hashedRequestPayload; + + String algorithm = "TC3-HMAC-SHA256"; + String credentialScope = date + "/" + SERVICE + "/tc3_request"; + String hashedCanonicalRequest = sha256Hex(canonicalRequest); + String stringToSign = algorithm + "\n" + + timestamp + "\n" + + credentialScope + "\n" + + hashedCanonicalRequest; + + byte[] secretDate = hmacSha256(("TC3" + SECRET_KEY).getBytes(StandardCharsets.UTF_8), date); + byte[] secretService = hmacSha256(secretDate, SERVICE); + byte[] secretSigning = hmacSha256(secretService, "tc3_request"); + String signature = bytesToHex(hmacSha256(secretSigning, stringToSign)); + + return algorithm + " " + + "Credential=" + SECRET_ID + "/" + credentialScope + ", " + + "SignedHeaders=" + signedHeaders + ", " + + "Signature=" + signature; + } catch (Exception e) { + throw new RuntimeException("Failed to generate credential", e); + } + } + + private String parseResponse(String response) { + try { + JSONObject jsonResponse = JSON.parseObject(response); + JSONObject responseObj = jsonResponse.getJSONObject("Response"); + + if (responseObj.containsKey("Error")) { + JSONObject error = responseObj.getJSONObject("Error"); + return "AI服务错误:" + error.getString("Message"); + } + + JSONArray choices = responseObj.getJSONArray("Choices"); + if (choices != null && !choices.isEmpty()) { + JSONObject choice = choices.getJSONObject(0); + JSONObject message = choice.getJSONObject("Message"); + return message.getString("Content"); + } + + return "AI未返回有效内容"; + } catch (Exception e) { + return "解析AI响应失败:" + e.getMessage(); + } + } + + private static String sha256Hex(String input) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(hash); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static byte[] hmacSha256(byte[] key, String message) { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(key, "HmacSHA256")); + return mac.doFinal(message.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static String bytesToHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } +} diff --git a/src/main/java/xuan/service/PromptTemplates.java b/src/main/java/xuan/service/PromptTemplates.java new file mode 100644 index 0000000..8a99379 --- /dev/null +++ b/src/main/java/xuan/service/PromptTemplates.java @@ -0,0 +1,407 @@ +package xuan.service; + +import java.util.Map; + +public class PromptTemplates { + + public static String getBaZiSystemPrompt() { + return "你是一位精通中国传统八字命理的大师,拥有深厚的命理学知识和丰富的实战经验。" + + "你擅长通过八字排盘分析一个人的性格特质、事业运势、婚姻感情、财运健康等方面。" + + "你的解读通俗易懂,既有专业深度,又让人容易理解和接受。" + + "你会根据八字中的五行旺衰、十神关系、神煞配置等给出全面而精准的分析。" + + "请用温暖、积极的语气进行解读,给出建设性的建议,避免消极或令人不安的表述。"; + } + + public static String getBaZiUserPrompt(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下八字命盘进行详细解读:\n\n"); + sb.append("姓名:").append(data.get("name")).append("\n"); + sb.append("性别:").append(data.get("sex")).append("\n"); + sb.append("阳历:").append(data.get("solar")).append("\n"); + sb.append("阴历:").append(data.get("lunar")).append("\n"); + sb.append("生肖:").append(data.get("shengXiao")).append("\n"); + sb.append("星座:").append(data.get("xingZuo")).append("\n\n"); + + sb.append("【八字排盘】\n"); + sb.append("年柱:").append(data.get("yearGanZhi")).append("\n"); + sb.append("月柱:").append(data.get("monthGanZhi")).append("\n"); + sb.append("日柱:").append(data.get("dayGanZhi")).append("\n"); + sb.append("时柱:").append(data.get("hourGanZhi")).append("\n\n"); + + sb.append("【八字五行】\n"); + sb.append("五行:").append(data.get("baZiWuXing")).append("\n"); + sb.append("纳音:").append(data.get("baZiNaYin")).append("\n"); + sb.append("空亡:").append(data.get("baZiKongWang")).append("\n\n"); + + sb.append("【五行分析】\n"); + sb.append("五行旺衰:").append(data.get("wuXingWangShuai")).append("\n"); + sb.append("五行缺失:").append(data.get("wuXingQueShi")).append("\n"); + sb.append("喜用神:").append(data.get("xiYongShen")).append("\n\n"); + + sb.append("【神煞】\n"); + sb.append("年柱神煞:").append(data.get("yearGanZhiShenSha")).append("\n"); + sb.append("月柱神煞:").append(data.get("monthGanZhiShenSha")).append("\n"); + sb.append("日柱神煞:").append(data.get("dayGanZhiShenSha")).append("\n"); + sb.append("时柱神煞:").append(data.get("hourGanZhiShenSha")).append("\n\n"); + + sb.append("【胎元命宫】\n"); + sb.append("胎元:").append(data.get("taiYuanGanZhi")).append("\n"); + sb.append("命宫:").append(data.get("mingGongGanZhi")).append("\n"); + sb.append("身宫:").append(data.get("shenGongGanZhi")).append("\n\n"); + + sb.append("请从以下几个方面进行详细解读:\n"); + sb.append("1. 命局总评:整体命格特点,日主强弱,格局高低\n"); + sb.append("2. 性格特质:根据日主和十神分析性格优缺点\n"); + sb.append("3. 事业运势:适合的行业方向,事业发展建议\n"); + sb.append("4. 财运分析:财运特点,理财建议\n"); + sb.append("5. 婚姻感情:感情运势,择偶建议\n"); + sb.append("6. 健康提醒:需要注意的健康问题\n"); + sb.append("7. 人生建议:综合建议和注意事项\n\n"); + sb.append("请用通俗易懂的语言,给出详细而专业的解读。"); + + return sb.toString(); + } + + public static String getZiWeiSystemPrompt() { + return "你是一位精通紫微斗数的大师,对紫微十四主星及众多辅星的性质了如指掌。" + + "你擅长通过紫微命盘分析一个人的命运轨迹、性格特点、事业发展、感情婚姻等。" + + "你的解读深入浅出,既有理论依据,又贴近生活实际。" + + "你会根据命宫主星、身宫位置、四化飞星等给出全面而精准的分析。" + + "请用温暖、积极的语气进行解读,给出建设性的建议。"; + } + + public static String getZiWeiUserPrompt(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下紫微斗数命盘进行详细解读:\n\n"); + sb.append("姓名:").append(data.get("name")).append("\n"); + sb.append("性别:").append(data.get("sex")).append("\n"); + sb.append("阳历:").append(data.get("solar")).append("\n"); + sb.append("阴历:").append(data.get("lunar")).append("\n"); + sb.append("生肖:").append(data.get("shengXiao")).append("\n"); + sb.append("五行局:").append(data.get("wuXingJu")).append("\n\n"); + + sb.append("【四柱】\n"); + sb.append("年柱:").append(data.get("yearGanZhi")).append("\n"); + sb.append("月柱:").append(data.get("monthGanZhi")).append("\n"); + sb.append("日柱:").append(data.get("dayGanZhi")).append("\n"); + sb.append("时柱:").append(data.get("hourGanZhi")).append("\n\n"); + + sb.append("【命宫身宫】\n"); + sb.append("命宫地支:").append(data.get("mingGongDiZhi")).append("\n"); + sb.append("身宫地支:").append(data.get("shenGongDiZhi")).append("\n"); + sb.append("命主:").append(data.get("mingZhu")).append("\n"); + sb.append("身主:").append(data.get("shenZhu")).append("\n\n"); + + sb.append("【十二宫主星】\n"); + if (data.get("shiErGongZhuXing") != null) { + sb.append(data.get("shiErGongZhuXing")).append("\n\n"); + } + + sb.append("【四化】\n"); + sb.append(data.get("huaLuXingGongWeiJieDu")).append("\n"); + sb.append(data.get("huaQuanXingGongWeiJieDu")).append("\n"); + sb.append(data.get("huaKeXingGongWeiJieDu")).append("\n"); + sb.append(data.get("huaJiXingGongWeiJieDu")).append("\n\n"); + + sb.append("请从以下几个方面进行详细解读:\n"); + sb.append("1. 命盘总评:整体命格特点,格局高低\n"); + sb.append("2. 命宫解读:命宫主星的意义和影响\n"); + sb.append("3. 性格特质:根据命宫和身宫分析性格\n"); + sb.append("4. 事业运势:官禄宫分析,事业方向建议\n"); + sb.append("5. 财运分析:财帛宫分析,理财建议\n"); + sb.append("6. 感情婚姻:夫妻宫分析,感情建议\n"); + sb.append("7. 人生建议:综合建议和注意事项\n\n"); + sb.append("请用通俗易懂的语言,给出详细而专业的解读。"); + + return sb.toString(); + } + + public static String getLiuYaoSystemPrompt() { + return "你是一位精通六爻预测的大师,对六十四卦的含义和变化有深刻的理解。" + + "你擅长通过六爻卦象分析事物的吉凶祸福、发展趋势。" + + "你的解读准确到位,既有理论深度,又切合实际。" + + "你会根据世应关系、六亲配置、日月建的影响等给出全面的分析。" + + "请用温暖、积极的语气进行解读,给出建设性的建议。"; + } + + public static String getLiuYaoUserPrompt(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下六爻卦象进行详细解读:\n\n"); + sb.append("姓名:").append(data.get("name")).append("\n"); + sb.append("占事:").append(data.get("occupy")).append("\n"); + sb.append("阳历:").append(data.get("solar")).append("\n"); + sb.append("阴历:").append(data.get("lunar")).append("\n\n"); + + sb.append("【卦象信息】\n"); + sb.append("本卦:").append(data.get("benGuaName")).append("\n"); + sb.append("变卦:").append(data.get("bianGuaName")).append("\n"); + sb.append("上卦:").append(data.get("shangGuaName")).append("\n"); + sb.append("下卦:").append(data.get("xiaGuaName")).append("\n\n"); + + sb.append("【卦辞】\n"); + sb.append("本卦卦辞:").append(data.get("benGuaGuaCi")).append("\n"); + sb.append("变卦卦辞:").append(data.get("bianGuaGuaCi")).append("\n\n"); + + sb.append("【六爻】\n"); + sb.append("本卦六爻:").append(data.get("benGuaLiuYaoName")).append("\n"); + sb.append("六亲:").append(data.get("benGuaLiuYaoLiuQin")).append("\n"); + sb.append("世应:").append(data.get("benGuaLiuYaoShiYing")).append("\n"); + sb.append("六神:").append(data.get("benGuaLiuYaoLiuShen")).append("\n\n"); + + sb.append("【日月建】\n"); + sb.append("月建:").append(data.get("monthGanZhi")).append("\n"); + sb.append("日建:").append(data.get("dayGanZhi")).append("\n"); + sb.append("月将:").append(data.get("yueJiang")).append("\n\n"); + + sb.append("请从以下几个方面进行详细解读:\n"); + sb.append("1. 卦象总评:整体卦象的含义和启示\n"); + sb.append("2. 世应分析:世爻和应爻的关系及含义\n"); + sb.append("3. 动爻解读:动爻的变化及影响\n"); + sb.append("4. 六亲分析:六亲的配置及含义\n"); + sb.append("5. 吉凶判断:根据卦象判断吉凶\n"); + sb.append("6. 发展趋势:事物的发展走向\n"); + sb.append("7. 建议指导:具体的行动建议\n\n"); + sb.append("请用通俗易懂的语言,给出详细而专业的解读。"); + + return sb.toString(); + } + + public static String getMeiHuaSystemPrompt() { + return "你是一位精通梅花易数的大师,对八卦象数有深刻的理解。" + + "你擅长通过梅花易数起卦分析事物的发展变化。" + + "你的解读简洁明了,直指要害。" + + "你会根据卦象的体用关系、五行生克等给出精准的分析。" + + "请用温暖、积极的语气进行解读,给出建设性的建议。"; + } + + public static String getMeiHuaUserPrompt(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下梅花易数卦象进行详细解读:\n\n"); + sb.append("姓名:").append(data.get("name")).append("\n"); + sb.append("占事:").append(data.get("occupy")).append("\n"); + sb.append("阳历:").append(data.get("solar")).append("\n"); + sb.append("阴历:").append(data.get("lunar")).append("\n\n"); + + sb.append("【卦象信息】\n"); + sb.append("本卦:").append(data.get("benGuaName")).append("\n"); + sb.append("变卦:").append(data.get("bianGuaName")).append("\n"); + sb.append("上卦:").append(data.get("shangGuaName")).append("\n"); + sb.append("下卦:").append(data.get("xiaGuaName")).append("\n"); + sb.append("动爻:").append(data.get("dongYaoStr")).append("\n\n"); + + sb.append("【卦辞】\n"); + sb.append("本卦卦辞:").append(data.get("benGuaGuaCi")).append("\n"); + sb.append("变卦卦辞:").append(data.get("bianGuaGuaCi")).append("\n\n"); + + sb.append("【四柱】\n"); + sb.append("年柱:").append(data.get("yearGanZhi")).append("\n"); + sb.append("月柱:").append(data.get("monthGanZhi")).append("\n"); + sb.append("日柱:").append(data.get("dayGanZhi")).append("\n"); + sb.append("时柱:").append(data.get("hourGanZhi")).append("\n\n"); + + sb.append("请从以下几个方面进行详细解读:\n"); + sb.append("1. 卦象总评:整体卦象的含义\n"); + sb.append("2. 体用分析:体卦和用卦的关系\n"); + sb.append("3. 动爻解读:动爻的含义和影响\n"); + sb.append("4. 五行生克:五行之间的关系\n"); + sb.append("5. 吉凶判断:根据卦象判断吉凶\n"); + sb.append("6. 发展趋势:事物的发展走向\n"); + sb.append("7. 建议指导:具体的行动建议\n\n"); + sb.append("请用通俗易懂的语言,给出详细而专业的解读。"); + + return sb.toString(); + } + + public static String getQiMenSystemPrompt() { + return "你是一位精通奇门遁甲的大师,对奇门格局有深刻的理解。" + + "你擅长通过奇门遁甲盘分析事物的发展变化、吉凶祸福。" + + "你的解读精准到位,既有理论高度,又贴近实际。" + + "你会根据天地人神四盘、八门九星等给出全面的分析。" + + "请用温暖、积极的语气进行解读,给出建设性的建议。"; + } + + public static String getQiMenUserPrompt(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下奇门遁甲盘进行详细解读:\n\n"); + sb.append("姓名:").append(data.get("name")).append("\n"); + sb.append("占事:").append(data.get("occupy")).append("\n"); + sb.append("阳历:").append(data.get("solar")).append("\n"); + sb.append("阴历:").append(data.get("lunar")).append("\n\n"); + + sb.append("【基本信息】\n"); + sb.append("节气:").append(data.get("jieQi")).append("\n"); + sb.append("遁局:").append(data.get("yinYangDun")).append(" 第").append(data.get("juShu")).append("局\n"); + sb.append("值符:").append(data.get("zhiFu")).append("\n"); + sb.append("值使:").append(data.get("zhiShi")).append("\n\n"); + + sb.append("【四柱】\n"); + sb.append("年柱:").append(data.get("yearGanZhi")).append("\n"); + sb.append("月柱:").append(data.get("monthGanZhi")).append("\n"); + sb.append("日柱:").append(data.get("dayGanZhi")).append("\n"); + sb.append("时柱:").append(data.get("hourGanZhi")).append("\n\n"); + + sb.append("【九宫布局】\n"); + sb.append("天盘:").append(data.get("tianPan")).append("\n"); + sb.append("地盘:").append(data.get("diPan")).append("\n"); + sb.append("人盘:").append(data.get("renPan")).append("\n"); + sb.append("神盘:").append(data.get("shenPan")).append("\n\n"); + + sb.append("请从以下几个方面进行详细解读:\n"); + sb.append("1. 局势总评:整体格局的特点\n"); + sb.append("2. 值符值使:值符和值使的含义\n"); + sb.append("3. 天盘分析:天盘九星的配置\n"); + sb.append("4. 地盘分析:地盘九宫的含义\n"); + sb.append("5. 人盘分析:八门的吉凶\n"); + sb.append("6. 神盘分析:八神的配置\n"); + sb.append("7. 格局判断:特殊格局的分析\n"); + sb.append("8. 建议指导:具体的行动建议\n\n"); + sb.append("请用通俗易懂的语言,给出详细而专业的解读。"); + + return sb.toString(); + } + + public static String getDaLiuRenSystemPrompt() { + return "你是一位精通大六壬的大师,对六壬课式有深刻的理解。" + + "你擅长通过大六壬课分析事物的发展变化、吉凶祸福。" + + "你的解读精准到位,既有理论高度,又贴近实际。" + + "你会根据天地盘、四课三传等给出全面的分析。" + + "请用温暖、积极的语气进行解读,给出建设性的建议。"; + } + + public static String getDaLiuRenUserPrompt(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下大六壬课进行详细解读:\n\n"); + sb.append("姓名:").append(data.get("name")).append("\n"); + sb.append("占事:").append(data.get("occupy")).append("\n"); + sb.append("阳历:").append(data.get("solar")).append("\n"); + sb.append("阴历:").append(data.get("lunar")).append("\n\n"); + + sb.append("【基本信息】\n"); + sb.append("节气:").append(data.get("chuShengJie")).append("\n"); + sb.append("月将:").append(data.get("yueJiang")).append("\n"); + sb.append("昼/夜:").append(data.get("tianDiPanType")).append("\n\n"); + + sb.append("【四柱】\n"); + sb.append("年柱:").append(data.get("yearGanZhi")).append("\n"); + sb.append("月柱:").append(data.get("monthGanZhi")).append("\n"); + sb.append("日柱:").append(data.get("dayGanZhi")).append("\n"); + sb.append("时柱:").append(data.get("hourGanZhi")).append("\n\n"); + + sb.append("【天地盘】\n"); + sb.append("天盘:").append(data.get("tianPan")).append("\n"); + sb.append("地盘:").append(data.get("diPan")).append("\n\n"); + + sb.append("【四课】\n"); + sb.append(data.get("siKe")).append("\n\n"); + + sb.append("【三传】\n"); + sb.append("初传:").append(data.get("sanChuan")).append("\n"); + sb.append("三传遁干:").append(data.get("sanChuanDunGan")).append("\n"); + sb.append("三传六亲:").append(data.get("sanChuanLiuQin")).append("\n\n"); + + sb.append("请从以下几个方面进行详细解读:\n"); + sb.append("1. 课体总评:整体课式的特点\n"); + sb.append("2. 天地盘:天地盘的配置及含义\n"); + sb.append("3. 四课分析:四课的含义和关系\n"); + sb.append("4. 三传解读:三传的含义和影响\n"); + sb.append("5. 吉凶判断:根据课式判断吉凶\n"); + sb.append("6. 发展趋势:事物的发展走向\n"); + sb.append("7. 建议指导:具体的行动建议\n\n"); + sb.append("请用通俗易懂的语言,给出详细而专业的解读。"); + + return sb.toString(); + } + + public static String getTaLuoSystemPrompt() { + return "你是一位精通塔罗牌的大师,对78张塔罗牌的含义有深刻的理解。" + + "你擅长通过塔罗牌阵分析问题、预测趋势、给出指引。" + + "你的解读温暖而有洞察力,既有神秘感,又切合实际。" + + "你会根据牌面组合、正逆位等给出全面的分析。" + + "请用温暖、积极的语气进行解读,给出建设性的建议。"; + } + + public static String getTaLuoUserPrompt(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下塔罗牌阵进行详细解读:\n\n"); + sb.append("问题:").append(data.get("question")).append("\n"); + sb.append("牌阵类型:").append(data.get("spreadName")).append("\n\n"); + + sb.append("【抽到的牌】\n"); + if (data.get("cards") != null) { + java.util.List> cards = (java.util.List>) data.get("cards"); + for (Map card : cards) { + sb.append("位置").append(card.get("position")).append("(").append(card.get("positionMeaning")).append("):"); + sb.append(card.get("name")).append(" "); + sb.append((Boolean)card.get("isReversed") ? "(逆位)" : "(正位)").append("\n"); + sb.append("含义:").append(card.get("isReversed") != null && (Boolean)card.get("isReversed") ? + card.get("reversedMeaning") : card.get("uprightMeaning")).append("\n\n"); + } + } + + sb.append("请从以下几个方面进行详细解读:\n"); + sb.append("1. 整体印象:牌面的整体感觉和氛围\n"); + sb.append("2. 逐牌解读:每张牌在各自位置的含义\n"); + sb.append("3. 牌面关联:牌与牌之间的关系和互动\n"); + sb.append("4. 核心信息:牌面想要传达的核心信息\n"); + sb.append("5. 行动建议:根据牌面给出的行动建议\n"); + sb.append("6. 注意事项:需要特别注意的方面\n\n"); + sb.append("请用通俗易懂的语言,给出详细而专业的解读。"); + + return sb.toString(); + } + + public static String getZhanXingSystemPrompt() { + return "你是一位精通西方占星学的大师,对十二星座、十大行星、十二宫位有深刻的理解。" + + "你擅长通过星盘分析一个人的性格特质、人生方向、感情运势等。" + + "你的解读深入浅出,既有神秘感,又贴近生活实际。" + + "你会根据行星落座、宫位配置、相位关系等给出全面的分析。" + + "请用温暖、积极的语气进行解读,给出建设性的建议。"; + } + + public static String getZhanXingUserPrompt(Map data) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下星盘进行详细解读:\n\n"); + sb.append("姓名:").append(data.get("name")).append("\n"); + sb.append("出生时间:").append(data.get("solar")).append("\n"); + sb.append("出生地点:").append(data.get("birthPlace")).append("\n\n"); + + sb.append("【三大星座】\n"); + sb.append("太阳星座:").append(data.get("sunSign")).append("\n"); + sb.append("月亮星座:").append(data.get("moonSign")).append("\n"); + sb.append("上升星座:").append(data.get("risingSign")).append("\n\n"); + + sb.append("【行星配置】\n"); + if (data.get("planets") != null) { + java.util.List> planets = (java.util.List>) data.get("planets"); + for (Map planet : planets) { + sb.append(planet.get("name")).append(":"); + sb.append(planet.get("sign")).append(" "); + sb.append(planet.get("house")); + sb.append(planet.get("retrograde") != null && (Boolean)planet.get("retrograde") ? "(逆行)" : "").append("\n"); + } + } + sb.append("\n"); + + sb.append("【元素分析】\n"); + if (data.get("elements") != null) { + Map elements = (Map) data.get("elements"); + sb.append("火象:").append(elements.get("火象")).append("%\n"); + sb.append("土象:").append(elements.get("土象")).append("%\n"); + sb.append("风象:").append(elements.get("风象")).append("%\n"); + sb.append("水象:").append(elements.get("水象")).append("%\n"); + } + sb.append("\n"); + + sb.append("请从以下几个方面进行详细解读:\n"); + sb.append("1. 星盘总评:整体星盘的特点和格局\n"); + sb.append("2. 太阳星座:核心性格和人生方向\n"); + sb.append("3. 月亮星座:情感需求和内在自我\n"); + sb.append("4. 上升星座:外在形象和人生起点\n"); + sb.append("5. 行星配置:各行星落座和宫位的含义\n"); + sb.append("6. 元素分析:四元素的平衡情况\n"); + sb.append("7. 人生建议:综合建议和注意事项\n\n"); + sb.append("请用通俗易懂的语言,给出详细而专业的解读。"); + + return sb.toString(); + } +} diff --git a/xuan-deduct-uniapp/src/pages/bazi/result.vue b/xuan-deduct-uniapp/src/pages/bazi/result.vue index fc508ab..91eb237 100644 --- a/xuan-deduct-uniapp/src/pages/bazi/result.vue +++ b/xuan-deduct-uniapp/src/pages/bazi/result.vue @@ -26,69 +26,13 @@ - + - 命理总评 + 🤖 AI命理分析 - - - {{ result.analysis.summary || '暂无' }} - - - - - - - 详细分析 - - - - - 性 - 性格特质 - - {{ result.analysis.personality }} - - - - - 业 - 事业发展 - - {{ result.analysis.career }} - - - - - 婚 - 婚姻感情 - - {{ result.analysis.marriage }} - - - - - 财 - 财运状况 - - {{ result.analysis.wealth }} - - - - - 健 - 健康运势 - - {{ result.analysis.health }} - - - - - 言 - 人生建议 - - {{ result.analysis.advice }} + + {{ result.aiAnalysis }} @@ -389,7 +333,7 @@ page { background: #F3F4F6; } -.summary-card, .detail-card, .bazi-card, .wuxing-card, .shensha-card, .extra-card, .liuyi-card { +.summary-card, .detail-card, .bazi-card, .wuxing-card, .shensha-card, .extra-card, .liuyi-card, .ai-card { background: rgba(255, 255, 255, 0.9); border-radius: 24rpx; padding: 24rpx; @@ -397,6 +341,24 @@ page { box-shadow: 0 8rpx 32rpx rgba(131, 24, 67, 0.08); } +.ai-card { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(254, 243, 199, 0.3) 100%); + border: 2rpx solid #FCD34D; +} + +.ai-content { + padding: 16rpx; + background: rgba(255, 255, 255, 0.8); + border-radius: 16rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + .card-header { display: flex; align-items: center; diff --git a/xuan-deduct-uniapp/src/pages/daliuren/result.vue b/xuan-deduct-uniapp/src/pages/daliuren/result.vue index dda5a6c..1125850 100644 --- a/xuan-deduct-uniapp/src/pages/daliuren/result.vue +++ b/xuan-deduct-uniapp/src/pages/daliuren/result.vue @@ -19,6 +19,13 @@ + + 🤖 AI课体解读 + + {{ result.aiAnalysis }} + + + 四柱干支 @@ -284,7 +291,7 @@ page { border-radius: 12rpx; } -.section-card { +.section-card, .ai-card { background: rgba(255, 255, 255, 0.95); border-radius: 20rpx; padding: 24rpx; @@ -292,6 +299,24 @@ page { box-shadow: 0 4rpx 16rpx rgba(5, 150, 105, 0.08); } +.ai-card { + background: linear-gradient(135deg, rgba(255,255,255,0.95) 0%, rgba(209,250,229,0.3) 100%); + border: 2rpx solid #A7F3D0; +} + +.ai-content { + padding: 16rpx; + background: rgba(255,255,255,0.8); + border-radius: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + .section-title { font-size: 30rpx; font-weight: 600; diff --git a/xuan-deduct-uniapp/src/pages/liuyao/result.vue b/xuan-deduct-uniapp/src/pages/liuyao/result.vue index daff536..3efb2d6 100644 --- a/xuan-deduct-uniapp/src/pages/liuyao/result.vue +++ b/xuan-deduct-uniapp/src/pages/liuyao/result.vue @@ -26,6 +26,26 @@ + + + + 🤖 AI卦象解读 + + + {{ result.aiAnalysis }} + + + + + + + 🤖 AI卦象解读 + + + {{ result.aiAnalysis }} + + + @@ -289,7 +309,7 @@ export default { background: #eee; } -.gua-card, .liuyao-card, .guaci-card, .extra-card { +.gua-card, .liuyao-card, .guaci-card, .extra-card, .ai-card { background: #fff; border-radius: 20rpx; padding: 25rpx; @@ -297,6 +317,50 @@ export default { box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); } +.ai-card { + background: linear-gradient(135deg, rgba(255,255,255,0.95) 0%, rgba(237,233,254,0.3) 100%); + border: 2rpx solid #C4B5FD; +} + +.ai-content { + padding: 16rpx; + background: rgba(255,255,255,0.8); + border-radius: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + +.card-dot.gold { + background: #F59E0B; +} + +.ai-card { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(237, 233, 254, 0.3) 100%); + border: 2rpx solid #C4B5FD; +} + +.ai-content { + padding: 16rpx; + background: rgba(255, 255, 255, 0.8); + border-radius: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + +.card-dot.gold { + background: #F59E0B; +} + .card-header { display: flex; align-items: center; diff --git a/xuan-deduct-uniapp/src/pages/meihua/result.vue b/xuan-deduct-uniapp/src/pages/meihua/result.vue index 4ad4996..d89a78a 100644 --- a/xuan-deduct-uniapp/src/pages/meihua/result.vue +++ b/xuan-deduct-uniapp/src/pages/meihua/result.vue @@ -26,6 +26,26 @@ + + + + 🤖 AI卦象解读 + + + {{ result.aiAnalysis }} + + + + + + + 🤖 AI卦象解读 + + + {{ result.aiAnalysis }} + + + @@ -318,7 +338,7 @@ export default { background: #eee; } -.gua-card, .liuyao-card, .guaci-card, .link-card, .extra-card { +.gua-card, .liuyao-card, .guaci-card, .link-card, .extra-card, .ai-card { background: #fff; border-radius: 20rpx; padding: 25rpx; @@ -326,6 +346,50 @@ export default { box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); } +.ai-card { + background: linear-gradient(135deg, rgba(255,255,255,0.95) 0%, rgba(252,231,243,0.3) 100%); + border: 2rpx solid #FBCFE8; +} + +.ai-content { + padding: 16rpx; + background: rgba(255,255,255,0.8); + border-radius: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + +.card-dot.gold { + background: #F59E0B; +} + +.ai-card { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(252, 231, 243, 0.3) 100%); + border: 2rpx solid #FBCFE8; +} + +.ai-content { + padding: 16rpx; + background: rgba(255, 255, 255, 0.8); + border-radius: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + +.card-dot.gold { + background: #F59E0B; +} + .card-header { display: flex; align-items: center; diff --git a/xuan-deduct-uniapp/src/pages/qimen/result.vue b/xuan-deduct-uniapp/src/pages/qimen/result.vue index 0aa8a30..e3e2cf5 100644 --- a/xuan-deduct-uniapp/src/pages/qimen/result.vue +++ b/xuan-deduct-uniapp/src/pages/qimen/result.vue @@ -59,6 +59,13 @@ + + 🤖 AI奇门解读 + + {{ data.aiAnalysis }} + + + 九宫排盘 @@ -146,6 +153,13 @@ + + 🤖 AI奇门解读 + + {{ data.aiAnalysis }} + + + 三盘信息 @@ -501,6 +515,47 @@ page { box-shadow: 0 8rpx 32rpx rgba(79, 70, 229, 0.08); } +.ai-card { + background: linear-gradient(135deg, rgba(255,255,255,0.95) 0%, rgba(224,231,255,0.3) 100%); + border-radius: 24rpx; + padding: 24rpx; + margin-bottom: 24rpx; + box-shadow: 0 8rpx 32rpx rgba(79, 70, 229, 0.08); + border: 2rpx solid #A5B4FC; +} + +.ai-content { + padding: 16rpx; + background: rgba(255,255,255,0.8); + border-radius: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + +.ai-card { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(224, 231, 255, 0.3) 100%); + border: 2rpx solid #C7D2FE; +} + +.ai-content { + padding: 16rpx; + background: rgba(255, 255, 255, 0.8); + border-radius: 12rpx; + margin-top: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + .detail-section { padding: 16rpx 0; border-bottom: 2rpx solid #F3F4F6; diff --git a/xuan-deduct-uniapp/src/pages/taluo/result.vue b/xuan-deduct-uniapp/src/pages/taluo/result.vue index ca85682..aaf4e91 100644 --- a/xuan-deduct-uniapp/src/pages/taluo/result.vue +++ b/xuan-deduct-uniapp/src/pages/taluo/result.vue @@ -30,6 +30,16 @@ + + + + 🤖 AI塔罗解读 + + + {{ result.aiAnalysis }} + + + @@ -285,7 +295,7 @@ export default { font-weight: bold; } -.interpretation-card { +.interpretation-card, .ai-card { background: #fff; border-radius: 20rpx; padding: 25rpx; @@ -293,6 +303,28 @@ export default { box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); } +.ai-card { + background: linear-gradient(135deg, rgba(255,255,255,0.95) 0%, rgba(243,232,255,0.3) 100%); + border: 2rpx solid #E9D5FF; +} + +.ai-content { + padding: 16rpx; + background: rgba(255,255,255,0.8); + border-radius: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + +.card-dot.gold { + background: #F59E0B; +} + .interpretation-text { font-size: 26rpx; color: #333; diff --git a/xuan-deduct-uniapp/src/pages/zhanxing/result.vue b/xuan-deduct-uniapp/src/pages/zhanxing/result.vue index 1976c59..2434754 100644 --- a/xuan-deduct-uniapp/src/pages/zhanxing/result.vue +++ b/xuan-deduct-uniapp/src/pages/zhanxing/result.vue @@ -26,6 +26,16 @@ + + + + 🤖 AI星盘解读 + + + {{ result.aiAnalysis }} + + + @@ -457,7 +467,7 @@ export default { background: #eee; } -.sign-card, .planets-card, .houses-card, .aspects-card, .elements-card, .qualities-card { +.sign-card, .planets-card, .houses-card, .aspects-card, .elements-card, .qualities-card, .ai-card { background: #fff; border-radius: 20rpx; padding: 25rpx; @@ -465,6 +475,24 @@ export default { box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); } +.ai-card { + background: linear-gradient(135deg, rgba(255,255,255,0.95) 0%, rgba(243,232,255,0.3) 100%); + border: 2rpx solid #E9D5FF; +} + +.ai-content { + padding: 16rpx; + background: rgba(255,255,255,0.8); + border-radius: 12rpx; +} + +.ai-text { + font-size: 26rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + .card-header { display: flex; align-items: center; diff --git a/xuan-deduct-uniapp/src/pages/ziwei/result.vue b/xuan-deduct-uniapp/src/pages/ziwei/result.vue index 68b1000..fb002a0 100644 --- a/xuan-deduct-uniapp/src/pages/ziwei/result.vue +++ b/xuan-deduct-uniapp/src/pages/ziwei/result.vue @@ -20,60 +20,13 @@ - + - 📖 - 命理解读 + 🤖 + AI命理解读 - - - - 👤 - 性格特点 - - - {{ result.jieDu.xingGe }} - - - - - - 💼 - 事业发展 - - - {{ result.jieDu.shiYe }} - - - - - - 💕 - 感情婚姻 - - - {{ result.jieDu.ganQing }} - - - - - - 💰 - 财运分析 - - - {{ result.jieDu.caiYun }} - - - - - - ✨ - 综合总结 - - - {{ result.jieDu.zongJie }} - + + {{ result.aiAnalysis }} @@ -287,6 +240,28 @@ page { margin-bottom: 24rpx; } +.ai-card { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(237, 233, 254, 0.3) 100%); + border-radius: 24rpx; + padding: 24rpx; + margin-bottom: 24rpx; + box-shadow: 0 8rpx 32rpx rgba(109, 40, 217, 0.08); + border: 2rpx solid #C4B5FD; +} + +.ai-content { + padding: 16rpx; + background: rgba(255, 255, 255, 0.8); + border-radius: 16rpx; +} + +.ai-text { + font-size: 28rpx; + color: #374151; + line-height: 1.8; + white-space: pre-line; +} + .section-title { display: flex; align-items: center;