From 00633a55105c96ddbe2477348f885bbd8e8e0c50 Mon Sep 17 00:00:00 2001 From: meijiali <你的邮箱@xxx.com> Date: Tue, 7 Jul 2026 18:43:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8C=89=20Pencil=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=87=8D=E5=81=9A=E9=A1=B5=E9=9D=A2=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/static/app.css | 663 ++++++++++++++++++++++- app/templates/hotspots/report.html | 22 +- app/templates/index.html | 159 +++--- app/templates/partials/report_panel.html | 170 +++--- app/templates/partials/task_cards.html | 44 ++ app/templates/tasks/detail.html | 194 ++++--- tests/integration/test_routes.py | 60 +- 7 files changed, 1051 insertions(+), 261 deletions(-) create mode 100644 app/templates/partials/task_cards.html diff --git a/app/static/app.css b/app/static/app.css index b9ecc85..8d71e0a 100644 --- a/app/static/app.css +++ b/app/static/app.css @@ -587,7 +587,633 @@ a { border-color: #fecaca; } +.control-hero, +.task-detail-hero, +.report-reading-hero { + align-items: stretch; + background: var(--card); + border: 1px solid var(--border); + border-radius: 12px; + display: grid; + gap: 28px; + grid-template-columns: minmax(0, 0.92fr) minmax(360px, 1.08fr); + margin-bottom: 22px; + padding: 28px; +} + +.task-detail-hero, +.report-reading-hero { + grid-template-columns: minmax(0, 1fr) 360px; +} + +.control-hero-copy, +.task-detail-copy, +.report-title-block { + display: flex; + flex-direction: column; + justify-content: center; + min-width: 0; +} + +.control-hero h1, +.task-detail-hero h1, +.report-reading-hero h1 { + color: var(--foreground); + font-size: 34px; + font-weight: 800; + letter-spacing: 0; + line-height: 1.15; + margin: 0 0 12px; +} + +.control-hero p:not(.section-kicker), +.task-detail-hero p:not(.section-kicker), +.report-reading-hero p:not(.section-kicker) { + color: #475569; + font-size: 15px; + line-height: 1.55; + margin: 0; +} + +.control-subtitle { + color: var(--muted-foreground); + font-size: 13px; + font-weight: 700; + margin: -4px 0 10px; +} + +.quick-launch-panel, +.task-history-panel, +.sidepanel-card, +.task-state-card, +.sentiment-summary-card, +.insight-card, +.content-performance-card, +.sentiment-sidepanel, +.keyword-sidepanel, +.report-data-note { + background: var(--card); + border: 1px solid var(--border); + border-radius: 10px; + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04); +} + +.quick-launch-panel { + background: var(--background); + padding: 22px; +} + +.panel-title-row { + align-items: center; + display: flex; + gap: 16px; + justify-content: space-between; + margin-bottom: 16px; +} + +.panel-title-row h2, +.sidepanel-card h2, +.task-state-card strong, +.sentiment-summary-card strong, +.insight-card h2, +.representative-comments h2, +.content-performance-card h2, +.sentiment-sidepanel h2, +.keyword-sidepanel h2, +.report-data-note h2 { + color: var(--foreground); + font-size: 19px; + font-weight: 800; + letter-spacing: 0; + line-height: 1.25; + margin: 0; +} + +.soft-badge { + background: var(--secondary); + border: 1px solid var(--border); + border-radius: 999px; + color: var(--foreground); + display: inline-flex; + font-size: 12px; + font-weight: 700; + line-height: 1; + padding: 7px 10px; + white-space: nowrap; +} + +.soft-badge-success { + background: #f0fdfa; + border-color: #ccfbf1; + color: #0f766e; +} + +.default-scale-grid, +.overview-grid { + display: grid; + gap: 12px; +} + +.default-scale-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin-bottom: 16px; +} + +.scale-tile, +.overview-card { + background: var(--card); + border: 1px solid var(--border); + border-radius: 9px; + padding: 14px; +} + +.scale-tile strong, +.overview-card strong { + color: var(--foreground); + display: block; + font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 24px; + font-weight: 700; + line-height: 1.2; +} + +.scale-tile span, +.overview-card span, +.overview-card small { + color: var(--muted-foreground); + display: block; + font-size: 12px; + margin-top: 4px; +} + +.quick-form-grid { + align-items: end; + display: grid; + gap: 12px; + grid-template-columns: minmax(150px, 1.2fr) repeat(3, minmax(100px, 0.8fr)) minmax(150px, 0.9fr); +} + +.quick-start-btn { + min-height: 50px; +} + +.scale-hint { + color: var(--muted-foreground); + font-size: 13px; + line-height: 1.45; + margin: 12px 0 0; +} + +.overview-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin-bottom: 22px; +} + +.dashboard-workspace, +.detail-workspace, +.report-reading-layout { + display: grid; + gap: 20px; + grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr); +} + +.task-history-panel { + padding: 20px; +} + +.task-card-list, +.hotspot-card-list, +.report-main-column, +.report-side-column { + display: flex; + flex-direction: column; + gap: 14px; +} + +.task-card, +.hotspot-result-card, +.quote-card { + align-items: center; + background: var(--card); + border: 1px solid var(--border); + border-radius: 10px; + display: flex; + gap: 18px; + padding: 18px; +} + +.task-card-number { + display: flex; + flex: 0 0 90px; + flex-direction: column; + gap: 4px; +} + +.task-card-number strong, +.hotspot-rank { + color: var(--foreground); + font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 24px; + font-weight: 700; +} + +.task-card-number span, +.task-card-title-row p, +.task-card-meta, +.task-card-progress, +.hotspot-chip-row, +.stat-line span, +.sidepanel-card p, +.report-data-note p { + color: var(--muted-foreground); + font-size: 13px; +} + +.task-card-body { + flex: 1 1 auto; + min-width: 0; +} + +.task-card-title-row, +.progress-label-row, +.stat-line { + align-items: center; + display: flex; + gap: 12px; + justify-content: space-between; +} + +.task-card-title-row h3 { + color: var(--foreground); + font-size: 16px; + font-weight: 800; + margin: 0 0 3px; +} + +.task-card-meta { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 10px; +} + +.task-card-error { + color: #991b1b; + font-size: 13px; + margin: 10px 0 0; +} + +.task-card-action { + flex: 0 0 auto; +} + +.task-status-sidepanel, +.detail-sidepanel { + display: flex; + flex-direction: column; + gap: 16px; +} + +.sidepanel-card, +.task-state-card, +.sentiment-summary-card, +.insight-card, +.content-performance-card, +.sentiment-sidepanel, +.keyword-sidepanel, +.report-data-note { + padding: 20px; +} + +.sidepanel-card-blue, +.report-data-note { + background: #eff6ff; + border-color: #dbeafe; +} + +.sidepanel-card-danger { + background: #fff1f2; + border-color: #ffe4e6; +} + +.sidepanel-icon { + align-items: center; + background: #eff6ff; + border-radius: 8px; + color: #2563eb; + display: inline-flex; + font-size: 18px; + font-weight: 800; + height: 34px; + justify-content: center; + margin-bottom: 12px; + width: 34px; +} + +.stage-list { + display: grid; + gap: 10px; + margin-top: 14px; +} + +.stage-list span { + align-items: center; + color: #475569; + display: flex; + font-size: 13px; + gap: 10px; +} + +.stage-dot { + background: var(--border); + border-radius: 999px; + display: inline-block; + height: 10px; + width: 10px; +} + +.stage-dot-success { + background: #0f766e; +} + +.stage-dot-active { + background: #2563eb; +} + +.task-state-card, +.sentiment-summary-card { + background: #f0fdfa; + border-color: #ccfbf1; +} + +.task-state-card span, +.sentiment-summary-card span { + color: #0f766e; + display: block; + font-size: 13px; + font-weight: 700; + margin-bottom: 8px; +} + +.task-state-card strong, +.sentiment-summary-card strong { + display: block; + font-size: 34px; + margin-bottom: 10px; +} + +.execution-timeline { + display: grid; + gap: 12px; + grid-template-columns: repeat(6, minmax(0, 1fr)); + margin-bottom: 22px; +} + +.execution-step { + background: var(--card); + border: 1px solid var(--border); + border-radius: 10px; + min-width: 0; + padding: 16px; +} + +.execution-step-icon { + align-items: center; + background: var(--secondary); + border-radius: 999px; + color: var(--muted-foreground); + display: inline-flex; + font-weight: 800; + height: 28px; + justify-content: center; + margin-bottom: 10px; + width: 28px; +} + +.execution-step-done .execution-step-icon { + background: #0f766e; + color: #ffffff; +} + +.execution-step-active .execution-step-icon { + background: #2563eb; + color: #ffffff; +} + +.execution-step strong, +.execution-step small { + display: block; +} + +.execution-step strong { + color: var(--foreground); + font-size: 15px; + font-weight: 800; + margin-bottom: 6px; +} + +.execution-step small { + color: var(--muted-foreground); + line-height: 1.35; +} + +.hotspot-result-card { + min-height: 116px; +} + +.hotspot-rank { + align-items: center; + background: #eff6ff; + border-radius: 10px; + color: #2563eb; + display: flex; + flex: 0 0 56px; + height: 56px; + justify-content: center; +} + +.hotspot-result-body { + flex: 1 1 auto; + min-width: 0; +} + +.hotspot-result-body h3 { + color: var(--foreground); + font-size: 17px; + font-weight: 800; + line-height: 1.35; + margin: 0 0 10px; +} + +.hotspot-chip-row { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.hotspot-chip-row span, +.keyword-cloud span, +.ghost-actions span { + background: var(--secondary); + border: 1px solid var(--border); + border-radius: 8px; + color: #475569; + display: inline-flex; + font-size: 12px; + padding: 6px 10px; +} + +.report-reading-layout { + align-items: start; +} + +.insight-list { + display: grid; + gap: 12px; + margin-top: 16px; +} + +.insight-list p { + color: #475569; + display: flex; + font-size: 14px; + gap: 10px; + line-height: 1.55; + margin: 0; +} + +.insight-list p span { + background: #2563eb; + border-radius: 999px; + flex: 0 0 8px; + height: 8px; + margin-top: 7px; +} + +.representative-comments { + display: grid; + gap: 12px; +} + +.representative-comments .panel-title-row { + margin-bottom: 0; +} + +.quote-card { + align-items: flex-start; +} + +.quote-card p { + color: var(--foreground); + flex: 1 1 auto; + font-size: 14px; + line-height: 1.45; + margin: 0; +} + +.quote-card small { + color: var(--muted-foreground); + white-space: nowrap; +} + +.content-performance-card { + display: grid; + gap: 14px; +} + +.performance-row { + align-items: center; + display: flex; + gap: 12px; + justify-content: space-between; +} + +.performance-row strong, +.performance-row span { + display: block; +} + +.performance-row strong { + color: var(--foreground); + font-size: 15px; +} + +.performance-row span { + color: var(--muted-foreground); + font-size: 12px; + margin-top: 4px; +} + +.performance-row em { + color: #2563eb; + font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace; + font-style: normal; + font-weight: 700; + white-space: nowrap; +} + +.sentiment-sidepanel, +.keyword-sidepanel, +.report-data-note { + display: grid; + gap: 14px; +} + +.sentiment-row { + display: grid; + gap: 6px; +} + +.sentiment-positive { + background-color: #0f766e !important; +} + +.sentiment-neutral { + background-color: #2563eb !important; +} + +.sentiment-negative { + background-color: #e11d48 !important; +} + +.keyword-cloud, +.ghost-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.keyword-cloud span, +.ghost-actions span { + background: #eff6ff; + border-color: #dbeafe; + color: #2563eb; + font-weight: 700; +} + @media (max-width: 992px) { + .control-hero, + .task-detail-hero, + .report-reading-hero, + .dashboard-workspace, + .detail-workspace, + .report-reading-layout { + grid-template-columns: 1fr; + } + + .quick-form-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .quick-start-btn { + grid-column: 1 / -1; + } + + .overview-grid, + .execution-timeline { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .hero-shell { align-items: flex-start; flex-direction: column; @@ -642,11 +1268,46 @@ a { .section-heading, .page-heading, - .content-item-row { + .content-item-row, + .panel-title-row, + .task-card, + .hotspot-result-card, + .quote-card, + .performance-row { align-items: flex-start; flex-direction: column; } + .control-hero, + .task-detail-hero, + .report-reading-hero { + padding: 22px; + } + + .control-hero h1, + .task-detail-hero h1, + .report-reading-hero h1 { + font-size: 28px; + } + + .default-scale-grid, + .overview-grid, + .execution-timeline, + .quick-form-grid { + grid-template-columns: 1fr; + } + + .task-card-number, + .task-card-action, + .hotspot-rank { + flex: 0 0 auto; + } + + .task-card-action, + .hotspot-result-card .btn { + width: 100%; + } + .card-body { padding: 16px; } diff --git a/app/templates/hotspots/report.html b/app/templates/hotspots/report.html index b216ee4..73735db 100644 --- a/app/templates/hotspots/report.html +++ b/app/templates/hotspots/report.html @@ -8,14 +8,22 @@ {% endblock %} {% block content %} -
热点报告
-HOTSPOT REPORT
+{{ report.summary or "报告总结生成失败,请查看下方结构化统计。" }}
+Hot Comment Radar
-面向内部演示和联调的轻量工具:选择平台、控制抓取规模、查看任务状态,并进入报告和评论明细。
-COMMENT INTELLIGENCE
+内容平台评论分析控制台
+选择平台后直接开始抓取,系统会按 5 个热点、25 条内容、最多 1,250 条评论完成采集、AI 分析和报告生成。
采集配置
-采集配置
+