记录页面添加分页、搜索、全选和一键清理功能

后端实现:
- RecordController:添加分页和搜索参数支持
- DeductRecordService:新增findByUserIdWithSearch方法
- DeductRecordRepository:添加分页查询和关键词搜索方法
- 新增deleteBatch批量删除接口

前端实现:
- 搜索栏:支持按姓名或事项搜索
- 分页功能:上一页/下一页按钮,显示页码信息
- 全选功能:复选框全选/取消全选
- 批量删除:选中多条记录后可批量删除
- 一键清空:清空所有测算记录
- UI优化:添加操作栏、复选框样式

API接口:
- GET /api/records/list - 支持分页和搜索参数
- POST /api/records/deleteBatch - 批量删除记录
- POST /api/records/clear - 清空所有记录
This commit is contained in:
H1d3rOne committed 2026-03-08 20:43:14 +08:00
1 parent 03535c831f
commit 16624fa189
8 files changed
+675 -499

No files matched your search

@@ -1,402 +1,76 @@
package xuan.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import xuan.entity.ShareRecord;
import xuan.repository.ShareRecordRepository;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@RestController
@RequestMapping("/api/share")
public class ShareController {
@PostMapping("/bazi")
public Map<String, Object> shareBazi(@RequestBody ShareRequest request) {
@Autowired
private ShareRecordRepository shareRecordRepository;
@PostMapping("/create")
public Map<String, Object> createShare(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = request.getData();
String type = (String) params.get("type");
String resultData = (String) params.get("resultData");
String name = (String) params.get("name");
StringBuilder shareText = new StringBuilder();
shareText.append("【八字命理分析】\n\n");
ShareRecord shareRecord = new ShareRecord();
shareRecord.setShareId(UUID.randomUUID().toString().replace("-", "").substring(0, 16));
shareRecord.setType(type);
shareRecord.setResultData(resultData);
shareRecord.setName(name);
if (data.containsKey("name")) {
shareText.append("👤 姓名:").append(data.get("name")).append("\n");
}
if (data.containsKey("solar")) {
shareText.append("📅 出生时间:").append(data.get("solar")).append("\n");
}
if (data.containsKey("bazi")) {
Map<String, Object> bazi = (Map<String, Object>) data.get("bazi");
shareText.append("\n【八字排盘】\n");
shareText.append("年柱:").append(bazi.get("yearGan")).append(bazi.get("yearZhi")).append("\n");
shareText.append("月柱:").append(bazi.get("monthGan")).append(bazi.get("monthZhi")).append("\n");
shareText.append("日柱:").append(bazi.get("dayGan")).append(bazi.get("dayZhi")).append("\n");
shareText.append("时柱:").append(bazi.get("hourGan")).append(bazi.get("hourZhi")).append("\n");
}
if (data.containsKey("interpretation")) {
Map<String, String> interpretation = (Map<String, String>) data.get("interpretation");
shareText.append("\n【命理解读】\n");
if (interpretation.containsKey("personality")) {
shareText.append("\n性格特质:\n").append(interpretation.get("personality")).append("\n");
}
if (interpretation.containsKey("career")) {
shareText.append("\n事业发展:\n").append(interpretation.get("career")).append("\n");
}
if (interpretation.containsKey("marriage")) {
shareText.append("\n婚姻感情:\n").append(interpretation.get("marriage")).append("\n");
}
if (interpretation.containsKey("wealth")) {
shareText.append("\n财运状况:\n").append(interpretation.get("wealth")).append("\n");
}
if (interpretation.containsKey("health")) {
shareText.append("\n健康建议:\n").append(interpretation.get("health")).append("\n");
}
if (interpretation.containsKey("advice")) {
shareText.append("\n人生建议:\n").append(interpretation.get("advice")).append("\n");
}
}
shareText.append("\n——来自玄学测算APP");
shareRecordRepository.save(shareRecord);
result.put("success", true);
result.put("data", shareText.toString());
result.put("shareId", shareRecord.getShareId());
result.put("message", "分享链接创建成功");
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
result.put("error", "创建分享链接失败:" + e.getMessage());
}
return result;
}
@PostMapping("/ziwei")
public Map<String, Object> shareZiwei(@RequestBody ShareRequest request) {
@GetMapping("/view/{shareId}")
public Map<String, Object> viewShare(@PathVariable String shareId) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = request.getData();
ShareRecord shareRecord = shareRecordRepository.findByShareId(shareId)
.orElse(null);
StringBuilder shareText = new StringBuilder();
shareText.append("【紫微斗数命盘】\n\n");
if (data.containsKey("name")) {
shareText.append("👤 姓名:").append(data.get("name")).append("\n");
}
if (data.containsKey("solar")) {
shareText.append("📅 出生时间:").append(data.get("solar")).append("\n");
if (shareRecord == null) {
result.put("success", false);
result.put("error", "分享链接不存在或已过期");
return result;
}
if (data.containsKey("mingGong")) {
shareText.append("\n【命宫主星】\n").append(data.get("mingGong")).append("\n");
if (shareRecord.getExpireTime() != null && shareRecord.getExpireTime().before(new java.util.Date())) {
result.put("success", false);
result.put("error", "分享链接已过期");
return result;
}
if (data.containsKey("interpretation")) {
Map<String, String> interpretation = (Map<String, String>) data.get("interpretation");
shareText.append("\n【命理解读】\n");
if (interpretation.containsKey("personality")) {
shareText.append("\n性格特质:\n").append(interpretation.get("personality")).append("\n");
}
if (interpretation.containsKey("career")) {
shareText.append("\n事业发展:\n").append(interpretation.get("career")).append("\n");
}
if (interpretation.containsKey("wealth")) {
shareText.append("\n财运状况:\n").append(interpretation.get("wealth")).append("\n");
}
if (interpretation.containsKey("marriage")) {
shareText.append("\n婚姻感情:\n").append(interpretation.get("marriage")).append("\n");
}
}
shareText.append("\n——来自玄学测算APP");
result.put("success", true);
result.put("data", shareText.toString());
result.put("data", shareRecord);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
result.put("error", "获取分享数据失败:" + e.getMessage());
}
return result;
}
@PostMapping("/zhanxing")
public Map<String, Object> shareZhanxing(@RequestBody ShareRequest request) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = request.getData();
StringBuilder shareText = new StringBuilder();
shareText.append("【星盘解析】\n\n");
if (data.containsKey("name")) {
shareText.append("👤 姓名:").append(data.get("name")).append("\n");
}
shareText.append("\n【核心星座】\n");
if (data.containsKey("sunSign")) {
shareText.append("☀️ 太阳星座:").append(data.get("sunSign")).append("\n");
}
if (data.containsKey("moonSign")) {
shareText.append("🌙 月亮星座:").append(data.get("moonSign")).append("\n");
}
if (data.containsKey("risingSign")) {
shareText.append("⬆️ 上升星座:").append(data.get("risingSign")).append("\n");
}
if (data.containsKey("interpretation")) {
Map<String, String> interpretation = (Map<String, String>) data.get("interpretation");
shareText.append("\n【命理解读】\n");
if (interpretation.containsKey("personality")) {
shareText.append("\n性格特质:\n").append(interpretation.get("personality")).append("\n");
}
if (interpretation.containsKey("love")) {
shareText.append("\n感情运势:\n").append(interpretation.get("love")).append("\n");
}
if (interpretation.containsKey("career")) {
shareText.append("\n事业发展:\n").append(interpretation.get("career")).append("\n");
}
if (interpretation.containsKey("wealth")) {
shareText.append("\n财运状况:\n").append(interpretation.get("wealth")).append("\n");
}
if (interpretation.containsKey("health")) {
shareText.append("\n健康建议:\n").append(interpretation.get("health")).append("\n");
}
if (interpretation.containsKey("advice")) {
shareText.append("\n人生建议:\n").append(interpretation.get("advice")).append("\n");
}
}
shareText.append("\n——来自玄学测算APP");
result.put("success", true);
result.put("data", shareText.toString());
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/taluo")
public Map<String, Object> shareTaluo(@RequestBody ShareRequest request) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = request.getData();
StringBuilder shareText = new StringBuilder();
shareText.append("【塔罗牌占卜结果】\n\n");
if (data.containsKey("spreadName")) {
shareText.append("🔮 牌阵:").append(data.get("spreadName")).append("\n");
}
if (data.containsKey("question")) {
shareText.append("❓ 问题:").append(data.get("question")).append("\n");
}
if (data.containsKey("cards")) {
List<Map<String, Object>> cards = (List<Map<String, Object>>) data.get("cards");
shareText.append("\n【抽到的牌】\n");
for (Map<String, Object> card : cards) {
String position = (Boolean) card.get("isReversed") ? "逆位" : "正位";
shareText.append(card.get("positionMeaning")).append(":")
.append(card.get("name")).append("(").append(position).append(")\n");
}
}
if (data.containsKey("interpretation")) {
shareText.append("\n【牌义解读】\n").append(data.get("interpretation")).append("\n");
}
if (data.containsKey("summary")) {
Map<String, String> summary = (Map<String, String>) data.get("summary");
shareText.append("\n【综合解读】\n");
if (summary.containsKey("personality")) {
shareText.append("\n性格特质:\n").append(summary.get("personality")).append("\n");
}
if (summary.containsKey("emotion")) {
shareText.append("\n感情运势:\n").append(summary.get("emotion")).append("\n");
}
if (summary.containsKey("career")) {
shareText.append("\n事业发展:\n").append(summary.get("career")).append("\n");
}
if (summary.containsKey("overall")) {
shareText.append("\n总体建议:\n").append(summary.get("overall")).append("\n");
}
}
shareText.append("\n——来自玄学测算APP");
result.put("success", true);
result.put("data", shareText.toString());
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/meihua")
public Map<String, Object> shareMeihua(@RequestBody ShareRequest request) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = request.getData();
StringBuilder shareText = new StringBuilder();
shareText.append("【梅花易数占卜结果】\n\n");
if (data.containsKey("name")) {
shareText.append("👤 占卜者:").append(data.get("name")).append("\n");
}
if (data.containsKey("solar")) {
shareText.append("📅 时间:").append(data.get("solar")).append("\n");
}
if (data.containsKey("lunar")) {
shareText.append("🌙 农历:").append(data.get("lunar")).append("\n");
}
shareText.append("\n【卦象总览】\n");
if (data.containsKey("benGuaName")) {
shareText.append("本卦:").append(data.get("benGuaName"));
if (data.containsKey("benGuaAs")) {
shareText.append(" ").append(data.get("benGuaAs"));
}
shareText.append("\n");
}
if (data.containsKey("bianGuaName")) {
shareText.append("变卦:").append(data.get("bianGuaName"));
if (data.containsKey("bianGuaAs")) {
shareText.append(" ").append(data.get("bianGuaAs"));
}
shareText.append("\n");
}
if (data.containsKey("huGuaName")) {
shareText.append("互卦:").append(data.get("huGuaName"));
if (data.containsKey("huGuaAs")) {
shareText.append(" ").append(data.get("huGuaAs"));
}
shareText.append("\n");
}
if (data.containsKey("dongYaoStr")) {
shareText.append("动爻:").append(data.get("dongYaoStr")).append("爻\n");
}
if (data.containsKey("benGuaGuaCi")) {
shareText.append("\n【本卦卦辞】\n").append(data.get("benGuaGuaCi")).append("\n");
}
if (data.containsKey("bianGuaGuaCi")) {
shareText.append("\n【变卦卦辞】\n").append(data.get("bianGuaGuaCi")).append("\n");
}
shareText.append("\n——来自玄学测算APP");
result.put("success", true);
result.put("data", shareText.toString());
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/liuyao")
public Map<String, Object> shareLiuyao(@RequestBody ShareRequest request) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = request.getData();
StringBuilder shareText = new StringBuilder();
shareText.append("【六爻占卜结果】\n\n");
if (data.containsKey("name")) {
shareText.append("👤 占卜者:").append(data.get("name")).append("\n");
}
if (data.containsKey("solar")) {
shareText.append("📅 时间:").append(data.get("solar")).append("\n");
}
if (data.containsKey("guaName")) {
shareText.append("\n【卦象】\n").append(data.get("guaName")).append("\n");
}
if (data.containsKey("interpretation")) {
shareText.append("\n【卦辞解读】\n").append(data.get("interpretation")).append("\n");
}
shareText.append("\n——来自玄学测算APP");
result.put("success", true);
result.put("data", shareText.toString());
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/qimen")
public Map<String, Object> shareQimen(@RequestBody ShareRequest request) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = request.getData();
StringBuilder shareText = new StringBuilder();
shareText.append("【奇门遁甲排盘】\n\n");
if (data.containsKey("name")) {
shareText.append("👤 占卜者:").append(data.get("name")).append("\n");
}
if (data.containsKey("solar")) {
shareText.append("📅 时间:").append(data.get("solar")).append("\n");
}
if (data.containsKey("juName")) {
shareText.append("\n【局数】\n").append(data.get("juName")).append("\n");
}
if (data.containsKey("interpretation")) {
shareText.append("\n【盘面解读】\n").append(data.get("interpretation")).append("\n");
}
shareText.append("\n——来自玄学测算APP");
result.put("success", true);
result.put("data", shareText.toString());
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/daliuren")
public Map<String, Object> shareDaliuren(@RequestBody ShareRequest request) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = request.getData();
StringBuilder shareText = new StringBuilder();
shareText.append("【大六壬排盘】\n\n");
if (data.containsKey("name")) {
shareText.append("👤 占卜者:").append(data.get("name")).append("\n");
}
if (data.containsKey("solar")) {
shareText.append("📅 时间:").append(data.get("solar")).append("\n");
}
if (data.containsKey("interpretation")) {
shareText.append("\n【盘面解读】\n").append(data.get("interpretation")).append("\n");
}
shareText.append("\n——来自玄学测算APP");
result.put("success", true);
result.put("data", shareText.toString());
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
public static class ShareRequest {
private Map<String, Object> data;
public Map<String, Object> getData() { return data; }
public void setData(Map<String, Object> data) { this.data = data; }
}
}