diff --git a/frontend/src/assets/styles/globals.css b/frontend/src/assets/styles/globals.css index 66e3256..a0e9d51 100644 --- a/frontend/src/assets/styles/globals.css +++ b/frontend/src/assets/styles/globals.css @@ -453,6 +453,12 @@ /* ============ Severity Badges ============ */ .severity-critical { + background: rgba(220, 38, 38, 0.15); + color: #b91c1c; + border: 1px solid rgba(220, 38, 38, 0.4); + } + + .dark .severity-critical { background: rgba(220, 38, 38, 0.2); color: #fca5a5; border: 1px solid rgba(220, 38, 38, 0.5); @@ -460,6 +466,12 @@ } .severity-high { + background: rgba(234, 88, 12, 0.15); + color: #c2410c; + border: 1px solid rgba(234, 88, 12, 0.4); + } + + .dark .severity-high { background: rgba(234, 88, 12, 0.2); color: #fdba74; border: 1px solid rgba(234, 88, 12, 0.5); @@ -467,6 +479,12 @@ } .severity-medium { + background: rgba(245, 158, 11, 0.15); + color: #b45309; + border: 1px solid rgba(245, 158, 11, 0.4); + } + + .dark .severity-medium { background: rgba(245, 158, 11, 0.2); color: #fcd34d; border: 1px solid rgba(245, 158, 11, 0.5); @@ -474,6 +492,12 @@ } .severity-low { + background: rgba(14, 181, 196, 0.15); + color: #0e7490; + border: 1px solid rgba(14, 181, 196, 0.4); + } + + .dark .severity-low { background: rgba(14, 181, 196, 0.2); color: #67e8f9; border: 1px solid rgba(14, 181, 196, 0.5); @@ -481,6 +505,12 @@ } .severity-info { + background: rgba(100, 116, 139, 0.15); + color: #475569; + border: 1px solid rgba(100, 116, 139, 0.4); + } + + .dark .severity-info { background: rgba(100, 116, 139, 0.2); color: #cbd5e1; border: 1px solid rgba(100, 116, 139, 0.5); diff --git a/frontend/src/components/audit/TerminalProgressDialog.tsx b/frontend/src/components/audit/TerminalProgressDialog.tsx index e94dddd..76c057f 100644 --- a/frontend/src/components/audit/TerminalProgressDialog.tsx +++ b/frontend/src/components/audit/TerminalProgressDialog.tsx @@ -419,11 +419,11 @@ export default function TerminalProgressDialog({ const getLogColor = (type: LogEntry["type"]) => { switch (type) { case "success": - return "text-emerald-400"; + return "text-emerald-600 dark:text-emerald-400"; case "error": - return "text-rose-400"; + return "text-rose-600 dark:text-rose-400"; case "warning": - return "text-amber-400"; + return "text-amber-600 dark:text-amber-400"; default: return "text-muted-foreground"; } @@ -432,13 +432,13 @@ export default function TerminalProgressDialog({ return ( - + - {/* Scanline overlay */} -
{/* Header */} -
+
- +
- AUDIT_TERMINAL - v3.0 + AUDIT_TERMINAL + v3.0
{/* 状态指示灯 */} -
+
+ ? 'bg-emerald-500 dark:bg-[#3dd68c] shadow-[0_0_10px_rgba(61,214,140,0.7)] animate-pulse' + : 'bg-slate-300 dark:bg-[#3a4555]'}`} />
+ ? 'bg-rose-500 dark:bg-[#f87171] shadow-[0_0_10px_rgba(248,113,113,0.7)]' + : 'bg-slate-300 dark:bg-[#3a4555]'}`} />
+ ? 'bg-cyan-500 dark:bg-[#22d3ee] shadow-[0_0_10px_rgba(34,211,238,0.7)]' + : 'bg-slate-300 dark:bg-[#3a4555]'}`} />
@@ -499,22 +498,21 @@ export default function TerminalProgressDialog({ {/* Main Content */}
{/* Left Sidebar - Task Info */} -
+
-
Task ID
-
+
Task ID
+
{taskId?.slice(0, 8)}...
-
Type
-
+
Type
+
{taskType === 'repository' - ? - : } - {taskType} + ? + : } + {taskType}
@@ -522,7 +520,7 @@ export default function TerminalProgressDialog({ {/* Status Badge */}
-
Status
+
Status
{isCancelled ? ( CANCELLED ) : isCompleted ? ( @@ -538,18 +536,17 @@ export default function TerminalProgressDialog({ {/* Terminal Screen */}
{/* Terminal Output */} -
- {/* Grid background */} -
+
+ {/* Grid background - only in dark mode */} +
{logs.map((log) => ( -
- +
+ {log.timestamp} - + {log.message}
@@ -557,8 +554,8 @@ export default function TerminalProgressDialog({ {!isCompleted && !isFailed && !isCancelled && (
- {currentTime} - _ + {currentTime} + _
)}
@@ -566,8 +563,8 @@ export default function TerminalProgressDialog({
{/* Bottom Controls */} -
-
+
+
{isCompleted ? "TASK COMPLETED" : isFailed ? "TASK FAILED" : isCancelled ? "TASK CANCELLED" : "EXECUTING..."} @@ -580,7 +577,7 @@ export default function TerminalProgressDialog({ size="sm" variant="outline" onClick={handleCancel} - className="h-8 bg-transparent border-[#fbbf24]/40 text-[#fbbf24] hover:bg-[#fbbf24]/10 hover:border-[#fbbf24]/60 font-mono uppercase tracking-wider text-xs" + className="h-8 bg-transparent border-amber-500/40 text-amber-600 dark:text-[#fbbf24] hover:bg-amber-50 dark:hover:bg-[#fbbf24]/10 hover:border-amber-500/60 font-mono uppercase tracking-wider text-xs" > 取消任务 @@ -592,7 +589,7 @@ export default function TerminalProgressDialog({ size="sm" variant="outline" onClick={() => window.open('/logs', '_blank')} - className="h-8 bg-transparent border-[#6a7587]/40 text-[#a8b0c0] hover:bg-[#1a2030]/50 hover:border-[#6a7587]/60 font-mono uppercase tracking-wider text-xs" + className="h-8 bg-transparent border-slate-300 dark:border-[#6a7587]/40 text-slate-600 dark:text-[#a8b0c0] hover:bg-slate-100 dark:hover:bg-[#1a2030]/50 hover:border-slate-400 dark:hover:border-[#6a7587]/60 font-mono uppercase tracking-wider text-xs" > 查看日志 diff --git a/frontend/src/pages/InstantAnalysis.tsx b/frontend/src/pages/InstantAnalysis.tsx index f065045..15bfc1c 100644 --- a/frontend/src/pages/InstantAnalysis.tsx +++ b/frontend/src/pages/InstantAnalysis.tsx @@ -390,12 +390,12 @@ public class Example {
- CODE_SNIPPET + CODE_SNIPPET
LINE: {issue.line}
-
-
+          
+
               {issue.code_snippet}
             
@@ -407,11 +407,11 @@ public class Example {
- +
- 修复建议 + 修复建议
-

{issue.suggestion}

+

{issue.suggestion}

)} @@ -423,37 +423,37 @@ public class Example {
- +
- AI 解释 + AI 解释
{parsedExplanation.what && (
- 问题: + 问题: {parsedExplanation.what}
)} {parsedExplanation.why && (
- 原因: + 原因: {parsedExplanation.why}
)} {parsedExplanation.how && (
- 方案: + 方案: {parsedExplanation.how}
)} {parsedExplanation.learn_more && (
- 链接: + 链接: {parsedExplanation.learn_more} @@ -466,8 +466,8 @@ public class Example { return (
- - AI 解释 + + AI 解释

{issue.ai_explanation}

@@ -855,11 +855,11 @@ public class Example { ) : (
- -

代码质量优秀!

-

恭喜!没有发现任何问题

+ +

代码质量优秀!

+

恭喜!没有发现任何问题

-

+

您的代码通过了所有质量检查,包括安全性、性能、可维护性等各个方面的评估。

diff --git a/frontend/src/pages/ProjectDetail.tsx b/frontend/src/pages/ProjectDetail.tsx index 1c111d1..9d282c2 100644 --- a/frontend/src/pages/ProjectDetail.tsx +++ b/frontend/src/pages/ProjectDetail.tsx @@ -677,10 +677,10 @@ export default function ProjectDetail() {
@@ -712,7 +712,7 @@ export default function ProjectDetail() {
) : (
- +

未发现问题

最近一次审计未发现明显问题,或尚未进行审计。

diff --git a/frontend/src/pages/TaskDetail.tsx b/frontend/src/pages/TaskDetail.tsx index f02708c..0d05359 100644 --- a/frontend/src/pages/TaskDetail.tsx +++ b/frontend/src/pages/TaskDetail.tsx @@ -27,7 +27,9 @@ import { Info, Zap, XCircle, - Terminal + Terminal, + ChevronDown, + ChevronRight } from "lucide-react"; import { api } from "@/shared/config/database"; import type { AuditTask, AuditIssue } from "@/shared/types"; @@ -133,14 +135,14 @@ function IssuesList({ issues }: { issues: AuditIssue[] }) {
- CODE_SNIPPET + CODE_SNIPPET
{issue.line_number && ( LINE: {issue.line_number} )}
-
-
+          
+
               {issue.code_snippet}
             
@@ -152,11 +154,11 @@ function IssuesList({ issues }: { issues: AuditIssue[] }) {
- +
- 修复建议 + 修复建议
-

{issue.suggestion}

+

{issue.suggestion}

)} @@ -168,41 +170,41 @@ function IssuesList({ issues }: { issues: AuditIssue[] }) {
- +
- AI 解释 + AI 解释
{parsedExplanation.what && (
- 问题: + 问题: {parsedExplanation.what}
)} {parsedExplanation.why && (
- 原因: + 原因: {parsedExplanation.why}
)} {parsedExplanation.how && (
- 方案: + 方案: {parsedExplanation.how}
)} {parsedExplanation.learn_more && (
- 链接: + 链接: {parsedExplanation.learn_more} @@ -215,8 +217,8 @@ function IssuesList({ issues }: { issues: AuditIssue[] }) { return (
- - AI 解释 + + AI 解释

{issue.ai_explanation}

@@ -230,11 +232,11 @@ function IssuesList({ issues }: { issues: AuditIssue[] }) { if (issues.length === 0) { return (
- -

代码质量优秀!

-

恭喜!没有发现任何问题

+ +

代码质量优秀!

+

恭喜!没有发现任何问题

-

+

您的代码通过了所有质量检查,包括安全性、性能、可维护性等各个方面的评估。

@@ -324,6 +326,7 @@ export default function TaskDetail() { const [loading, setLoading] = useState(true); const [exportDialogOpen, setExportDialogOpen] = useState(false); const [cancelling, setCancelling] = useState(false); + const [scanConfigExpanded, setScanConfigExpanded] = useState(false); // Zombie task detection const [lastProgressTime, setLastProgressTime] = useState(Date.now()); @@ -646,12 +649,25 @@ export default function TaskDetail() { {task.scan_config && (
-

扫描配置

-
-
-                      {JSON.stringify(JSON.parse(task.scan_config), null, 2)}
-                    
-
+ + {scanConfigExpanded && ( +
+
+                        {JSON.stringify(JSON.parse(task.scan_config), null, 2)}
+                      
+
+ )}
)}