From c9ca93faa0e2736faaa487c8eef6ab0d1637bd26 Mon Sep 17 00:00:00 2001
From: czj <13261895355@163.com>
Date: Wed, 8 Jul 2026 13:59:26 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A1=88=E4=BE=8B=E5=BA=93?=
=?UTF-8?q?=E5=88=97=E8=A1=A8=E5=92=8C=E8=AF=A6=E6=83=85=E9=A1=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/app/cases/[caseId]/page.tsx | 11 +
src/app/cases/page.tsx | 6 +
src/app/globals.css | 185 +++++++++++++-
src/app/page.tsx | 24 +-
src/components/cases/api-client.ts | 24 ++
src/components/cases/article-case-detail.tsx | 149 ++++++++++++
src/components/cases/case-detail.tsx | 193 +++++++++++++++
src/components/cases/case-format.ts | 18 ++
src/components/cases/case-list.tsx | 176 ++++++++++++++
.../cases/case-publication-panel.tsx | 226 ++++++++++++++++++
.../cases/case-result-version-list.tsx | 44 ++++
.../cases/human-copy-case-detail.tsx | 141 +++++++++++
tests/e2e/cases.spec.ts | 136 +++++++++++
13 files changed, 1323 insertions(+), 10 deletions(-)
create mode 100644 src/app/cases/[caseId]/page.tsx
create mode 100644 src/app/cases/page.tsx
create mode 100644 src/components/cases/api-client.ts
create mode 100644 src/components/cases/article-case-detail.tsx
create mode 100644 src/components/cases/case-detail.tsx
create mode 100644 src/components/cases/case-format.ts
create mode 100644 src/components/cases/case-list.tsx
create mode 100644 src/components/cases/case-publication-panel.tsx
create mode 100644 src/components/cases/case-result-version-list.tsx
create mode 100644 src/components/cases/human-copy-case-detail.tsx
create mode 100644 tests/e2e/cases.spec.ts
diff --git a/src/app/cases/[caseId]/page.tsx b/src/app/cases/[caseId]/page.tsx
new file mode 100644
index 0000000..c84c983
--- /dev/null
+++ b/src/app/cases/[caseId]/page.tsx
@@ -0,0 +1,11 @@
+import { CaseDetail } from "../../../components/cases/case-detail";
+
+export default async function CaseDetailPage({
+ params,
+}: {
+ params: Promise<{ caseId: string }>;
+}) {
+ const { caseId } = await params;
+ return ;
+}
+
diff --git a/src/app/cases/page.tsx b/src/app/cases/page.tsx
new file mode 100644
index 0000000..792e7c0
--- /dev/null
+++ b/src/app/cases/page.tsx
@@ -0,0 +1,6 @@
+import { CaseList } from "../../components/cases/case-list";
+
+export default function CasesPage() {
+ return ;
+}
+
diff --git a/src/app/globals.css b/src/app/globals.css
index d0546d3..1fcd297 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -116,10 +116,28 @@ h3 {
color: #586174;
}
+.topbar-actions {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+ justify-content: flex-end;
+}
+
.api-key-field {
min-width: min(16rem, 100%);
}
+.text-link {
+ color: #2f6fdd;
+ font-weight: 800;
+ text-decoration: none;
+}
+
+.text-link:hover {
+ text-decoration: underline;
+}
+
.app-tabs {
display: flex;
flex-wrap: wrap;
@@ -574,15 +592,180 @@ h3 {
white-space: pre-wrap;
}
+.case-toolbar {
+ align-items: end;
+ display: grid;
+ gap: 0.75rem;
+ grid-template-columns: minmax(16rem, 1fr) 12rem 12rem;
+}
+
+.case-table {
+ border: 1px solid #dce2eb;
+ border-radius: 8px;
+ background: #ffffff;
+ overflow: hidden;
+}
+
+.case-row {
+ align-items: center;
+ color: #172033;
+ display: grid;
+ gap: 0.75rem;
+ grid-template-columns: minmax(16rem, 1.45fr) 7rem minmax(8rem, 0.9fr) minmax(7rem, 0.75fr) minmax(7rem, 0.8fr) 6rem 7rem;
+ min-height: 4.25rem;
+ padding: 0.75rem 0.9rem;
+ text-decoration: none;
+}
+
+.case-row + .case-row {
+ border-top: 1px solid #e5e9f0;
+}
+
+.case-row:hover {
+ background: #f8fafc;
+}
+
+.case-row-heading {
+ background: #f6f7f9;
+ color: #586174;
+ font-size: 0.76rem;
+ font-weight: 800;
+ min-height: auto;
+ text-transform: uppercase;
+}
+
+.case-row span,
+.case-row strong,
+.case-row small {
+ min-width: 0;
+ overflow-wrap: anywhere;
+}
+
+.case-row strong {
+ display: block;
+}
+
+.case-row small {
+ color: #586174;
+ display: block;
+ font-size: 0.78rem;
+ margin-top: 0.2rem;
+}
+
+.case-detail-grid {
+ align-items: start;
+ display: grid;
+ gap: 1rem;
+ grid-template-columns: minmax(17rem, 0.35fr) minmax(0, 1fr);
+}
+
+.case-meta-grid {
+ display: grid;
+ gap: 0.55rem;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+}
+
+.case-meta-grid div {
+ background: #f6f7f9;
+ border: 1px solid #e5e9f0;
+ border-radius: 6px;
+ display: grid;
+ gap: 0.22rem;
+ min-width: 0;
+ padding: 0.55rem;
+}
+
+.case-meta-grid span {
+ color: #667085;
+ font-size: 0.72rem;
+ font-weight: 800;
+ text-transform: uppercase;
+}
+
+.case-meta-grid strong {
+ color: #172033;
+ font-size: 0.9rem;
+ overflow-wrap: anywhere;
+}
+
+.case-version-list,
+.case-publication-list,
+.case-publication-form {
+ display: grid;
+ gap: 0.6rem;
+}
+
+.case-version-item {
+ background: #ffffff;
+ border-color: #dce2eb;
+ color: #172033;
+ display: grid;
+ gap: 0.25rem;
+ min-height: 4rem;
+ padding: 0.65rem;
+ text-align: left;
+ white-space: normal;
+}
+
+.case-version-item.selected {
+ border-color: #172033;
+ box-shadow: 0 0 0 2px rgba(23, 32, 51, 0.08);
+}
+
+.case-version-item small {
+ color: #586174;
+}
+
+.case-json-preview,
+.case-markdown-preview {
+ background: #f6f7f9;
+ border: 1px solid #e5e9f0;
+ border-radius: 6px;
+ margin: 0;
+ overflow: auto;
+ padding: 0.8rem;
+ white-space: pre-wrap;
+}
+
+.case-publication-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.case-publication-list li {
+ border: 1px solid #e5e9f0;
+ border-radius: 6px;
+ display: grid;
+ gap: 0.25rem;
+ padding: 0.65rem;
+}
+
+.case-publication-list small {
+ color: #586174;
+}
+
@media (max-width: 900px) {
.workflow-grid,
.copy-optimizer-grid,
.two-col,
.fact-summary-grid,
- .calibration-metrics {
+ .calibration-metrics,
+ .case-toolbar,
+ .case-detail-grid,
+ .case-meta-grid {
grid-template-columns: 1fr;
}
+ .case-row,
+ .case-row-heading {
+ grid-template-columns: 1fr;
+ }
+
+ .case-row-heading {
+ display: none;
+ }
+
.input-panel {
grid-row: auto;
}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 52079e5..5c48e55 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,5 +1,6 @@
"use client";
+import Link from "next/link";
import { useEffect, useState } from "react";
import {
@@ -169,15 +170,20 @@ export default function Home() {
GEO 智能文章优化器
{message && {message}
}
-
+
+
+ 案例库
+
+
+