feat: 完成记录功能开发

- 添加保存记录API到RecordController
- 修复DeductRecordRepository的HQL语法错误
- 更新前端api.js添加记录API
- 更新八字结果页面保存测算记录
- 完善记录列表页面显示历史记录
This commit is contained in:
xuan-bot committed 2026-03-07 23:50:38 +08:00
1 parent 683f55e4ca
commit 91a14ca6d1
10 files changed
+280 -127

No files matched your search

@@ -29,7 +29,18 @@ public class LiuYaoController {
setting.setLeapMonthType(request.getLeapMonthType() != null ? request.getLeapMonthType() : 0);
setting.setXuShiSuiType(request.getXuShiSuiType() != null ? request.getXuShiSuiType() : 0);
setting.setJieQiType(request.getJieQiType() != null ? request.getJieQiType() : 1);
setting.setLiuYaoYaoXiang(request.getLiuYaoYaoXiang() != null ? request.getLiuYaoYaoXiang() : "——,——,——,——,——,——");
setting.setYearGanZhiType(request.getYearGanZhiType() != null ? request.getYearGanZhiType() : 2);
setting.setMonthGanZhiType(request.getMonthGanZhiType() != null ? request.getMonthGanZhiType() : 1);
setting.setDayGanZhiType(request.getDayGanZhiType() != null ? request.getDayGanZhiType() : 0);
setting.setPaiPanType(request.getPaiPanType() != null ? request.getPaiPanType() : 0);
if (request.getLiuYaoYaoXiang() != null) {
String[] yaoXiang = request.getLiuYaoYaoXiang().split(",");
if (yaoXiang.length >= 6) {
setting.setLiuYao(yaoXiang[0].equals("—") || yaoXiang[0].equals("阳") ? 1 : 0);
setting.setWuYao(yaoXiang[1].equals("—") || yaoXiang[1].equals("阳") ? 1 : 0);
setting.setSiYao(yaoXiang[2].equals("—") || yaoXiang[2].equals("阳") ? 1 : 0);
setting.setSanYao(yaoXiang[3].equals("—") || yaoXiang[3].equals("阳") ? 1 : 0);
setting.setErYao(yaoXiang[4].equals("—") || yaoXiang[4].equals("阳") ? 1 : 0);
setting.setYiYao(yaoXiang[5].equals("—") || yaoXiang[5].equals("阳") ? 1 : 0);
}
@@ -17,6 +17,20 @@ public class RecordController {
@Autowired
private DeductRecordService recordService;
@PostMapping("/save")
public Map<String, Object> saveRecord(@RequestBody DeductRecord record) {
Map<String, Object> result = new HashMap<>();
try {
DeductRecord saved = recordService.saveRecord(record);
result.put("success", true);
result.put("data", saved);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@GetMapping("/list")
public Map<String, Object> getRecords(@RequestParam String userId) {
Map<String, Object> result = new HashMap<>();
@@ -148,3 +148,4 @@ public class TaLuoController {
public String getSpreadType() { return spreadType; }
public void setSpreadType(String spreadType) { this.spreadType = spreadType; }
}
}
@@ -10,39 +10,6 @@ import java.util.*;
@RestController
@RequestMapping("/api/ziwei")
private static final Map<String, String> ZHU_XING_JIE_DU = new HashMap<>();
private static final Map<String, String> GONG_WEI_JIE_DU = new HashMap<>();
static {
ZHU_XING_JIE_DU.put("紫微", "帝王之星,主权威领导,性格稳重有魄力,适合管理岗位,天生具有统御能力");
ZHU_XING_JIE_DU.put("天机", "智慧之星,主聪明机敏,善于策划分析,适合参谋顾问,思维活跃多变");
ZHU_XING_JIE_DU.put("太阳", "光明之星,主外向热情,事业心强,利于公职发展,贵人运旺");
ZHU_XING_JIE_DU.put("武曲", "财星,主刚毅果断,理财能力强,适合金融商业,财运亨通");
ZHU_XING_JIE_DU.put("天同", "福星,主温和仁慈,人缘好福气厚,适合服务行业,生活安逸");
ZHU_XING_JIE_DU.put("廉贞", "桃花星,主才华艺术,感情丰富,适合文艺创作,魅力十足");
ZHU_XING_JIE_DU.put("天府", "财库星,主稳重守成,善于理财积累,适合财务管理,财源稳定");
ZHU_XING_JIE_DU.put("太阴", "阴柔之星,主细腻敏感,直觉力强,适合文艺创作,财运平稳");
ZHU_XING_JIE_DU.put("贪狼", "欲望之星,主多才多艺,交际能力强,适合演艺销售,但需防贪欲");
ZHU_XING_JIE_DU.put("巨门", "口舌之星,主能言善辩,适合律师教师,但易招是非口舌");
ZHU_XING_JIE_DU.put("天相", "印星,主正直公正,适合公务员法律,贵人运佳,事业平稳");
ZHU_XING_JIE_DU.put("天梁", "荫星,主慈悲为怀,适合医疗教育,有长辈贵人,福泽深厚");
ZHU_XING_JIE_DU.put("七杀", "将星,主刚强果断,适合军警创业,有领导才能,但需防冲动");
ZHU_XING_JIE_DU.put("破军", "变动之星,主开创冒险,适合创业改革,变动多端,需稳中求进");
GONG_WEI_JIE_DU.put("命宫", "代表核心性格、人生基调、先天特质");
GONG_WEI_JIE_DU.put("兄弟宫", "代表兄弟姐妹关系、同辈交往、合作能力");
GONG_WEI_JIE_DU.put("夫妻宫", "代表婚姻感情、配偶特质、婚姻质量");
GONG_WEI_JIE_DU.put("子女宫", "代表子女运势、后代情况、桃花缘分");
GONG_WEI_JIE_DU.put("财帛宫", "代表财富来源、理财能力、财运起伏");
GONG_WEI_JIE_DU.put("疾厄宫", "代表健康状况、易患疾病、养生方向");
GONG_WEI_JIE_DU.put("迁移宫", "代表外出运势、人际交往、贵人运");
GONG_WEI_JIE_DU.put("交友宫", "代表朋友关系、下属能力、人际网络");
GONG_WEI_JIE_DU.put("官禄宫", "代表事业发展、职业方向、官运仕途");
GONG_WEI_JIE_DU.put("田宅宫", "代表房产运势、家庭环境、祖业继承");
GONG_WEI_JIE_DU.put("福德宫", "代表精神状态、福报厚薄、晚年运势");
GONG_WEI_JIE_DU.put("父母宫", "代表父母关系、长辈助力、学历背景");
}
public class ZiWeiController {
private final HunYuanAiService aiService = new HunYuanAiService();
@@ -76,125 +43,86 @@ public class ZiWeiController {
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
data.put("occupy", ziWei.getOccupy());
result.put("data", data);
} catch (Exception e) {
data.put("zao", ziWei.getZao());
result.put("success", false);
result.put("error", e.getMessage());
}
data.put("xingQi", ziWei.getXingQi());
data.put("jiJie", ziWei.getJiJie());
return result;
}
data.put("yueXiang", ziWei.getYueXiang());
data.put("yueJiang", ziWei.getYueJiang());
data.put("yueJiangShen", ziWei.getYueJiangShen());
data.put("wuBuYuShi", ziWei.getWuBuYuShi());
data.put("yearGan", ziWei.getYearGan());
data.put("monthGan", ziWei.getMonthGan());
data.put("dayGan", ziWei.getDayGan());
data.put("hourGan", ziWei.getHourGan());
data.put("yearZhi", ziWei.getYearZhi());
data.put("monthZhi", ziWei.getMonthZhi());
data.put("dayZhi", ziWei.getDayZhi());
data.put("hourZhi", ziWei.getHourZhi());
private Map<String, Object> buildZiWeiData(ZiWei ziWei) {
Map<String, Object> data = new HashMap<>();
data.put("name", ziWei.getName());
data.put("sex", ziWei.getSex());
data.put("age", ziWei.getAge());
data.put("yearGanZhiNaYin", ziWei.getYearGanZhiNaYin());
data.put("monthGanZhiNaYin", ziWei.getMonthGanZhiNaYin());
data.put("dayGanZhiNaYin", ziWei.getDayGanZhiNaYin());
data.put("hourGanZhiNaYin", ziWei.getHourGanZhiNaYin());
data.put("nanNvYinYang", ziWei.getNanNvYinYang());
data.put("mingGongGongWei", ziWei.getMingGongGongWei());
data.put("shenGongGongWei", ziWei.getShenGongGongWei());
data.put("solar", ziWei.getSolarStr2());
data.put("wuXingJu", ziWei.getWuXingJu());
data.put("lunar", ziWei.getLunarStr2());
data.put("shengXiao", ziWei.getShengXiao());
data.put("xingZuo", ziWei.getXingZuo());
data.put("wuXingJu", ziWei.getWuXingJu());
data.put("yearGanZhi", ziWei.getYearGanZhi());
data.put("monthGanZhi", ziWei.getMonthGanZhi());
data.put("dayGanZhi", ziWei.getDayGanZhi());
data.put("ziWeiXingGongWei", ziWei.getZiWeiXingGongWei());
data.put("tianFuXingGongWei", ziWei.getTianFuXingGongWei());
data.put("ziWeiXingGongDiZhi", ziWei.getZiWeiXingGongDiZhi());
data.put("tianFuXingGongDiZhi", ziWei.getTianFuXingGongDiZhi());
data.put("ziWeiXingXiZhuXing", ziWei.getZiWeiXingXiZhuXing());
data.put("tianFuXingXiZhuXing", ziWei.getTianFuXingXiZhuXing());
data.put("shiZhiZhuXing", ziWei.getShiZhiZhuXing());
data.put("yueZhiZhuXing", ziWei.getYueZhiZhuXing());
data.put("nianGanZhuXing", ziWei.getNianGanZhuXing());
data.put("nianZhiZhuXing", ziWei.getNianZhiZhuXing());
data.put("dayZhuXing", ziWei.getDayZhuXing());
data.put("shiErZhangSheng", ziWei.getShiErZhangSheng());
data.put("jieLuKongWang", ziWei.getJieLuKongWang());
data.put("xunZhongKongWang", ziWei.getXunZhongKongWang());
data.put("tianShangTianShiXing", ziWei.getTianShangTianShiXing());
data.put("daXian", ziWei.getDaXian());
data.put("xiaoXian", ziWei.getXiaoXian());
data.put("shiErGongBoShi", ziWei.getShiErGongBoShi());
data.put("liuNianSuiQianZhuXing", ziWei.getLiuNianSuiQianZhuXing());
data.put("liuNianJiangQianZhuXing", ziWei.getLiuNianJiangQianZhuXing());
data.put("hourGanZhi", ziWei.getHourGanZhi());
data.put("shiErGongZhuXingGuanXi", ziWei.getShiErGongZhuXingGuanXi());
data.put("yearGanZhiNaYin", ziWei.getYearGanZhiNaYin());
data.put("monthGanZhiNaYin", ziWei.getMonthGanZhiNaYin());
data.put("dayGanZhiNaYin", ziWei.getDayGanZhiNaYin());
data.put("hourGanZhiNaYin", ziWei.getHourGanZhiNaYin());
data.put("huaLuXingGongWei", ziWei.getHuaLuXingGongWei());
data.put("huaQuanXingGongWei", ziWei.getHuaQuanXingGongWei());
data.put("huaKeXingGongWei", ziWei.getHuaKeXingGongWei());
data.put("huaJiXingGongWei", ziWei.getHuaJiXingGongWei());
data.put("mingGongDiZhi", ziWei.getMingGongDiZhi());
data.put("shenGongDiZhi", ziWei.getShenGongDiZhi());
data.put("mingGongGongWei", ziWei.getMingGongGongWei());
data.put("shenGongGongWei", ziWei.getShenGongGongWei());
data.put("mingZhu", ziWei.getMingZhu());
data.put("shenZhu", ziWei.getShenZhu());
data.put("nanNvYinYang", ziWei.getNanNvYinYang());
data.put("shiErGongDiZhi", ziWei.getShiErGongDiZhi());
data.put("shiErGongTianGan", ziWei.getShiErGongTianGan());
data.put("shiErMingGong", ziWei.getShiErMingGong());
data.put("shiErShenGong", ziWei.getShiErShenGong());
data.put("shiErGongZhuXing", ziWei.getShiErGongZhuXing(false));
data.put("shiErGongSiHuaXing", ziWei.getShiErGongSiHuaXing());
data.put("shiErGongSiHuaXingGuanXi", ziWei.getShiErGongSiHuaXingGuanXi());
data.put("shiErZhangSheng", ziWei.getShiErZhangSheng());
data.put("daXian", ziWei.getDaXian());
data.put("mingZhu", ziWei.getMingZhu());
data.put("shenZhu", ziWei.getShenZhu());
data.put("ziDou", ziWei.getZiDou());
data.put("liuDou", ziWei.getLiuDou());
data.put("prevJie", ziWei.getPrevJie());
data.put("nextJie", ziWei.getNextJie());
data.put("chuShengJie", ziWei.getChuShengJie());
data.put("prevQi", ziWei.getPrevQi());
data.put("nextQi", ziWei.getNextQi());
data.put("chuShengQi", ziWei.getChuShengQi());
data.put("huaLuXingGongWeiJieDu", ziWei.getHuaLuXingGongWeiJieDu());
data.put("huaQuanXingGongWeiJieDu", ziWei.getHuaQuanXingGongWeiJieDu());
data.put("huaKeXingGongWeiJieDu", ziWei.getHuaKeXingGongWeiJieDu());
data.put("huaJiXingGongWeiJieDu", ziWei.getHuaJiXingGongWeiJieDu());
data.put("jieDu", buildJieDu(ziWei, shiErMingGong, shiErGongZhuXing));
return data;
}
private Map<String, Object> buildJieDu(ZiWei ziWei, List<String> shiErMingGong, List<List<String>> shiErGongZhuXing) {
Map<String, Object> jieDu = new HashMap<>();
int mingGongIndex = ziWei.getMingGongGongWei() - 1;
List<String> mingGongStars = shiErGongZhuXing.get(mingGongIndex);
public static class ZiWeiRequest {
private String name;
private String occupy;
private Integer sex;
private String date;
private Integer dateType;
private Integer leapMonthType;
private Integer xuShiSuiType;
private Integer jieQiType;
private Integer wuXingJuType;
private Integer yearGanZhiType;
private Integer monthGanZhiType;
private Integer dayGanZhiType;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getOccupy() { return occupy; }
public void setOccupy(String occupy) { this.occupy = occupy; }
public Integer getSex() { return sex; }
public void setSex(Integer sex) { this.sex = sex; }
public String getDate() { return date; }
for (String star : mingGongStars) {
if (ZHU_XING_JIE_DU.containsKey(star)) {
public void setDate(String date) { this.date = date; }
public Integer getDateType() { return dateType; }
public void setDateType(Integer dateType) { this.dateType = dateType; }
public Integer getLeapMonthType() { return leapMonthType; }
public void setLeapMonthType(Integer leapMonthType) { this.leapMonthType = leapMonthType; }
@@ -1,5 +1,6 @@
package xuan.repository;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
@@ -15,6 +16,6 @@ public interface DeductRecordRepository extends JpaRepository<DeductRecord, Long
List<DeductRecord> findByUserIdAndTypeOrderByCreateTimeDesc(String userId, String type);
@Query("SELECT d FROM DeductRecord d WHERE d.userId = :userId ORDER BY d.createTime DESC LIMIT 10")
List<DeductRecord> findTop10ByUserIdOrderByCreateTimeDesc(@Param("userId") String userId);
@Query("SELECT d FROM DeductRecord d WHERE d.userId = :userId ORDER BY d.createTime DESC")
List<DeductRecord> findTop10ByUserIdOrderByCreateTimeDesc(@Param("userId") String userId, Pageable pageable);
}
@@ -1,6 +1,7 @@
package xuan.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import xuan.entity.DeductRecord;
@@ -33,7 +34,7 @@ public class DeductRecordService {
}
public List<DeductRecord> findRecentByUserId(String userId) {
return recordRepository.findTop10ByUserIdOrderByCreateTimeDesc(userId);
return recordRepository.findTop10ByUserIdOrderByCreateTimeDesc(userId, PageRequest.of(0, 10));
}
@Transactional