/* ==================== 全局样式 ==================== */ * { margin: 0; padding: 0; box-sizing: border-box; } :root { --primary: #1a73e8; --primary-dark: #1557b0; --success: #34a853; --warning: #fbbc04; --danger: #ea4335; --info: #4285f4; --dark: #202124; --gray-900: #3c4043; --gray-700: #5f6368; --gray-500: #9aa0a6; --gray-300: #dadce0; --gray-100: #f1f3f4; --white: #ffffff; --shadow-sm: 0 1px 2px rgba(0,0,0,0.1); --shadow-md: 0 4px 6px rgba(0,0,0,0.1); --shadow-lg: 0 10px 20px rgba(0,0,0,0.1); --radius: 8px; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background: var(--gray-100); color: var(--gray-900); line-height: 1.6; min-height: 100vh; display: flex; flex-direction: column; } /* ==================== 导航栏 ==================== */ .navbar { background: linear-gradient(135deg, var(--dark) 0%, var(--gray-900) 100%); color: var(--white); padding: 0 24px; display: flex; align-items: center; height: 64px; box-shadow: var(--shadow-md); position: sticky; top: 0; z-index: 100; } .navbar-brand { display: flex; align-items: center; gap: 12px; margin-right: 40px; } .navbar-brand .logo { font-size: 24px; } .navbar-brand .title { font-size: 16px; font-weight: 600; white-space: nowrap; } .navbar-menu { display: flex; gap: 4px; flex: 1; } .navbar-menu a { color: var(--gray-300); text-decoration: none; padding: 8px 16px; border-radius: var(--radius); font-size: 14px; transition: all 0.2s; } .navbar-menu a:hover { color: var(--white); background: rgba(255,255,255,0.1); } .navbar-menu a.active { color: var(--white); background: var(--primary); } .navbar-info { font-size: 13px; color: var(--gray-500); } /* ==================== 主内容区 ==================== */ .main-content { flex: 1; max-width: 1400px; margin: 0 auto; padding: 24px; width: 100%; } /* ==================== 页面切换 ==================== */ .page { display: none; animation: fadeIn 0.3s ease; } .page.active { display: block; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .page-header { margin-bottom: 24px; } .page-header h1 { font-size: 28px; font-weight: 600; color: var(--dark); margin-bottom: 4px; } .page-header .subtitle { color: var(--gray-700); font-size: 14px; } /* ==================== 统计卡片 ==================== */ .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; } .stat-card { background: var(--white); border-radius: var(--radius); padding: 20px; display: flex; align-items: center; gap: 16px; box-shadow: var(--shadow-sm); transition: transform 0.2s, box-shadow 0.2s; } .stat-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); } .stat-icon { font-size: 36px; } .stat-value { font-size: 28px; font-weight: 700; color: var(--dark); } .stat-label { font-size: 13px; color: var(--gray-700); } /* ==================== 卡片 ==================== */ .card { background: var(--white); border-radius: var(--radius); box-shadow: var(--shadow-sm); margin-bottom: 20px; overflow: hidden; } .card-header { padding: 16px 20px; border-bottom: 1px solid var(--gray-300); display: flex; align-items: center; justify-content: space-between; } .card-header h2 { font-size: 16px; font-weight: 600; color: var(--dark); } .card-body { padding: 20px; } /* ==================== Dashboard Grid ==================== */ .dashboard-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 20px; } /* ==================== 工作面列表 ==================== */ .unit-list { display: grid; gap: 8px; } .unit-item { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; background: var(--gray-100); border-radius: var(--radius); transition: background 0.2s; cursor: pointer; } .unit-item:hover { background: var(--gray-300); } .unit-name { font-weight: 500; } .unit-code { font-size: 12px; color: var(--gray-700); background: var(--white); padding: 2px 8px; border-radius: 4px; } .unit-status { display: flex; align-items: center; gap: 6px; font-size: 13px; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--success); } .status-dot.empty { background: var(--gray-500); } /* ==================== 表单 ==================== */ .form-inline { display: flex; align-items: flex-end; gap: 16px; flex-wrap: wrap; } .form-vertical { display: flex; flex-direction: column; gap: 12px; } .form-group { display: flex; flex-direction: column; gap: 4px; } .form-group label { font-size: 13px; font-weight: 500; color: var(--gray-700); } .form-input, .form-select { padding: 8px 12px; border: 1px solid var(--gray-300); border-radius: var(--radius); font-size: 14px; background: var(--white); transition: border-color 0.2s; min-width: 180px; } .form-input:focus, .form-select:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 2px rgba(26,115,232,0.2); } .form-group-btn { align-items: flex-end; } /* ==================== 按钮 ==================== */ .btn { padding: 8px 20px; border: none; border-radius: var(--radius); font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s; display: inline-flex; align-items: center; gap: 6px; } .btn:disabled { opacity: 0.6; cursor: not-allowed; } .btn-primary { background: var(--primary); color: var(--white); } .btn-primary:hover:not(:disabled) { background: var(--primary-dark); } .btn-success { background: var(--success); color: var(--white); } .btn-success:hover:not(:disabled) { background: #2d9249; } .btn-warning { background: var(--warning); color: var(--gray-900); } .btn-warning:hover:not(:disabled) { background: #e8a800; } .btn-danger { background: var(--danger); color: var(--white); } .btn-secondary { background: var(--gray-300); color: var(--gray-900); } .btn-secondary:hover:not(:disabled) { background: var(--gray-500); } .btn-sm { padding: 4px 12px; font-size: 12px; } /* ==================== 表格 ==================== */ .data-table-container { overflow-x: auto; } .data-table { width: 100%; border-collapse: collapse; font-size: 13px; } .data-table th, .data-table td { padding: 10px 12px; text-align: left; border-bottom: 1px solid var(--gray-300); } .data-table th { background: var(--gray-100); font-weight: 600; color: var(--gray-700); position: sticky; top: 0; } .data-table tr:hover { background: var(--gray-100); } .data-table .value-normal { color: var(--success); } .data-table .value-warning { color: var(--warning); font-weight: 600; } .data-table .value-danger { color: var(--danger); font-weight: 600; } /* ==================== 徽章 ==================== */ .badge { display: inline-block; padding: 2px 10px; border-radius: 12px; font-size: 12px; font-weight: 500; } .badge-info { background: rgba(66,133,244,0.1); color: var(--info); } .badge-success { background: rgba(52,168,83,0.1); color: var(--success); } .badge-warning { background: rgba(251,188,4,0.1); color: #b07d00; } .badge-danger { background: rgba(234,67,53,0.1); color: var(--danger); } /* ==================== 日志容器 ==================== */ .log-container { background: var(--dark); color: #e8eaed; padding: 16px; border-radius: var(--radius); font-family: 'Courier New', monospace; font-size: 13px; max-height: 300px; overflow-y: auto; line-height: 1.8; } .log-info { color: var(--info); } .log-success { color: var(--success); } .log-warning { color: var(--warning); } .log-error { color: var(--danger); } /* ==================== AI分析布局 ==================== */ .analysis-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 20px; margin-bottom: 20px; } .desc { color: var(--gray-700); font-size: 14px; margin-bottom: 12px; } .time-range { display: flex; align-items: center; gap: 8px; } .time-range span { color: var(--gray-700); } /* ==================== 分析结果 ==================== */ .analysis-result { min-height: 200px; padding: 16px; background: var(--gray-100); border-radius: var(--radius); white-space: pre-wrap; line-height: 1.8; font-size: 14px; max-height: 600px; overflow-y: auto; } .analysis-result h1, .analysis-result h2, .analysis-result h3 { margin-top: 16px; margin-bottom: 8px; color: var(--dark); } /* ==================== 报告预览 ==================== */ .report-preview { min-height: 200px; padding: 20px; background: var(--white); border: 1px solid var(--gray-300); border-radius: var(--radius); line-height: 1.8; font-size: 14px; max-height: 600px; overflow-y: auto; } /* ==================== 数据摘要 ==================== */ .data-summary-content { max-height: 500px; overflow-y: auto; font-size: 13px; line-height: 1.8; } .data-summary-content table { width: 100%; border-collapse: collapse; margin-top: 8px; } .data-summary-content table th, .data-summary-content table td { padding: 8px 10px; border: 1px solid var(--gray-300); text-align: left; font-size: 12px; } .data-summary-content table th { background: var(--gray-100); font-weight: 600; color: var(--gray-700); position: sticky; top: 0; } .data-summary-content table tr:nth-child(even) { background: var(--gray-100); } .data-summary-content table tr:hover { background: var(--gray-300); } .data-summary-content code { background: var(--gray-100); padding: 1px 6px; border-radius: 4px; font-size: 12px; color: var(--primary); } /* ==================== 采集状态 ==================== */ .collect-status { display: grid; gap: 8px; } .collect-status-item { display: flex; justify-content: space-between; align-items: center; padding: 8px 12px; background: var(--gray-100); border-radius: var(--radius); } /* ==================== 页脚 ==================== */ .footer { background: var(--dark); color: var(--gray-500); text-align: center; padding: 16px; font-size: 13px; margin-top: auto; } /* ==================== 加载动画 ==================== */ .loading { display: inline-block; width: 16px; height: 16px; border: 2px solid rgba(255,255,255,0.3); border-radius: 50%; border-top-color: var(--white); animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ==================== 提示消息 ==================== */ .toast { position: fixed; top: 80px; right: 24px; padding: 12px 20px; border-radius: var(--radius); color: var(--white); font-size: 14px; z-index: 1000; animation: slideIn 0.3s ease; box-shadow: var(--shadow-lg); } .toast-success { background: var(--success); } .toast-error { background: var(--danger); } .toast-warning { background: var(--warning); color: var(--gray-900); } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } /* ==================== 响应式 ==================== */ @media (max-width: 768px) { .navbar { flex-wrap: wrap; height: auto; padding: 12px; gap: 8px; } .navbar-brand { margin-right: 0; width: 100%; } .navbar-brand .title { font-size: 14px; } .navbar-menu { order: 3; width: 100%; overflow-x: auto; } .form-inline { flex-direction: column; align-items: stretch; } .form-input, .form-select { min-width: auto; width: 100%; } .dashboard-grid { grid-template-columns: 1fr; } .analysis-grid { grid-template-columns: 1fr; } .stats-grid { grid-template-columns: repeat(2, 1fr); } }