From e363ded4451ec38da18fe2c815bc6ddb70ee566f Mon Sep 17 00:00:00 2001 From: Logan Date: Wed, 1 Jul 2026 12:45:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=A8=E7=AB=99=20PageShell=20?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E7=B3=BB=E7=BB=9F=E4=B8=8E=E4=B8=93=E4=B8=9A?= =?UTF-8?q?=20UI=20=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PageShell/PageTabs/ContentPanel/PageLoading/PageEmpty 页面骨架 - index.css 设计令牌文档化,布局令牌与纯色主按钮(去除渐变粉彩) - 全站路由页接入 PageShell,云账单三 Tab 为标杆 - 主题体系:跟随系统 + 主流/开发者分组,新增 Dracula/Tokyo Night,One Dark 暖灰差异化 - 登录页/侧栏/顶栏去渐变光球,企业克制风 - 修复 AIAlertAnalyzer JSX 与构建依赖导入问题 --- frontend/src/App.tsx | 2 + frontend/src/components/agent/AgentAlerts.tsx | 78 +- .../src/components/agent/AgentMonitor.tsx | 86 +- .../src/components/agent/AgentRuleDialog.tsx | 44 +- frontend/src/components/agent/AgentWizard.tsx | 76 +- .../src/components/agent/HostDetailDialog.tsx | 40 +- .../src/components/agent/agentAlertHelper.tsx | 6 +- .../src/components/aiops/AIAlertAnalyzer.tsx | 79 +- .../src/components/aiops/AIAnalysisResult.tsx | 66 +- .../src/components/aiops/AIOpsAssistant.tsx | 102 +-- .../aiops/AIPredictiveAnalytics.tsx | 174 ++-- frontend/src/components/aiops/AgentCLI.tsx | 138 +-- .../src/components/aiops/AgentCLIHistory.tsx | 30 +- .../src/components/aiops/AgentCLIMessages.tsx | 52 +- .../src/components/aiops/AutoFixDialog.tsx | 20 +- frontend/src/components/aiops/LLMConfig.tsx | 84 +- .../aiops/PredictiveCapacityTab.tsx | 48 +- .../src/components/aiops/analyzerHelpers.ts | 6 +- frontend/src/components/aiops/predictUtils.ts | 6 +- .../approval/ApprovalCreateDialog.tsx | 2 +- .../approval/ApprovalDetailDialog.tsx | 6 +- .../src/components/approval/ApprovalFlow.tsx | 160 +--- .../approval/ApprovalProcessTab.tsx | 10 +- .../approval/ApprovalTemplateTab.tsx | 6 +- frontend/src/components/approval/helpers.tsx | 10 +- frontend/src/components/auth/Login.tsx | 498 ++++------- .../components/cloud/BillingRecordDialog.tsx | 14 +- .../components/cloud/BillingRuleDialog.tsx | 12 +- .../components/cloud/CloudAccountManager.tsx | 200 +++-- .../src/components/cloud/CloudBilling.tsx | 455 +++++----- .../components/cloud/CloudBillingHelpers.tsx | 49 +- .../src/components/cloud/DomainManager.tsx | 190 ++-- .../src/components/cloud/PlatformManager.tsx | 162 ++-- .../src/components/cloud/RegionManager.tsx | 197 ++-- .../src/components/dashboard/Dashboard.tsx | 38 +- frontend/src/components/deploy/AppRelease.tsx | 211 ++--- .../deploy/CredentialFormDialog.tsx | 2 +- .../components/deploy/CredentialManager.tsx | 136 +-- .../components/deploy/DeployCredentials.tsx | 135 +-- frontend/src/components/deploy/DeployRBAC.tsx | 73 +- .../components/deploy/FileBrowserDialog.tsx | 4 +- .../src/components/deploy/PipelineEditor.tsx | 127 +-- .../src/components/deploy/PipelineManager.tsx | 149 ++-- .../components/deploy/PipelineRunDetail.tsx | 114 +-- .../deploy/ReleaseApproveDialog.tsx | 2 +- .../components/deploy/ReleaseCreateDialog.tsx | 34 +- .../components/deploy/ReleaseDetailDialog.tsx | 40 +- .../src/components/deploy/ReleaseManager.tsx | 85 +- .../src/components/deploy/ToolConfigTab.tsx | 26 +- .../components/deploy/UserGroupsManager.tsx | 66 +- .../credential-manager/CredDetailDialog.tsx | 8 +- .../credential-manager/CredFormDialog.tsx | 14 +- .../deploy/credential-manager/constants.ts | 28 +- .../components/deploy/pipeline-helpers.tsx | 12 +- .../deploy/pipeline-manager/PipelineCard.tsx | 4 +- .../pipeline-manager/PipelineCreateDialog.tsx | 14 +- .../pipeline-manager/PipelineRunPanel.tsx | 30 +- .../src/components/deploy/releaseHelpers.tsx | 20 +- .../deploy/releaseManagerHelpers.tsx | 24 +- .../components/kubernetes/CapacityPage.tsx | 102 +-- .../kubernetes/ClusterComparePage.tsx | 112 +-- .../kubernetes/ClusterOverviewPage.tsx | 88 +- .../kubernetes/DeploymentDetail.tsx | 20 +- .../kubernetes/DeploymentEditAdvanced.tsx | 122 +-- .../kubernetes/DeploymentEditBasic.tsx | 114 +-- .../kubernetes/DeploymentEditContainers.tsx | 44 +- .../kubernetes/DeploymentEditService.tsx | 160 ++-- .../kubernetes/DeploymentEditStorage.tsx | 78 +- .../components/kubernetes/DeploymentView.tsx | 2 +- .../kubernetes/DeploymentWorkload.tsx | 178 +--- .../src/components/kubernetes/EventsPage.tsx | 169 ++-- .../kubernetes/K8sShortcutRedirect.tsx | 2 +- .../components/kubernetes/KubectlTerminal.tsx | 2 +- .../kubernetes/KubernetesClusterDialog.tsx | 6 +- .../kubernetes/KubernetesClusters.tsx | 75 +- .../components/kubernetes/KubernetesNodes.tsx | 77 +- .../kubernetes/KubernetesWorkloads.tsx | 120 +-- .../kubernetes/NamespaceManagementPage.tsx | 124 +-- .../kubernetes/NamespaceOverviewPage.tsx | 33 +- .../kubernetes/NamespaceResourcePage.tsx | 128 ++- .../components/kubernetes/NodeDetailPage.tsx | 270 +++--- .../components/kubernetes/PodExecTerminal.tsx | 4 +- .../components/kubernetes/PodFileBrowser.tsx | 56 +- .../components/kubernetes/PodLogsViewer.tsx | 14 +- .../components/kubernetes/PodMetricsPage.tsx | 108 ++- .../kubernetes/ResourceVisualEditor.tsx | 22 +- .../components/kubernetes/TopologyView.tsx | 211 +++-- .../kubernetes/WorkloadViewPage.tsx | 79 +- .../components/kubernetes/YamlCodeMirror.tsx | 4 +- .../kubernetes/YamlEditorToolbar.tsx | 12 +- .../src/components/kubernetes/YamlViewer.tsx | 20 +- .../deployment-detail/CreateHPADialog.tsx | 34 +- .../deployment-detail/DeploymentHpaTab.tsx | 30 +- .../deployment-detail/DeploymentLogsTab.tsx | 20 +- .../deployment-detail/DeploymentOverview.tsx | 58 +- .../deployment-detail/DeploymentPodsTab.tsx | 42 +- .../DnsHostSection.tsx | 50 +- .../SchedulingSection.tsx | 50 +- .../deployment-edit/ContainerEditor.tsx | 202 ++--- .../deployment-edit/ContainerGroupSection.tsx | 26 +- .../kubernetes/deployment-storage-fields.tsx | 40 +- .../kubernetes/deployment-view/HistoryTab.tsx | 2 +- .../kubernetes/deployment-view/PodsTab.tsx | 10 +- .../deployment-workload/ActionModals.tsx | 18 +- .../deployment-workload/EditModeContainer.tsx | 4 +- .../deployment-workload/ModalShell.tsx | 6 +- .../deployment-workload/PodLogsModal.tsx | 26 +- .../deployment-workload/UpdateImageModal.tsx | 44 +- .../kubernetes/topology-helpers.tsx | 16 +- .../src/components/layout/ContentPanel.tsx | 30 + .../src/components/layout/ErrorBoundary.tsx | 4 +- frontend/src/components/layout/Header.tsx | 56 +- frontend/src/components/layout/MainLayout.tsx | 40 +- frontend/src/components/layout/PageEmpty.tsx | 28 + .../src/components/layout/PageLoading.tsx | 24 + frontend/src/components/layout/PageShell.tsx | 106 +++ frontend/src/components/layout/PageTabs.tsx | 48 + frontend/src/components/layout/Sidebar.tsx | 4 +- .../src/components/layout/ThemePicker.tsx | 61 ++ .../components/monitor/AlertChannelDialog.tsx | 44 +- .../src/components/monitor/AlertEventsTab.tsx | 58 +- .../src/components/monitor/AlertManager.tsx | 157 +--- .../components/monitor/AlertRuleDialog.tsx | 54 +- .../src/components/monitor/AlertRulesTab.tsx | 54 +- .../monitor/alert-center/AlertCenter.tsx | 198 ++-- .../alert-center/AlertCenterDetail.tsx | 2 +- .../monitor/alert-center/AlertChannelsTab.tsx | 2 +- .../monitor/alert-center/SilenceRuleTab.tsx | 2 +- .../alert-center/alert-center-helpers.tsx | 4 +- .../src/components/monitor/alertShared.tsx | 6 +- .../monitor/dashboard/GrafanaDashboard.tsx | 181 ++-- .../monitor/dashboard/GrafanaPanelContent.tsx | 6 +- .../dashboard/HostMonitorDashboard.tsx | 74 +- .../monitor/dashboard/PrometheusDashboard.tsx | 16 +- .../monitor/dashboard/ZabbixDashboard.tsx | 20 +- .../monitor/datasource/DatasourcePage.tsx | 55 +- .../PrometheusDatasourceManager.tsx | 262 +++--- .../datasource/ZabbixDatasourceManager.tsx | 16 +- .../prometheus-ds/PromDsFormDialog.tsx | 12 +- .../monitor/log-center/EnhancedLogResults.tsx | 12 +- .../monitor/log-center/LogAlertsPanel.tsx | 8 +- .../monitor/log-center/LogCenter.tsx | 23 +- .../log-center/LogCenterArchBanner.tsx | 2 +- .../monitor/log-center/LogClusterPanel.tsx | 2 +- .../monitor/log-center/LogDatasourcePage.tsx | 10 +- .../components/monitor/trace/TraceManager.tsx | 101 ++- .../components/server/CloudServerImport.tsx | 26 +- .../components/server/ExcelServerImport.tsx | 20 +- .../components/server/ServerFileBrowser.tsx | 6 +- frontend/src/components/server/ServerForm.tsx | 10 +- .../src/components/server/ServerManager.tsx | 191 ++-- .../src/components/server/ServerTableRow.tsx | 2 +- .../src/components/server/TerminalDialog.tsx | 2 +- .../src/components/server/serverHelpers.tsx | 6 +- .../components/system/CredentialManager.tsx | 96 +- .../src/components/system/CsvImportDialog.tsx | 52 +- .../components/system/LdapImportDialog.tsx | 48 +- .../system/LdapManagementSection.tsx | 158 ++-- .../components/system/LiveMonitorDialog.tsx | 10 +- .../src/components/system/ReplayDialog.tsx | 42 +- .../components/system/ResetPasswordDialog.tsx | 2 +- .../src/components/system/RoleFormDialog.tsx | 6 +- .../src/components/system/SystemLogsTab.tsx | 46 +- .../src/components/system/SystemManager.tsx | 64 +- .../src/components/system/SystemRolesTab.tsx | 10 +- .../components/system/SystemSettingsTab.tsx | 123 +-- .../components/system/TerminalSessionsTab.tsx | 60 +- .../components/system/UserDetailDialog.tsx | 40 +- .../src/components/system/UserFormDialog.tsx | 42 +- .../system/replay/ReplayCommandSidebar.tsx | 20 +- .../src/components/task/CronJobFormDialog.tsx | 2 +- .../src/components/task/CronJobManager.tsx | 403 +++++---- .../task/ExecutionHistoryDialog.tsx | 2 +- .../src/components/task/RemoteExecPage.tsx | 115 +-- .../components/task/ScriptDetailDialog.tsx | 2 +- .../src/components/task/ScriptLogsDialog.tsx | 2 +- .../src/components/task/ScriptManager.tsx | 266 +++--- .../src/components/task/cronJobHelpers.tsx | 6 +- .../src/components/task/script-helpers.tsx | 6 +- frontend/src/components/ui/button.tsx | 6 +- frontend/src/components/ui/confirm-dialog.tsx | 8 +- frontend/src/components/ui/copy-button.tsx | 2 +- frontend/src/components/ui/data-table.tsx | 6 +- frontend/src/components/ui/dialog.tsx | 2 +- frontend/src/components/ui/sonner.tsx | 29 +- frontend/src/components/ui/stat-strip.tsx | 33 +- frontend/src/components/ui/switch.tsx | 2 +- .../components/user/ApiAccessKeySection.tsx | 8 +- frontend/src/components/user/ProfilePage.tsx | 47 +- frontend/src/hooks/useTheme.tsx | 48 +- frontend/src/index.css | 844 +++++++++++++----- frontend/src/main.tsx | 4 + .../pages/approval/ApprovalCategoryPage.tsx | 137 +-- .../pages/approval/ApprovalWorkflowPage.tsx | 123 ++- .../src/pages/audit/AuditOperationsTab.tsx | 216 ++--- frontend/src/pages/audit/LoginLogsTab.tsx | 101 ++- frontend/src/pages/audit/TerminalAuditTab.tsx | 47 +- .../terminal-audit/ActiveSessionsPanel.tsx | 52 +- .../terminal-audit/HistorySessionsPanel.tsx | 72 +- .../terminal-audit/SessionCommandsPanel.tsx | 50 +- .../pages/audit/terminal-audit/helpers.tsx | 6 +- frontend/src/pages/monitor/HostMonitor.tsx | 240 ++--- .../src/pages/monitor/MetricsExplorer.tsx | 143 ++- .../src/pages/monitor/MiddlewareMonitor.tsx | 26 +- frontend/src/pages/monitor/MonitorCenter.tsx | 79 +- frontend/src/pages/monitor/SNMPMonitor.tsx | 28 +- frontend/src/pages/monitor/SiteMonitor.tsx | 30 +- .../monitor/host-monitor/DualLineChart.tsx | 4 +- .../host-monitor/HealthProbeSection.tsx | 18 +- .../monitor/host-monitor/PortPolicyDialog.tsx | 6 +- .../host-monitor/SystemInfoSection.tsx | 10 +- frontend/src/utils/index.ts | 11 +- frontend/src/utils/theme.ts | 122 ++- 213 files changed, 7148 insertions(+), 6818 deletions(-) create mode 100644 frontend/src/components/layout/ContentPanel.tsx create mode 100644 frontend/src/components/layout/PageEmpty.tsx create mode 100644 frontend/src/components/layout/PageLoading.tsx create mode 100644 frontend/src/components/layout/PageShell.tsx create mode 100644 frontend/src/components/layout/PageTabs.tsx create mode 100644 frontend/src/components/layout/ThemePicker.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index efb52c1..97bb4a9 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -8,6 +8,7 @@ import { Login } from '@/components/auth/Login'; import { ProtectedRoute } from '@/components/auth/ProtectedRoute'; import { PageTransition } from '@/components/layout/PageTransition'; import { ErrorBoundary } from '@/components/layout/ErrorBoundary'; +import { Toaster } from '@/components/ui/sonner'; // Lazy load page components for code splitting const Dashboard = lazy(() => import('@/components/dashboard/Dashboard').then(m => ({ default: m.Dashboard }))); @@ -108,6 +109,7 @@ function App() { + } /> diff --git a/frontend/src/components/agent/AgentAlerts.tsx b/frontend/src/components/agent/AgentAlerts.tsx index cca2ff7..7a802ff 100644 --- a/frontend/src/components/agent/AgentAlerts.tsx +++ b/frontend/src/components/agent/AgentAlerts.tsx @@ -112,19 +112,19 @@ export function AgentAlerts() { {/* 页头 */}
-

