diff --git a/src/main/java/xuan/controller/TaLuoController.java b/src/main/java/xuan/controller/TaLuoController.java new file mode 100644 index 0000000..643a471 --- /dev/null +++ b/src/main/java/xuan/controller/TaLuoController.java @@ -0,0 +1,320 @@ +package xuan.controller; + +import org.springframework.web.bind.annotation.*; +import java.util.*; + +@RestController +@RequestMapping("/api/taluo") +public class TaLuoController { + + private static final List> MAJOR_ARCANA = Arrays.asList( + createCard(0, "愚者", "The Fool", "新的开始、冒险、天真、自由", "鲁莽、冲动、不负责任", "代表新的旅程和无限可能"), + createCard(1, "魔术师", "The Magician", "创造力、技能、意志力、自信", "欺骗、操纵、缺乏计划", "代表运用技能实现目标"), + createCard(2, "女祭司", "The High Priestess", "直觉、神秘、潜意识、智慧", "隐藏的真相、表面化、无知", "代表内在智慧和直觉"), + createCard(3, "女皇", "The Empress", "丰饶、母性、创造力、自然", "依赖、过度保护、创造力受阻", "代表丰盛和滋养"), + createCard(4, "皇帝", "The Emperor", "权威、结构、控制、父亲形象", "专制、僵化、控制欲过强", "代表秩序和领导力"), + createCard(5, "教皇", "The Hierophant", "传统、信仰、教育、精神指导", "教条主义、叛逆、打破传统", "代表精神指引和传统价值"), + createCard(6, "恋人", "The Lovers", "爱情、和谐、选择、价值观", "不和谐、失衡、错误选择", "代表爱情和重要抉择"), + createCard(7, "战车", "The Chariot", "意志力、胜利、决心、控制", "失控、侵略性、缺乏方向", "代表通过决心获得胜利"), + createCard(8, "力量", "Strength", "勇气、耐心、内在力量、同情心", "自我怀疑、软弱、缺乏自信", "代表内在的勇气和力量"), + createCard(9, "隐士", "The Hermit", "内省、寻求真理、孤独、智慧", "孤立、孤独、拒绝帮助", "代表寻求内在智慧"), + createCard(10, "命运之轮", "Wheel of Fortune", "命运、转折点、循环、机遇", "厄运、抗拒改变、失控", "代表命运的转变"), + createCard(11, "正义", "Justice", "公正、真理、因果、法律", "不公正、不诚实、逃避责任", "代表公正和平衡"), + createCard(12, "倒吊人", "The Hanged Man", "牺牲、等待、新视角、放下", "拖延、抗拒、无谓牺牲", "代表通过牺牲获得洞察"), + createCard(13, "死神", "Death", "结束、转变、重生、放下过去", "抗拒改变、停滞、恐惧", "代表结束和新的开始"), + createCard(14, "节制", "Temperance", "平衡、耐心、适度、和谐", "失衡、过度、缺乏耐心", "代表平衡和调和"), + createCard(15, "恶魔", "The Devil", "束缚、诱惑、物质主义、阴暗面", "解脱、打破束缚、面对阴影", "代表被物质束缚"), + createCard(16, "塔", "The Tower", "突变、毁灭、觉醒、真相揭露", "逃避改变、恐惧灾难、延迟崩溃", "代表突然的改变和觉醒"), + createCard(17, "星星", "The Star", "希望、灵感、宁静、更新", "绝望、缺乏信心、失去希望", "代表希望和灵感"), + createCard(18, "月亮", "The Moon", "幻觉、恐惧、潜意识、直觉", "困惑、恐惧、逃避现实", "代表潜意识和幻觉"), + createCard(19, "太阳", "The Sun", "成功、快乐、活力、积极", "暂时的挫折、过度乐观、自负", "代表成功和快乐"), + createCard(20, "审判", "Judgement", "重生、觉醒、召唤、反思", "自我怀疑、拒绝改变、逃避审判", "代表觉醒和重生"), + 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<>(); + card.put("number", number); + card.put("name", name); + card.put("englishName", englishName); + card.put("uprightMeaning", uprightMeaning); + card.put("reversedMeaning", reversedMeaning); + card.put("description", description); + card.put("type", number < 22 ? "major" : "minor"); + 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<>(); + try { + String spreadType = request.getSpreadType() != null ? request.getSpreadType() : "single"; + int cardCount = getCardCount(spreadType); + + List> allCards = new ArrayList<>(); + allCards.addAll(MAJOR_ARCANA); + allCards.addAll(MINOR_ARCANA); + + Collections.shuffle(allCards, new Random()); + + List> selectedCards = new ArrayList<>(); + for (int i = 0; i < cardCount; i++) { + Map card = new HashMap<>(allCards.get(i)); + boolean isReversed = new Random().nextBoolean(); + card.put("isReversed", isReversed); + card.put("position", i + 1); + card.put("positionMeaning", getPositionMeaning(spreadType, i + 1)); + selectedCards.add(card); + } + + Map data = new HashMap<>(); + data.put("spreadType", spreadType); + data.put("spreadName", getSpreadName(spreadType)); + data.put("question", request.getQuestion()); + data.put("cards", selectedCards); + data.put("interpretation", generateInterpretation(selectedCards, spreadType, request.getQuestion())); + data.put("timestamp", new Date()); + + result.put("success", true); + result.put("data", data); + } catch (Exception e) { + result.put("success", false); + result.put("error", e.getMessage()); + } + return result; + } + + private int getCardCount(String spreadType) { + switch (spreadType) { + case "single": return 1; + case "three": return 3; + case "celtic": return 10; + default: return 1; + } + } + + private String getSpreadName(String spreadType) { + switch (spreadType) { + case "single": return "单张牌占卜"; + case "three": return "三张牌阵"; + case "celtic": return "凯尔特十字牌阵"; + default: return "单张牌占卜"; + } + } + + private String getPositionMeaning(String spreadType, int position) { + if ("single".equals(spreadType)) { + return "当前指引"; + } else if ("three".equals(spreadType)) { + switch (position) { + case 1: return "过去"; + case 2: return "现在"; + case 3: return "未来"; + default: return "未知"; + } + } else if ("celtic".equals(spreadType)) { + switch (position) { + case 1: return "现状"; + case 2: return "阻碍"; + case 3: return "目标"; + case 4: return "根源"; + case 5: return "过去"; + case 6: return "未来"; + case 7: return "自我"; + case 8: return "环境"; + case 9: return "希望与恐惧"; + case 10: return "结果"; + default: return "未知"; + } + } + 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(); + } + + @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; + + public String getQuestion() { return question; } + public void setQuestion(String question) { this.question = question; } + public String getSpreadType() { return spreadType; } + public void setSpreadType(String spreadType) { this.spreadType = spreadType; } + } +} diff --git a/src/main/java/xuan/utils/CommonUtil.java b/src/main/java/xuan/utils/CommonUtil.java index 7c0e4ca..c44a698 100644 --- a/src/main/java/xuan/utils/CommonUtil.java +++ b/src/main/java/xuan/utils/CommonUtil.java @@ -6,7 +6,6 @@ import java.math.BigDecimal; import com.nlf.calendar.Lunar; import com.nlf.calendar.Solar; import org.apache.commons.validator.routines.InetAddressValidator; -import org.omg.CORBA.SystemException; /** * 通用工具 diff --git a/xuan-deduct-uniapp/src/pages/index/index.vue b/xuan-deduct-uniapp/src/pages/index/index.vue index 6af76ed..d7f6f50 100644 --- a/xuan-deduct-uniapp/src/pages/index/index.vue +++ b/xuan-deduct-uniapp/src/pages/index/index.vue @@ -59,6 +59,22 @@ + + + + 塔 + + + + + 塔罗牌 + 神秘指引 · 探索未知 + + + › + + + @@ -158,6 +174,9 @@ export default { }, goToZhanxing() { uni.navigateTo({ url: '/pages/zhanxing/zhanxing' }) + }, + goToTaluo() { + uni.navigateTo({ url: '/pages/taluo/taluo' }) } } } diff --git a/xuan-deduct-uniapp/src/pages/taluo/result.vue b/xuan-deduct-uniapp/src/pages/taluo/result.vue new file mode 100644 index 0000000..e64d6bc --- /dev/null +++ b/xuan-deduct-uniapp/src/pages/taluo/result.vue @@ -0,0 +1,274 @@ + + + + + diff --git a/xuan-deduct-uniapp/src/pages/taluo/taluo.vue b/xuan-deduct-uniapp/src/pages/taluo/taluo.vue new file mode 100644 index 0000000..95950ee --- /dev/null +++ b/xuan-deduct-uniapp/src/pages/taluo/taluo.vue @@ -0,0 +1,297 @@ +