From 4fc98f4e92db8969a2f5575e89c8d6c7e4a64292 Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Fri, 17 Jul 2026 18:07:11 +0800 Subject: [PATCH] Show synastry evidence report card --- frontend/src/app/globals.css | 5 +++ frontend/src/app/page.tsx | 43 ++++++++++++++++++++++- tests/test_supabase_user_data_contract.py | 2 ++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index d3d1bcf5..779e7f45 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -392,6 +392,11 @@ button:disabled { cursor: default; opacity: .45; } .chart-library-item small, .chart-library-item > span, .empty-library-copy { color: var(--color-ink-secondary); font-size: var(--type-caption); } .chart-library-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--space-2); } .chart-library-form { padding-top: var(--space-4); border-top: 1px solid var(--color-border); } +.synastry-report-card { display: grid; gap: var(--space-3); padding: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-surface-subtle); } +.synastry-report-card span, .synastry-report-card small, .synastry-report-card li { color: var(--color-ink-secondary); font-size: var(--type-caption); } +.synastry-report-card strong, .synastry-report-card p { color: var(--color-ink); } +.synastry-report-card strong { display: block; margin-top: 4px; font-size: var(--type-body); font-weight: 500; } +.synastry-report-card p, .synastry-report-card ul { margin: 0; } input, select { width: 100%; min-height: 44px; padding: 0 12px; border: 1px solid var(--color-border-strong); color: var(--color-ink); border-color: var(--color-border-strong); border-radius: var(--radius-md); background: var(--color-canvas); font-size: 14px; } input:disabled, select:disabled { color: var(--color-ink-tertiary); background: var(--color-canvas-muted); } diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 45d12f06..8b015c25 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -45,6 +45,17 @@ type ChartLibraryApiRecord = { profile: Profile; updated_at?: string; }; +type SynastryReportCard = { + partnerName: string; + score?: number; + maxScore?: number; + assessment?: string; + headline?: string; + scoreBand?: string; + strengths?: string[]; + risks?: string[]; + nextEvidence?: string[]; +}; type ChatSession = { id: string; title: string; theme: Theme; modelId: string; messages: Message[]; updatedAt: number }; type RequestError = { sessionId: string; message: string }; type StreamingReply = { sessionId: string; text: string }; @@ -519,6 +530,7 @@ export default function Home() { const [chartLibrary, setChartLibrary] = useState([]); const [chartLibraryOpen, setChartLibraryOpen] = useState(false); const [otherProfileDraft, setOtherProfileDraft] = useState(emptyProfile); + const [synastryReportCard, setSynastryReportCard] = useState(null); const [profileOpen, setProfileOpen] = useState(false); const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false); const [profileNotice, setProfileNotice] = useState(""); @@ -1256,12 +1268,23 @@ export default function Home() { headers: { "Content-Type": "application/json" }, body: JSON.stringify({ selfProfile: profile, partnerProfile: record.profile }), }); - const payload = await response.json().catch(() => null) as { status?: string; evidenceLayers?: string[]; synastry?: { total_score?: number; max_score?: number; assessment?: string }; relationshipReport?: { headline?: string } } | null; + const payload = await response.json().catch(() => null) as { status?: string; evidenceLayers?: string[]; synastry?: { total_score?: number; max_score?: number; assessment?: string }; relationshipReport?: { headline?: string; scoreBand?: string; strengths?: string[]; risks?: string[]; nextEvidence?: string[] } } | null; if (response.ok && payload?.status === "ok") { const score = payload.synastry?.total_score; const max = payload.synastry?.max_score; const assessment = payload.synastry?.assessment; const layers = (payload.evidenceLayers || []).join(" / ") || "Ashtakoot / Moon / D9"; + setSynastryReportCard({ + partnerName: record.profile.name || "对方", + score, + maxScore: max, + assessment, + headline: payload.relationshipReport?.headline, + scoreBand: payload.relationshipReport?.scoreBand, + strengths: payload.relationshipReport?.strengths, + risks: payload.relationshipReport?.risks, + nextEvidence: payload.relationshipReport?.nextEvidence, + }); chooseSuggestedQuestion([ baseQuestion, "", @@ -1983,6 +2006,24 @@ export default function Home() { ))} + {synastryReportCard && ( +
+
+ 合盘结果摘要 + {synastryReportCard.partnerName} + Ashtakoot {synastryReportCard.score ?? "?"}/{synastryReportCard.maxScore ?? "?"} · {synastryReportCard.assessment || synastryReportCard.scoreBand || "待解释"} +
+ {synastryReportCard.headline &&

{synastryReportCard.headline}

} +
+ 查看证据 +
    + {(synastryReportCard.strengths || []).map((item) =>
  • {item}
  • )} + {(synastryReportCard.risks || []).map((item) =>
  • {item}
  • )} +
+ 下一步证据:{(synastryReportCard.nextEvidence || []).join(" / ") || "双方 Dasha / UL-DK / D9 7宫"} +
+
+ )}
添加其他星盘用于合盘、亲友盘或客户盘。
diff --git a/tests/test_supabase_user_data_contract.py b/tests/test_supabase_user_data_contract.py index 59a38232..87083c01 100644 --- a/tests/test_supabase_user_data_contract.py +++ b/tests/test_supabase_user_data_contract.py @@ -143,6 +143,8 @@ def test_chart_profile_library_has_cloud_table_api_and_local_fallback() -> None: "deleteCloudChartProfile", "buildSynastryQuestion", "draftSynastryQuestionFromChart", + "synastryReportCard", + "synastry-report-card", 'fetch("/api/synastry"', "Ashtakoot", "chartLibraryStorageKey",