Agent 告警

-

基于 Agent 上报指标的告警规则与事件

+

Agent 告警

+

基于 Agent 上报指标的告警规则与事件

-
- - 告警事件 - 告警规则 + + 告警事件 + 告警规则 {/* ========== 告警事件 ========== */} @@ -134,7 +134,7 @@ export function AgentAlerts() { size="sm" variant={resolvedView ? 'outline' : 'default'} onClick={() => setResolvedView(false)} - className={!resolvedView ? 'bg-blue-600 hover:bg-blue-700 text-white' : 'bg-slate-800 border-slate-700 text-slate-300'} + className={!resolvedView ? 'bg-blue-600 hover:bg-blue-700 text-white' : 'dg-input text-[var(--dg-text-secondary)]'} > 未恢复 @@ -142,53 +142,53 @@ export function AgentAlerts() { size="sm" variant={resolvedView ? 'default' : 'outline'} onClick={() => setResolvedView(true)} - className={resolvedView ? 'bg-blue-600 hover:bg-blue-700 text-white' : 'bg-slate-800 border-slate-700 text-slate-300'} + className={resolvedView ? 'bg-blue-600 hover:bg-blue-700 text-white' : 'dg-input text-[var(--dg-text-secondary)]'} > 已恢复 {loading ? ( - + - - 加载中... + + 加载中... ) : alerts.length === 0 ? ( - + -

{resolvedView ? '暂无已恢复的告警' : '当前无活动告警,一切正常'}

+

{resolvedView ? '暂无已恢复的告警' : '当前无活动告警,一切正常'}

) : (
{alerts.map((alert) => ( - +
-
- +
+
{severityBadge(alert.severity)} - {alert.rule_name || alert.name || alert.title || '告警'} + {alert.rule_name || alert.name || alert.title || '告警'}
-

{alert.message || alert.description || '触发告警阈值'}

-
+

{alert.message || alert.description || '触发告警阈值'}

+
{alert.hostname || '--'} - 指标: {getMetricLabel(alert.metric)} + 指标: {getMetricLabel(alert.metric)} {alert.value != null && ( - 当前值: {alert.value} + 当前值: {alert.value} )} @@ -203,7 +203,7 @@ export function AgentAlerts() { size="sm" variant="outline" onClick={() => handleResolve(alert.id)} - className="shrink-0 h-8 bg-slate-800 border-slate-700 text-emerald-400 hover:bg-emerald-500/10 hover:text-emerald-400" + className="shrink-0 h-8 dg-input dg-text-green hover:bg-emerald-500/10 hover:dg-text-green" > 恢复 @@ -227,17 +227,17 @@ export function AgentAlerts() {
{loading ? ( - + - - 加载中... + + 加载中... ) : rules.length === 0 ? ( - + - -

暂无告警规则

+ +

暂无告警规则

-
diff --git a/frontend/src/components/agent/AgentMonitor.tsx b/frontend/src/components/agent/AgentMonitor.tsx index 14f6c92..34c2975 100644 --- a/frontend/src/components/agent/AgentMonitor.tsx +++ b/frontend/src/components/agent/AgentMonitor.tsx @@ -129,9 +129,9 @@ export function AgentMonitor() { const onlineCount = hosts.filter((h) => isOnline(h.last_report || h.last_reported_at || h.updated_at)).length; const stats = [ - { label: '主机总数', value: hosts.length, icon: Server, color: 'text-blue-400' }, - { label: '在线', value: onlineCount, icon: Wifi, color: 'text-emerald-400' }, - { label: '离线', value: hosts.length - onlineCount, icon: WifiOff, color: 'text-red-400' }, + { label: '主机总数', value: hosts.length, icon: Server, color: 'dg-text-blue' }, + { label: '在线', value: onlineCount, icon: Wifi, color: 'dg-text-green' }, + { label: '离线', value: hosts.length - onlineCount, icon: WifiOff, color: 'dg-text-red' }, ]; return ( @@ -139,8 +139,8 @@ export function AgentMonitor() { {/* 页头 */}
-

Agent 监控

-

实时监控 Agent 上报的主机指标

+

Agent 监控

+

实时监控 Agent 上报的主机指标