实现所有模块分享功能的前后端API联调

后端实现:
- 新增ShareController控制器
- 提供8个模块的分享API接口(八字、紫微、占星、塔罗、梅花、六爻、奇门、大六壬)
- 每个接口生成格式化的分享文本内容

前端实现:
- 更新api.js,新增各模块分享API调用方法
- 占星术结果页改为调用后端API
- 添加loading提示和错误处理
- 分享内容通过后端生成,确保格式统一

API接口:
- POST /api/share/bazi - 八字分享
- POST /api/share/ziwei - 紫微斗数分享
- POST /api/share/zhanxing - 占星术分享
- POST /api/share/taluo - 塔罗牌分享
- POST /api/share/meihua - 梅花易数分享
- POST /api/share/liuyao - 六爻分享
- POST /api/share/qimen - 奇门遁甲分享
- POST /api/share/daliuren - 大六壬分享
This commit is contained in:
H1d3rOne committed 2026-03-08 20:06:50 +08:00
1 parent 5dd2c1ac90
commit 03535c831f
3 files changed
+468 -77

No files matched your search

@@ -1,76 +1,402 @@
package xuan.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import xuan.entity.ShareRecord;
import xuan.repository.ShareRecordRepository;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.*;
@RestController
@RequestMapping("/api/share")
public class ShareController {
@Autowired
private ShareRecordRepository shareRecordRepository;
@PostMapping("/create")
public Map<String, Object> createShare(@RequestBody Map<String, Object> params) {
@PostMapping("/bazi")
public Map<String, Object> shareBazi(@RequestBody ShareRequest request) {
Map<String, Object> result = new HashMap<>();
try {
String type = (String) params.get("type");
String resultData = (String) params.get("resultData");
String name = (String) params.get("name");
Map<String, Object> data = request.getData();
ShareRecord shareRecord = new ShareRecord();
shareRecord.setShareId(UUID.randomUUID().toString().replace("-", "").substring(0, 16));
shareRecord.setType(type);
shareRecord.setResultData(resultData);
shareRecord.setName(name);
StringBuilder shareText = new StringBuilder();
shareText.append("【八字命理分析】\n\n");
shareRecordRepository.save(shareRecord);
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");
result.put("success", true);
result.put("shareId", shareRecord.getShareId());
result.put("message", "分享链接创建成功");
result.put("data", shareText.toString());
} catch (Exception e) {
result.put("success", false);
result.put("error", "创建分享链接失败:" + e.getMessage());
result.put("error", e.getMessage());
}
return result;
}
@GetMapping("/view/{shareId}")
public Map<String, Object> viewShare(@PathVariable String shareId) {
@PostMapping("/ziwei")
public Map<String, Object> shareZiwei(@RequestBody ShareRequest request) {
Map<String, Object> result = new HashMap<>();
try {
ShareRecord shareRecord = shareRecordRepository.findByShareId(shareId)
.orElse(null);
Map<String, Object> data = request.getData();
if (shareRecord == null) {
result.put("success", false);
result.put("error", "分享链接不存在或已过期");
return result;
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.getExpireTime() != null && shareRecord.getExpireTime().before(new java.util.Date())) {
result.put("success", false);
result.put("error", "分享链接已过期");
return result;
if (data.containsKey("mingGong")) {
shareText.append("\n【命宫主星】\n").append(data.get("mingGong")).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("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", shareRecord);
result.put("data", shareText.toString());
} 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; }
}
}