记录页面添加分页、搜索、全选和一键清理功能
后端实现: - RecordController:添加分页和搜索参数支持 - DeductRecordService:新增findByUserIdWithSearch方法 - DeductRecordRepository:添加分页查询和关键词搜索方法 - 新增deleteBatch批量删除接口 前端实现: - 搜索栏:支持按姓名或事项搜索 - 分页功能:上一页/下一页按钮,显示页码信息 - 全选功能:复选框全选/取消全选 - 批量删除:选中多条记录后可批量删除 - 一键清空:清空所有测算记录 - UI优化:添加操作栏、复选框样式 API接口: - GET /api/records/list - 支持分页和搜索参数 - POST /api/records/deleteBatch - 批量删除记录 - POST /api/records/clear - 清空所有记录
This commit is contained in:
1 parent
03535c831f
commit
16624fa189
8 files changed
+675
-499
No files matched your search
@@ -1,17 +1,12 @@
|
||||
package xuan.controller;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import xuan.service.HunYuanAiService;
|
||||
import xuan.service.PromptTemplates;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/taluo")
|
||||
public class TaLuoController {
|
||||
|
||||
private final HunYuanAiService aiService = new HunYuanAiService();
|
||||
|
||||
private static final List<Map<String, Object>> MAJOR_ARCANA = Arrays.asList(
|
||||
createCard(0, "愚者", "The Fool", "新的开始、冒险、天真、自由", "鲁莽、冲动、不负责任", "代表新的旅程和无限可能"),
|
||||
createCard(1, "魔术师", "The Magician", "创造力、技能、意志力、自信", "欺骗、操纵、缺乏计划", "代表运用技能实现目标"),
|
||||
@@ -37,6 +32,8 @@ public class TaLuoController {
|
||||
createCard(21, "世界", "The World", "完成、成就、整合、圆满", "未完成、缺乏闭合、延迟成功", "代表完成和圆满")
|
||||
);
|
||||
|
||||
private static final List<Map<String, Object>> MINOR_ARCANA = createMinorArcana();
|
||||
|
||||
private static Map<String, Object> createCard(int number, String name, String englishName,
|
||||
String uprightMeaning, String reversedMeaning, String description) {
|
||||
Map<String, Object> card = new HashMap<>();
|
||||
@@ -46,10 +43,82 @@ public class TaLuoController {
|
||||
card.put("uprightMeaning", uprightMeaning);
|
||||
card.put("reversedMeaning", reversedMeaning);
|
||||
card.put("description", description);
|
||||
card.put("type", "major");
|
||||
card.put("type", number < 22 ? "major" : "minor");
|
||||
return card;
|
||||
}
|
||||
|
||||
private static List<Map<String, Object>> createMinorArcana() {
|
||||
List<Map<String, Object>> cards = new ArrayList<>();
|
||||
|
||||
String[] suits = {"权杖", "圣杯", "宝剑", "星币"};
|
||||
String[] suitMeanings = {"行动与创造", "情感与关系", "思想与沟通", "物质与现实"};
|
||||
String[] ranks = {"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "侍从", "骑士", "王后", "国王"};
|
||||
|
||||
int cardNumber = 22;
|
||||
for (int suitIndex = 0; suitIndex < suits.length; suitIndex++) {
|
||||
String suit = suits[suitIndex];
|
||||
String suitMeaning = suitMeanings[suitIndex];
|
||||
|
||||
for (int rankIndex = 0; rankIndex < ranks.length; rankIndex++) {
|
||||
String rank = ranks[rankIndex];
|
||||
String cardName = suit + rank;
|
||||
|
||||
Map<String, Object> card = new HashMap<>();
|
||||
card.put("number", cardNumber++);
|
||||
card.put("name", cardName);
|
||||
card.put("englishName", rank + " of " + getSuitEnglish(suit));
|
||||
card.put("suit", suit);
|
||||
card.put("rank", rank);
|
||||
card.put("uprightMeaning", generateUprightMeaning(suit, rank, suitMeaning));
|
||||
card.put("reversedMeaning", generateReversedMeaning(suit, rank, suitMeaning));
|
||||
card.put("description", suitMeaning + "领域的" + getRankDescription(rank));
|
||||
card.put("type", "minor");
|
||||
|
||||
cards.add(card);
|
||||
}
|
||||
}
|
||||
|
||||
return cards;
|
||||
}
|
||||
|
||||
private static String getSuitEnglish(String suit) {
|
||||
switch (suit) {
|
||||
case "权杖": return "Wands";
|
||||
case "圣杯": return "Cups";
|
||||
case "宝剑": return "Swords";
|
||||
case "星币": return "Pentacles";
|
||||
default: return suit;
|
||||
}
|
||||
}
|
||||
|
||||
private static String getRankDescription(String rank) {
|
||||
switch (rank) {
|
||||
case "Ace": return "新的开始";
|
||||
case "Two": return "选择与平衡";
|
||||
case "Three": return "发展与创造";
|
||||
case "Four": return "稳定与基础";
|
||||
case "Five": return "冲突与挑战";
|
||||
case "Six": return "和谐与胜利";
|
||||
case "Seven": return "评估与选择";
|
||||
case "Eight": return "行动与速度";
|
||||
case "Nine": return "接近完成";
|
||||
case "Ten": return "完成与圆满";
|
||||
case "侍从": return "学习与探索";
|
||||
case "骑士": return "行动与追求";
|
||||
case "王后": return "内在智慧";
|
||||
case "国王": return "掌控与权威";
|
||||
default: return rank;
|
||||
}
|
||||
}
|
||||
|
||||
private static String generateUprightMeaning(String suit, String rank, String suitMeaning) {
|
||||
return suitMeaning + "方面的" + getRankDescription(rank) + ",正位时能量流动顺畅";
|
||||
}
|
||||
|
||||
private static String generateReversedMeaning(String suit, String rank, String suitMeaning) {
|
||||
return suitMeaning + "方面的" + getRankDescription(rank) + ",逆位时需要反思调整";
|
||||
}
|
||||
|
||||
@PostMapping("/divine")
|
||||
public Map<String, Object> divine(@RequestBody TaLuoRequest request) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
@@ -57,7 +126,9 @@ public class TaLuoController {
|
||||
String spreadType = request.getSpreadType() != null ? request.getSpreadType() : "single";
|
||||
int cardCount = getCardCount(spreadType);
|
||||
|
||||
List<Map<String, Object>> allCards = new ArrayList<>(MAJOR_ARCANA);
|
||||
List<Map<String, Object>> allCards = new ArrayList<>();
|
||||
allCards.addAll(MAJOR_ARCANA);
|
||||
allCards.addAll(MINOR_ARCANA);
|
||||
|
||||
Collections.shuffle(allCards, new Random());
|
||||
|
||||
@@ -76,14 +147,9 @@ 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("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) {
|
||||
@@ -139,6 +205,109 @@ public class TaLuoController {
|
||||
return "未知";
|
||||
}
|
||||
|
||||
private String generateInterpretation(List<Map<String, Object>> cards, String spreadType, String question) {
|
||||
StringBuilder interpretation = new StringBuilder();
|
||||
|
||||
if ("single".equals(spreadType)) {
|
||||
Map<String, Object> card = cards.get(0);
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning");
|
||||
|
||||
interpretation.append("您抽到的牌是【").append(name).append("】");
|
||||
interpretation.append(isReversed ? "(逆位)" : "(正位)").append("。\n\n");
|
||||
interpretation.append("牌义解读:").append(meaning).append("。\n\n");
|
||||
interpretation.append((String) card.get("description"));
|
||||
} else if ("three".equals(spreadType)) {
|
||||
interpretation.append("三张牌阵解读:\n\n");
|
||||
|
||||
for (Map<String, Object> card : cards) {
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String position = (String) card.get("positionMeaning");
|
||||
String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning");
|
||||
|
||||
interpretation.append("【").append(position).append("】");
|
||||
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append("\n");
|
||||
interpretation.append(meaning).append("\n\n");
|
||||
}
|
||||
|
||||
interpretation.append("综合解读:从过去到现在再到未来,牌面展示了事情的发展脉络。");
|
||||
} else if ("celtic".equals(spreadType)) {
|
||||
interpretation.append("凯尔特十字牌阵解读:\n\n");
|
||||
interpretation.append("核心区域(位置1-6):\n");
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
Map<String, Object> card = cards.get(i);
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String position = (String) card.get("positionMeaning");
|
||||
String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning");
|
||||
|
||||
interpretation.append("【").append(position).append("】");
|
||||
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append(":");
|
||||
interpretation.append(meaning).append("\n");
|
||||
}
|
||||
|
||||
interpretation.append("\n延伸区域(位置7-10):\n");
|
||||
|
||||
for (int i = 6; i < 10; i++) {
|
||||
Map<String, Object> card = cards.get(i);
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String position = (String) card.get("positionMeaning");
|
||||
String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning");
|
||||
|
||||
interpretation.append("【").append(position).append("】");
|
||||
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append(":");
|
||||
interpretation.append(meaning).append("\n");
|
||||
}
|
||||
|
||||
interpretation.append("\n综合解读:凯尔特十字牌阵为您提供了全方位的视角,帮助您深入理解问题的各个方面。");
|
||||
}
|
||||
|
||||
return interpretation.toString();
|
||||
}
|
||||
|
||||
@GetMapping("/cards")
|
||||
public Map<String, Object> getAllCards() {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
List<Map<String, Object>> allCards = new ArrayList<>();
|
||||
allCards.addAll(MAJOR_ARCANA);
|
||||
allCards.addAll(MINOR_ARCANA);
|
||||
|
||||
result.put("success", true);
|
||||
result.put("data", allCards);
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("error", e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@GetMapping("/card/{number}")
|
||||
public Map<String, Object> getCard(@PathVariable int number) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
List<Map<String, Object>> allCards = new ArrayList<>();
|
||||
allCards.addAll(MAJOR_ARCANA);
|
||||
allCards.addAll(MINOR_ARCANA);
|
||||
|
||||
if (number >= 0 && number < allCards.size()) {
|
||||
result.put("success", true);
|
||||
result.put("data", allCards.get(number));
|
||||
} else {
|
||||
result.put("success", false);
|
||||
result.put("error", "Card not found");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("error", e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static class TaLuoRequest {
|
||||
private String question;
|
||||
private String spreadType;
|
||||
|
||||
Reference in new issue
Block a user