/* 全局样式 */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', 'Microsoft YaHei', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.4; color: #ffffff; background: linear-gradient(135deg, #0a0e1a 0%, #1a1f2e 50%, #0a0e1a 100%); background-attachment: fixed; min-height: 100vh; overflow: hidden; } /* 大屏头部样式 */ .dashboard-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 40px; background: linear-gradient(135deg, #1a1f2e 0%, #2a3441 50%, #1a1f2e 100%); border-bottom: 2px solid #00d4ff; box-shadow: 0 4px 20px rgba(0,0,0,0.3); position: relative; z-index: 100; } .dashboard-header::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(0,212,255,0.1), transparent); animation: shimmer 4s infinite; } @keyframes shimmer { 0% { left: -100%; } 100% { left: 100%; } } .header-left { display: flex; align-items: center; gap: 20px; } .logo { display: flex; align-items: center; justify-content: center; width: 60px; height: 60px; background: linear-gradient(135deg, #00d4ff, #0099cc); border-radius: 50%; box-shadow: 0 0 20px rgba(0,212,255,0.5); } .logo i { font-size: 2rem; color: #ffffff; animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } .main-title { font-size: 2.5rem; font-weight: 700; color: #ffffff; text-shadow: 0 2px 10px rgba(0,212,255,0.3); background: linear-gradient(45deg, #00d4ff, #ffffff, #00d4ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: titleGlow 3s ease-in-out infinite; } @keyframes titleGlow { 0%, 100% { text-shadow: 0 2px 10px rgba(0,212,255,0.3); } 50% { text-shadow: 0 2px 20px rgba(0,212,255,0.6); } } .header-right { display: flex; align-items: center; gap: 30px; } .weather-info { display: flex; align-items: center; gap: 10px; padding: 10px 20px; background: rgba(0,212,255,0.1); border: 1px solid rgba(0,212,255,0.3); border-radius: 25px; backdrop-filter: blur(10px); } .weather-info i { font-size: 1.2rem; color: #00d4ff; } .weather-text { font-size: 1rem; color: #ffffff; font-weight: 500; } .datetime-info { text-align: right; } .date { font-size: 1.1rem; color: #ffffff; font-weight: 600; margin-bottom: 5px; } .time { font-size: 1.5rem; color: #00d4ff; font-weight: 700; font-family: 'Courier New', monospace; text-shadow: 0 0 10px rgba(0,212,255,0.5); } /* 大屏主体布局 */ .dashboard-main { display: flex; height: calc(100vh - 100px); gap: 20px; padding: 20px; background: transparent; } /* 侧边栏通用样式 */ .left-sidebar, .right-sidebar { width: 350px; display: flex; flex-direction: column; gap: 20px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(0,212,255,0.3) transparent; } .left-sidebar::-webkit-scrollbar, .right-sidebar::-webkit-scrollbar { width: 6px; } .left-sidebar::-webkit-scrollbar-track, .right-sidebar::-webkit-scrollbar-track { background: transparent; } .left-sidebar::-webkit-scrollbar-thumb, .right-sidebar::-webkit-scrollbar-thumb { background: rgba(0,212,255,0.3); border-radius: 3px; } /* 数据面板样式 */ .data-panel { background: linear-gradient(135deg, rgba(26,31,46,0.9) 0%, rgba(42,52,65,0.9) 100%); border: 1px solid rgba(0,212,255,0.2); border-radius: 15px; padding: 20px; backdrop-filter: blur(10px); box-shadow: 0 8px 32px rgba(0,0,0,0.3); position: relative; overflow: hidden; } .data-panel::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, transparent, #00d4ff, transparent); animation: borderScan 3s linear infinite; } @keyframes borderScan { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .data-panel h3 { font-size: 1.2rem; color: #ffffff; margin-bottom: 15px; display: flex; align-items: center; gap: 10px; font-weight: 600; } .data-panel h3 i { color: #00d4ff; font-size: 1.1rem; } /* 状态网格 */ .status-grid { display: grid; grid-template-columns: 1fr; gap: 15px; } .status-card { display: flex; align-items: center; gap: 15px; padding: 15px; background: rgba(0,0,0,0.3); border-radius: 10px; border-left: 4px solid; transition: all 0.3s ease; animation: statusPulse 2s ease-in-out infinite; } @keyframes statusPulse { 0%, 100% { box-shadow: 0 0 10px rgba(0,0,0,0.3); } 50% { box-shadow: 0 0 20px rgba(0,212,255,0.2); } } .status-card.online { border-left-color: #00ff88; } .status-card.warning { border-left-color: #ffaa00; } .status-card.processing { border-left-color: #00d4ff; } .status-card:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0,212,255,0.2); } .status-icon { width: 50px; height: 50px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; } .status-card.online .status-icon { background: linear-gradient(135deg, #00ff88, #00cc66); color: #ffffff; } .status-card.warning .status-icon { background: linear-gradient(135deg, #ffaa00, #ff8800); color: #ffffff; } .status-card.processing .status-icon { background: linear-gradient(135deg, #00d4ff, #0099cc); color: #ffffff; } .status-info { flex: 1; } .status-number { display: block; font-size: 1.8rem; font-weight: 700; color: #ffffff; margin-bottom: 5px; } .status-label { display: block; font-size: 0.9rem; color: #b0c4de; font-weight: 500; } /* 水质监测样式 */ .water-quality { display: flex; flex-direction: column; gap: 12px; } .quality-item { display: flex; justify-content: space-between; align-items: center; padding: 12px 15px; background: rgba(0,0,0,0.2); border-radius: 8px; border-left: 3px solid; transition: all 0.3s ease; } .quality-item.excellent { border-left-color: #00ff88; } .quality-item.good { border-left-color: #00d4ff; } .quality-item.warning { border-left-color: #ffaa00; } .quality-item:hover { background: rgba(0,212,255,0.1); transform: translateX(5px); } .quality-label { font-size: 0.9rem; color: #b0c4de; font-weight: 500; } .quality-value { font-size: 1rem; color: #ffffff; font-weight: 600; margin: 0 10px; } .quality-status { font-size: 0.8rem; padding: 4px 8px; border-radius: 12px; font-weight: 500; } .quality-item.excellent .quality-status { background: rgba(0,255,136,0.2); color: #00ff88; } .quality-item.good .quality-status { background: rgba(0,212,255,0.2); color: #00d4ff; } .quality-item.warning .quality-status { background: rgba(255,170,0,0.2); color: #ffaa00; } /* 效率统计样式 */ .efficiency-chart { margin-bottom: 15px; text-align: center; } .efficiency-stats { display: flex; flex-direction: column; gap: 10px; } .stat-row { display: flex; justify-content: space-between; align-items: center; padding: 8px 0; border-bottom: 1px solid rgba(0,212,255,0.1); } .stat-row:last-child { border-bottom: none; } .stat-label { font-size: 0.9rem; color: #b0c4de; font-weight: 500; } .stat-value { font-size: 1.1rem; color: #00d4ff; font-weight: 600; } /* 地图区域样式 */ .map-section { flex: 1; display: flex; flex-direction: column; } .map-container { flex: 1; position: relative; background: linear-gradient(135deg, rgba(26,31,46,0.9) 0%, rgba(42,52,65,0.9) 100%); border: 1px solid rgba(0,212,255,0.2); border-radius: 15px; overflow: hidden; backdrop-filter: blur(10px); box-shadow: 0 8px 32px rgba(0,0,0,0.3); } .map-view { width: 100%; height: 100%; border-radius: 15px; } /* 地图图例 */ .map-legend { position: absolute; top: 20px; left: 20px; background: rgba(26,31,46,0.95); border: 1px solid rgba(0,212,255,0.3); border-radius: 10px; padding: 15px; backdrop-filter: blur(10px); min-width: 180px; } .map-legend h4 { font-size: 1rem; color: #ffffff; margin-bottom: 10px; font-weight: 600; } .legend-items { display: flex; flex-direction: column; gap: 8px; } .legend-item { display: flex; align-items: center; gap: 10px; } .legend-color { width: 12px; height: 12px; border-radius: 50%; animation: legendPulse 2s ease-in-out infinite; } @keyframes legendPulse { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.2); opacity: 0.8; } } .legend-color.clean { background: #00ff88; } .legend-color.warning { background: #ffaa00; } .legend-color.danger { background: #ff4444; } .legend-color.device { background: #00d4ff; } .legend-text { font-size: 0.9rem; color: #b0c4de; font-weight: 500; } /* 地图控制按钮 */ .map-controls { position: absolute; top: 20px; right: 20px; display: flex; flex-direction: column; gap: 10px; } .control-btn { width: 40px; height: 40px; background: rgba(26,31,46,0.95); border: 1px solid rgba(0,212,255,0.3); border-radius: 8px; color: #00d4ff; font-size: 1rem; cursor: pointer; transition: all 0.3s ease; backdrop-filter: blur(10px); display: flex; align-items: center; justify-content: center; } .control-btn:hover { background: rgba(0,212,255,0.2); transform: scale(1.1); box-shadow: 0 0 15px rgba(0,212,255,0.3); } /* 视频监控样式 */ .video-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } .video-item { aspect-ratio: 16/9; border-radius: 8px; overflow: hidden; } .video-placeholder { width: 100%; height: 100%; background: linear-gradient(135deg, rgba(0,0,0,0.6) 0%, rgba(26,31,46,0.8) 100%); border: 1px solid rgba(0,212,255,0.2); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; color: #b0c4de; font-size: 0.8rem; position: relative; overflow: hidden; transition: all 0.3s ease; } .video-placeholder::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(0,212,255,0.1), transparent); animation: videoScan 3s linear infinite; } @keyframes videoScan { 0% { left: -100%; } 100% { left: 100%; } } .video-placeholder i { font-size: 1.5rem; color: #00d4ff; animation: videoIconPulse 2s ease-in-out infinite; } @keyframes videoIconPulse { 0%, 100% { opacity: 0.7; transform: scale(1); } 50% { opacity: 1; transform: scale(1.1); } } .video-placeholder:hover { border-color: rgba(0,212,255,0.5); background: linear-gradient(135deg, rgba(0,212,255,0.1) 0%, rgba(26,31,46,0.9) 100%); } /* 告警信息样式 */ .alert-list { display: flex; flex-direction: column; gap: 12px; max-height: 300px; overflow-y: auto; } .alert-item { display: flex; gap: 12px; padding: 12px; background: rgba(0,0,0,0.2); border-radius: 8px; border-left: 3px solid; transition: all 0.3s ease; } .alert-item.high { border-left-color: #ff4444; } .alert-item.medium { border-left-color: #ffaa00; } .alert-item.low { border-left-color: #00d4ff; } .alert-item:hover { background: rgba(0,212,255,0.05); transform: translateX(5px); } .alert-icon { width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 0.9rem; flex-shrink: 0; } .alert-item.high .alert-icon { background: rgba(255,68,68,0.2); color: #ff4444; } .alert-item.medium .alert-icon { background: rgba(255,170,0,0.2); color: #ffaa00; } .alert-item.low .alert-icon { background: rgba(0,212,255,0.2); color: #00d4ff; } .alert-content { flex: 1; display: flex; flex-direction: column; gap: 4px; } .alert-title { font-size: 0.9rem; color: #ffffff; font-weight: 600; } .alert-desc { font-size: 0.8rem; color: #b0c4de; line-height: 1.3; } .alert-time { font-size: 0.7rem; color: #888; font-style: italic; } /* 环境数据样式 */ .env-data { display: flex; flex-direction: column; gap: 12px; } .env-item { display: flex; align-items: center; gap: 12px; padding: 12px; background: rgba(0,0,0,0.2); border-radius: 8px; transition: all 0.3s ease; } .env-item:hover { background: rgba(0,212,255,0.1); transform: translateX(5px); } .env-icon { width: 35px; height: 35px; border-radius: 50%; background: linear-gradient(135deg, #00d4ff, #0099cc); display: flex; align-items: center; justify-content: center; color: #ffffff; font-size: 1rem; } .env-info { flex: 1; display: flex; justify-content: space-between; align-items: center; } .env-label { font-size: 0.9rem; color: #b0c4de; font-weight: 500; } .env-value { font-size: 1.1rem; color: #ffffff; font-weight: 600; } /* 数据趋势样式 */ .trend-chart { margin-bottom: 15px; text-align: center; background: rgba(0,0,0,0.2); border-radius: 8px; padding: 10px; } .trend-legend { display: flex; justify-content: space-around; gap: 10px; } .legend-item { display: flex; align-items: center; gap: 6px; font-size: 0.8rem; color: #b0c4de; } .legend-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } .legend-dot.red { background: #ff4444; } .legend-dot.blue { background: #00d4ff; } .legend-dot.green { background: #00ff88; } /* 响应式设计 */ @media (max-width: 1600px) { .left-sidebar, .right-sidebar { width: 300px; } .main-title { font-size: 2rem; } } @media (max-width: 1200px) { .dashboard-main { flex-direction: column; height: auto; } .left-sidebar, .right-sidebar { width: 100%; flex-direction: row; overflow-x: auto; overflow-y: hidden; } .data-panel { min-width: 300px; flex-shrink: 0; } .map-section { height: 60vh; order: -1; } } .nav-menu { display: flex; gap: 20px; } .nav-btn { padding: 8px 16px; border: 1px solid transparent; background: rgba(255,255,255,0.05); color: #ffffff; border-radius: 6px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9rem; display: flex; align-items: center; gap: 0.5rem; position: relative; backdrop-filter: blur(10px); font-weight: 500; } .nav-btn::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(45deg, #00d4ff, #0099cc); border-radius: 6px; opacity: 0; transition: opacity 0.3s ease; z-index: -1; } .nav-btn:hover::before, .nav-btn.active::before { opacity: 1; } .nav-btn:hover, .nav-btn.active { color: #ffffff; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,212,255,0.3); } .user-info { display: flex; align-items: center; gap: 1rem; } .time { font-size: 0.9rem; color: #ffffff; padding: 0.5rem 1rem; background: rgba(74, 144, 226, 0.3); border-radius: 20px; text-shadow: 0 1px 2px rgba(0,0,0,0.5); } .user-avatar { display: flex; align-items: center; gap: 0.5rem; padding: 0.5rem 1rem; background: linear-gradient(135deg, #667eea, #764ba2); color: white; border-radius: 20px; cursor: pointer; } /* 主要内容区域 */ .main-content { /* margin-top: 70px; */ padding: 1rem 0; background: rgba(15, 20, 25, 0.8); backdrop-filter: blur(10px); min-height: calc(100vh - 70px); } /* 大屏模式下的主内容区域 */ body.fullscreen-mode .main-content { margin-top: 0; padding: 0; background: transparent; backdrop-filter: none; min-height: 100vh; } .tab-content { display: none; animation: fadeIn 0.4s ease-in-out; background: rgba(26, 35, 50, 0.6); border-radius: 12px; margin: 10px; padding: 20px; border: 1px solid rgba(0, 212, 255, 0.2); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); } /* 大屏模式下的tab内容 */ body.fullscreen-mode .tab-content { background: transparent; border-radius: 0; margin: 0; padding: 0; border: none; box-shadow: none; } .tab-content.active { display: block; } /* 监控管理一张图 - 大屏风格 */ .monitor-layout { display: grid; grid-template-columns: 1fr 450px; gap: 1rem; height: 100vh; padding: 0; margin: 0; background: linear-gradient(135deg, #0a0e1a 0%, #1a2332 50%, #0a0e1a 100%); } .map-container { background: linear-gradient(135deg, rgba(10, 14, 26, 0.95) 0%, rgba(26, 35, 50, 0.9) 100%); border-radius: 0; box-shadow: inset 0 0 50px rgba(0, 212, 255, 0.1); overflow: hidden; position: relative; border: 2px solid rgba(0, 212, 255, 0.5); backdrop-filter: blur(20px); margin: 0; } .map-header { display: flex; justify-content: space-between; align-items: center; padding: 1.5rem 2rem; background: linear-gradient(135deg, #0a0e1a, #1e3c72, #2a5298); color: white; border-bottom: 3px solid rgba(0, 212, 255, 0.8); box-shadow: 0 4px 20px rgba(0, 212, 255, 0.3); } .map-header h3 { display: flex; align-items: center; gap: 1rem; margin: 0; font-size: 1.8rem; font-weight: 700; text-shadow: 0 2px 10px rgba(0, 212, 255, 0.5); background: linear-gradient(45deg, #00d4ff, #ffffff, #00d4ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: titleGlow 3s ease-in-out infinite alternate; } @keyframes titleGlow { 0% { text-shadow: 0 2px 10px rgba(0, 212, 255, 0.5); } 100% { text-shadow: 0 2px 20px rgba(0, 212, 255, 0.8), 0 0 30px rgba(0, 212, 255, 0.4); } } .map-controls { display: flex; gap: 0.5rem; } .control-btn { padding: 0.8rem 1.5rem; border: 2px solid rgba(0, 212, 255, 0.6); background: linear-gradient(135deg, rgba(0, 212, 255, 0.2), rgba(0, 212, 255, 0.1)); color: #00d4ff; border-radius: 8px; cursor: pointer; transition: all 0.3s ease; font-size: 1rem; font-weight: 600; text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); box-shadow: 0 4px 15px rgba(0, 212, 255, 0.3); } .control-btn:hover { background: linear-gradient(135deg, rgba(0, 212, 255, 0.4), rgba(0, 212, 255, 0.2)); transform: translateY(-2px); box-shadow: 0 6px 20px rgba(0, 212, 255, 0.5); } .map { height: calc(100% - 140px); background: #0a0e1a; position: relative; overflow: hidden; background-image: url('images/river-bg.svg'); background-size: cover; background-position: center; background-repeat: no-repeat; border-radius: 0; border: 3px solid rgba(0, 212, 255, 0.8); box-shadow: inset 0 0 100px rgba(0, 212, 255, 0.1), 0 0 50px rgba(0, 212, 255, 0.3); } .map::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(45deg, rgba(0, 212, 255, 0.15) 0%, transparent 30%, rgba(0, 212, 255, 0.15) 70%, transparent 100%); pointer-events: none; animation: mapScan 4s linear infinite; } @keyframes mapScan { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } .map-legend { position: absolute; bottom: 1.5rem; left: 1.5rem; background: rgba(10, 14, 26, 0.98); padding: 1.5rem; border-radius: 12px; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.6); backdrop-filter: blur(25px); border: 2px solid rgba(0, 212, 255, 0.6); color: #ffffff; font-size: 1rem; } .legend-item { display: flex; align-items: center; gap: 0.8rem; margin-bottom: 0.8rem; font-size: 1rem; font-weight: 500; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); } .legend-color { width: 16px; height: 16px; border-radius: 50%; box-shadow: 0 0 10px currentColor; animation: legendPulse 2s ease-in-out infinite; } @keyframes legendPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } .legend-color.red { background: #e74c3c; } .legend-color.blue { background: #3498db; } .legend-color.green { background: #2ecc71; } .legend-color.orange { background: #f39c12; } .legend-color.purple { background: #9b59b6; } /* 信息面板 - 大屏风格 */ .info-panel { display: flex; flex-direction: column; gap: 1rem; overflow-y: auto; padding: 0; margin: 0; } .panel-section { background: linear-gradient(135deg, rgba(10, 14, 26, 0.95) 0%, rgba(26, 35, 50, 0.9) 100%); border-radius: 0; padding: 1.5rem; box-shadow: inset 0 0 30px rgba(0, 212, 255, 0.1), 0 4px 20px rgba(0, 0, 0, 0.6); border: 2px solid rgba(0, 212, 255, 0.5); backdrop-filter: blur(20px); margin: 0; } .panel-section h4 { display: flex; align-items: center; gap: 0.8rem; margin-bottom: 1.2rem; color: #ffffff; font-size: 1.3rem; font-weight: 700; text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5); background: linear-gradient(45deg, #00d4ff, #ffffff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .panel-section h4 i { font-size: 1.5rem; color: #00d4ff; filter: drop-shadow(0 0 8px rgba(0, 212, 255, 0.8)); animation: iconGlow 2s ease-in-out infinite alternate; } @keyframes iconGlow { 0% { filter: drop-shadow(0 0 8px rgba(0, 212, 255, 0.8)); } 100% { filter: drop-shadow(0 0 15px rgba(0, 212, 255, 1)); } } .status-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; } .status-card { display: flex; align-items: center; gap: 1rem; padding: 1.2rem; background: linear-gradient(135deg, rgba(10, 14, 26, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%); border-radius: 12px; transition: all 0.3s ease; border: 2px solid rgba(0, 212, 255, 0.4); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); } .status-card:hover { transform: translateY(-3px) scale(1.02); border-color: rgba(0, 212, 255, 0.8); box-shadow: 0 8px 30px rgba(0, 212, 255, 0.3); } .status-icon { width: 50px; height: 50px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.3rem; box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); animation: statusIconPulse 3s ease-in-out infinite; } @keyframes statusIconPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } .status-icon.red { background: linear-gradient(135deg, #e74c3c, #c0392b); } .status-icon.blue { background: linear-gradient(135deg, #3498db, #2980b9); } .status-icon.green { background: linear-gradient(135deg, #2ecc71, #27ae60); } .status-icon.purple { background: linear-gradient(135deg, #9b59b6, #8e44ad); } .status-info { display: flex; flex-direction: column; } .status-number { font-size: 1.8rem; font-weight: 700; color: #ffffff; text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5); background: linear-gradient(45deg, #00d4ff, #ffffff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .status-label { font-size: 0.9rem; color: #b0c4de; font-weight: 500; text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); } /* 视频监控 - 大屏风格 */ .video-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; } .video-item { aspect-ratio: 16/9; border-radius: 12px; overflow: hidden; position: relative; border: 2px solid rgba(0, 212, 255, 0.4); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); transition: all 0.3s ease; } .video-item:hover { border-color: rgba(0, 212, 255, 0.8); box-shadow: 0 8px 30px rgba(0, 212, 255, 0.3); transform: scale(1.02); } .video-placeholder { width: 100%; height: 100%; background: linear-gradient(135deg, #0a0e1a, #1a2332, #0a0e1a); display: flex; flex-direction: column; align-items: center; justify-content: center; color: #ffffff; gap: 0.8rem; position: relative; } .video-placeholder::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(45deg, rgba(0, 212, 255, 0.1) 0%, transparent 50%, rgba(0, 212, 255, 0.1) 100%); animation: videoScan 3s linear infinite; } @keyframes videoScan { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } .video-placeholder i { font-size: 2.5rem; color: #00d4ff; filter: drop-shadow(0 0 10px rgba(0, 212, 255, 0.8)); animation: videoIconPulse 2s ease-in-out infinite; z-index: 1; } @keyframes videoIconPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } .video-placeholder span { font-size: 1rem; font-weight: 600; text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5); z-index: 1; } /* 重点区域 - 大屏风格 */ .area-list { display: flex; flex-direction: column; gap: 1rem; } .area-item { display: flex; justify-content: space-between; align-items: center; padding: 1.2rem; border-radius: 12px; border-left: 6px solid; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); } .area-item:hover { transform: translateX(5px); box-shadow: 0 6px 25px rgba(0, 0, 0, 0.4); } .area-item.high { background: linear-gradient(135deg, rgba(231, 76, 60, 0.2), rgba(231, 76, 60, 0.1)); border-left-color: #e74c3c; box-shadow: 0 4px 15px rgba(231, 76, 60, 0.3); } .area-item.medium { background: linear-gradient(135deg, rgba(243, 156, 18, 0.2), rgba(243, 156, 18, 0.1)); border-left-color: #f39c12; box-shadow: 0 4px 15px rgba(243, 156, 18, 0.3); } .area-item.low { background: linear-gradient(135deg, rgba(46, 204, 113, 0.2), rgba(46, 204, 113, 0.1)); border-left-color: #2ecc71; box-shadow: 0 4px 15px rgba(46, 204, 113, 0.3); } .area-name { font-weight: 600; font-size: 1.1rem; color: #ffffff; text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); } .area-status { font-size: 0.9rem; font-weight: 600; padding: 0.5rem 1rem; border-radius: 20px; color: white; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); } .area-item.high .area-status { background: linear-gradient(135deg, #e74c3c, #c0392b); box-shadow: 0 2px 10px rgba(231, 76, 60, 0.4); } .area-item.medium .area-status { background: linear-gradient(135deg, #f39c12, #e67e22); box-shadow: 0 2px 10px rgba(243, 156, 18, 0.4); } .area-item.low .area-status { background: linear-gradient(135deg, #2ecc71, #27ae60); box-shadow: 0 2px 10px rgba(46, 204, 113, 0.4); } /* 数据统计图表 - 大屏风格 */ .chart-container { margin-bottom: 1.2rem; background: linear-gradient(135deg, rgba(10, 14, 26, 0.8), rgba(26, 35, 50, 0.6)); border-radius: 12px; padding: 1.5rem; border: 2px solid rgba(0, 212, 255, 0.4); box-shadow: inset 0 0 20px rgba(0, 212, 255, 0.1), 0 4px 20px rgba(0, 0, 0, 0.4); backdrop-filter: blur(15px); } .chart-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; } .stat-item { text-align: center; padding: 0.8rem; background: rgba(26, 35, 50, 0.8); border-radius: 6px; border: 1px solid rgba(0, 212, 255, 0.2); } .stat-label { display: block; font-size: 0.75rem; color: #b0c4de; margin-bottom: 0.3rem; } .stat-value { display: block; font-size: 1.1rem; font-weight: 600; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } /* 环境监测 */ .env-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } .env-card { display: flex; align-items: center; gap: 0.8rem; padding: 1rem; background: rgba(15, 20, 25, 0.6); border-radius: 8px; border: 1px solid rgba(0, 212, 255, 0.2); transition: all 0.3s ease; } .env-card:hover { transform: translateY(-2px); border-color: rgba(0, 212, 255, 0.4); } .env-icon { width: 35px; height: 35px; border-radius: 50%; background: linear-gradient(135deg, #3498db, #2980b9); display: flex; align-items: center; justify-content: center; color: white; font-size: 0.9rem; } .env-info { display: flex; flex-direction: column; gap: 0.2rem; } .env-label { font-size: 0.75rem; color: #b0c4de; } .env-value { font-size: 1rem; font-weight: 600; color: #ffffff; } .env-value.good { color: #2ecc71; } .env-number { font-size: 0.7rem; color: #95a5a6; } /* 设备运行状态 */ .device-status-list { display: flex; flex-direction: column; gap: 1rem; } .device-status-item { padding: 1rem; background: rgba(15, 20, 25, 0.6); border-radius: 8px; border: 1px solid rgba(0, 212, 255, 0.2); } .device-info { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.8rem; } .device-name { font-weight: 600; color: #ffffff; font-size: 0.9rem; } .device-location { font-size: 0.75rem; color: #b0c4de; } .device-metrics { display: flex; flex-direction: column; gap: 0.6rem; } .metric { display: flex; align-items: center; gap: 0.8rem; } .metric-label { font-size: 0.75rem; color: #b0c4de; min-width: 40px; } .progress-bar { flex: 1; height: 6px; background: rgba(255, 255, 255, 0.1); border-radius: 3px; overflow: hidden; } .progress-fill { height: 100%; background: linear-gradient(90deg, #2ecc71, #27ae60); border-radius: 3px; transition: width 0.3s ease; } .metric-value { font-size: 0.75rem; color: #ffffff; min-width: 35px; text-align: right; } .signal-bars { display: flex; gap: 2px; align-items: end; } .bar { width: 3px; background: rgba(255, 255, 255, 0.2); border-radius: 1px; transition: background-color 0.3s ease; } .bar:nth-child(1) { height: 8px; } .bar:nth-child(2) { height: 10px; } .bar:nth-child(3) { height: 12px; } .bar:nth-child(4) { height: 14px; } .bar:nth-child(5) { height: 16px; } .bar.active { background: #2ecc71; } .status-indicator { padding: 0.2rem 0.6rem; border-radius: 12px; font-size: 0.7rem; font-weight: 500; } .status-indicator.online { background: rgba(46, 204, 113, 0.2); color: #2ecc71; border: 1px solid rgba(46, 204, 113, 0.3); } /* 实时数据趋势 */ .trend-chart-container { margin-bottom: 1rem; background: rgba(15, 20, 25, 0.6); border-radius: 8px; padding: 1rem; border: 1px solid rgba(0, 212, 255, 0.2); } .trend-legend { display: flex; justify-content: space-around; gap: 0.5rem; } .trend-legend .legend-item { display: flex; align-items: center; gap: 0.3rem; font-size: 0.7rem; color: #b0c4de; } .legend-dot { width: 8px; height: 8px; border-radius: 50%; } .legend-dot.red { background: #e74c3c; } .legend-dot.blue { background: #3498db; } .legend-dot.green { background: #2ecc71; } /* 工单系统 */ .workorder-layout { background: rgba(255, 255, 255, 0.95); border-radius: 15px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); overflow: hidden; } .workorder-header { display: flex; justify-content: space-between; align-items: center; padding: 1.2rem 1.5rem; background: linear-gradient(135deg, #3498db, #2980b9); color: white; } .workorder-header h3 { display: flex; align-items: center; gap: 0.5rem; margin: 0; } .workorder-actions { display: flex; gap: 1rem; } .btn { padding: 0.8rem 1.5rem; border: none; border-radius: 8px; cursor: pointer; font-size: 0.9rem; transition: all 0.3s ease; display: flex; align-items: center; gap: 0.5rem; } .btn-primary { background: linear-gradient(135deg, #2ecc71, #27ae60); color: white; } .btn-secondary { background: rgba(255, 255, 255, 0.2); color: white; border: 1px solid rgba(255, 255, 255, 0.3); } .btn:hover { transform: translateY(-2px); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } /* 工单统计 */ .workorder-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; padding: 1.5rem; background: linear-gradient(135deg, rgba(15, 20, 25, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%); } .stat-card { display: flex; align-items: center; gap: 1rem; padding: 1.2rem; background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 12px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); transition: all 0.3s ease; border: 1px solid rgba(0, 212, 255, 0.3); backdrop-filter: blur(10px); } .stat-card:hover { transform: translateY(-5px); } .stat-icon { width: 60px; height: 60px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.5rem; } .stat-icon.pending { background: linear-gradient(135deg, #f39c12, #e67e22); } .stat-icon.processing { background: linear-gradient(135deg, #3498db, #2980b9); } .stat-icon.completed { background: linear-gradient(135deg, #2ecc71, #27ae60); } .stat-icon.rate { background: linear-gradient(135deg, #9b59b6, #8e44ad); } .stat-info { display: flex; flex-direction: column; } .stat-number { font-size: 1.8rem; font-weight: 600; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } .stat-label { font-size: 0.85rem; color: #b0c4de; } /* 工单表格 */ .workorder-table { padding: 0 2rem 2rem; } .table-header { margin-bottom: 1.5rem; } .filter-bar { display: flex; gap: 1rem; align-items: center; } .filter-select, .search-input { padding: 0.8rem 1rem; border: 1px solid #ddd; border-radius: 8px; font-size: 0.9rem; transition: border-color 0.3s ease; } .filter-select:focus, .search-input:focus { outline: none; border-color: #4a90e2; } .search-input { flex: 1; max-width: 300px; } .workorder-list { width: 100%; border-collapse: collapse; background: rgba(26, 35, 50, 0.8); border-radius: 8px; overflow: hidden; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); border: 1px solid rgba(0, 212, 255, 0.2); } .workorder-list th, .workorder-list td { padding: 0.8rem; text-align: left; border-bottom: 1px solid rgba(0, 212, 255, 0.2); } .workorder-list th { background: linear-gradient(135deg, rgba(30, 60, 114, 0.9), rgba(42, 82, 152, 0.9)); font-weight: 600; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } .workorder-list td { color: #e0e6ed; } .workorder-list tr:hover { background: rgba(0, 212, 255, 0.1); } /* 设备管理 */ .device-layout { background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); overflow: hidden; border: 1px solid rgba(0, 212, 255, 0.3); backdrop-filter: blur(15px); } .device-header { display: flex; justify-content: space-between; align-items: center; padding: 1.2rem 1.5rem; background: linear-gradient(135deg, #1e3c72, #2a5298); color: white; border-bottom: 2px solid rgba(0, 212, 255, 0.4); } .device-categories { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0.8rem; padding: 1.5rem; background: linear-gradient(135deg, rgba(15, 20, 25, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%); } .category-card { display: flex; align-items: center; gap: 0.8rem; padding: 1rem; background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 12px; cursor: pointer; transition: all 0.3s ease; border: 1px solid rgba(0, 212, 255, 0.3); backdrop-filter: blur(10px); color: #e0e6ed; } .category-card:hover { transform: translateY(-3px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); } .category-card.active { border-color: rgba(0, 212, 255, 0.8); background: linear-gradient(135deg, #1e3c72, #2a5298); color: white; box-shadow: 0 4px 16px rgba(0, 212, 255, 0.3); } .category-icon { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: rgba(0, 212, 255, 0.2); color: #00d4ff; font-size: 1rem; } .category-card.active .category-icon { background: rgba(255, 255, 255, 0.2); color: white; } .category-info { display: flex; flex-direction: column; } .category-name { font-weight: 600; margin-bottom: 0.2rem; color: #2c3e50; } .category-count { font-size: 0.8rem; opacity: 0.7; color: #7f8c8d; } .device-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1.5rem; padding: 2rem; } /* 预警系统 */ .warning-layout { background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); overflow: hidden; border: 1px solid rgba(0, 212, 255, 0.3); } .warning-header { display: flex; justify-content: space-between; align-items: center; padding: 1.5rem 2rem; background: linear-gradient(135deg, #e74c3c, #c0392b); color: white; } .warning-actions { display: flex; align-items: center; gap: 1rem; } .warning-overview { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; padding: 1.5rem; background: linear-gradient(135deg, rgba(15, 20, 25, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%); } .warning-card { display: flex; align-items: center; gap: 0.8rem; padding: 1.2rem; background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 12px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); transition: all 0.3s ease; border: 1px solid rgba(0, 212, 255, 0.3); } .warning-card:hover { transform: translateY(-5px); } .warning-icon { width: 50px; height: 50px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.2rem; } .warning-card.critical .warning-icon { background: linear-gradient(135deg, #e74c3c, #c0392b); } .warning-card.high .warning-icon { background: linear-gradient(135deg, #f39c12, #e67e22); } .warning-card.medium .warning-icon { background: linear-gradient(135deg, #f1c40f, #f39c12); } .warning-card.low .warning-icon { background: linear-gradient(135deg, #3498db, #2980b9); } .warning-info { display: flex; flex-direction: column; } .warning-number { font-size: 1.8rem; font-weight: 600; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } .warning-label { font-size: 0.85rem; color: #b0c4de; } .warning-types { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; padding: 1.5rem; } .warning-type-card { background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 12px; padding: 1.2rem; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); border: 1px solid rgba(0, 212, 255, 0.3); backdrop-filter: blur(10px); } .warning-type-card h4 { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1rem; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } /* 统计分析 */ .statistics-layout { background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); overflow: hidden; border: 1px solid rgba(0, 212, 255, 0.3); backdrop-filter: blur(15px); } .statistics-header { display: flex; justify-content: space-between; align-items: center; padding: 1.5rem 2rem; background: linear-gradient(135deg, #9b59b6, #8e44ad); color: white; } .statistics-actions { display: flex; align-items: center; gap: 1rem; } .time-range { padding: 0.5rem 1rem; border: 1px solid rgba(255, 255, 255, 0.3); background: rgba(255, 255, 255, 0.1); color: white; border-radius: 6px; margin-right: 1rem; } .kpi-cards { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; padding: 1.5rem; background: linear-gradient(135deg, rgba(15, 20, 25, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%); } .kpi-card { display: flex; align-items: center; gap: 0.8rem; padding: 1.2rem; background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 12px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); transition: all 0.3s ease; border: 1px solid rgba(0, 212, 255, 0.3); backdrop-filter: blur(10px); } .kpi-card:hover { transform: translateY(-5px); } .kpi-icon { width: 50px; height: 50px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #9b59b6, #8e44ad); color: white; font-size: 1.2rem; } .kpi-info { display: flex; flex-direction: column; } .kpi-number { font-size: 1.8rem; font-weight: 600; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } .kpi-label { font-size: 0.85rem; color: #b0c4de; margin-bottom: 0.2rem; } .kpi-trend { font-size: 0.8rem; font-weight: 600; } .kpi-trend.up { color: #2ecc71; } .kpi-trend.down { color: #e74c3c; } .charts-container { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; padding: 1.5rem; } .chart-card { background: white; border-radius: 8px; padding: 1.5rem; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .chart-placeholder { height: 280px; background: rgba(15, 20, 25, 0.6); border-radius: 8px; border: 1px solid rgba(0, 212, 255, 0.2); display: flex; align-items: center; justify-content: center; color: #7f8c8d; } /* 模态框 */ .modal { display: none; position: fixed; z-index: 2000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); backdrop-filter: blur(5px); } .modal-content { background-color: white; margin: 5% auto; padding: 2rem; border-radius: 15px; width: 80%; max-width: 800px; position: relative; animation: slideIn 0.3s ease; } .close { position: absolute; right: 1rem; top: 1rem; font-size: 2rem; cursor: pointer; color: #aaa; transition: color 0.3s ease; } .close:hover { color: #333; } /* 动画 */ @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideIn { from { transform: translateY(-50px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } /* 设备管理样式 */ .device-categories { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-bottom: 2rem; } .category-card { background: white; border-radius: 8px; padding: 1.5rem; text-align: center; cursor: pointer; transition: all 0.3s ease; border: 2px solid transparent; } .category-card:hover { transform: translateY(-2px); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } .category-card.active { border-color: #4a90e2; background: #f8fbff; } .category-icon { font-size: 2rem; color: #4a90e2; margin-bottom: 0.5rem; } .category-name { font-weight: 600; margin-bottom: 0.25rem; } .category-count { color: #666; font-size: 0.875rem; } .device-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1.5rem; } .device-card { background: linear-gradient(135deg, rgba(30, 60, 114, 0.9) 0%, rgba(42, 82, 152, 0.7) 100%); border-radius: 10px; padding: 1.2rem; box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4); transition: all 0.3s ease; border: 1px solid rgba(0, 212, 255, 0.3); backdrop-filter: blur(15px); position: relative; overflow: hidden; } .device-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, #00d4ff, #0099cc); } .device-card:hover { transform: translateY(-3px); box-shadow: 0 10px 40px rgba(0, 212, 255, 0.2); border-color: rgba(0, 212, 255, 0.5); } .device-header { display: flex; align-items: center; margin-bottom: 1rem; } .device-icon { width: 40px; height: 40px; background: #f0f8ff; border-radius: 8px; display: flex; align-items: center; justify-content: center; margin-right: 1rem; } .device-icon i { font-size: 1.25rem; color: #4a90e2; } .device-info { flex: 1; } .device-info h4 { margin: 0 0 0.25rem 0; font-size: 1rem; font-weight: 600; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } .device-model { color: #b0c4de; font-size: 0.875rem; opacity: 0.9; } .device-status { display: flex; align-items: center; gap: 0.5rem; } .status-indicator { width: 10px; height: 10px; border-radius: 50%; display: inline-block; animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(1.1); } } .status-indicator.online { background: #00ff88; box-shadow: 0 0 15px rgba(0, 255, 136, 0.6); } .status-indicator.offline { background: #ff4757; box-shadow: 0 0 15px rgba(255, 71, 87, 0.6); } .status-indicator.warning { background: #ffa502; box-shadow: 0 0 15px rgba(255, 165, 2, 0.6); } .status-indicator.working { background: #00d4ff; box-shadow: 0 0 15px rgba(0, 212, 255, 0.6); } .status-indicator.idle { background: #a4b0be; box-shadow: 0 0 15px rgba(164, 176, 190, 0.6); } .status-indicator.flying { background: #c44569; box-shadow: 0 0 15px rgba(196, 69, 105, 0.6); } .status-indicator.charging { background: #f1c40f; } .status-text { font-size: 0.875rem; color: #666; } .device-body { margin-bottom: 1rem; } .device-detail { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.75rem; } .detail-label { font-size: 0.875rem; color: #b0c4de; } .detail-value { font-size: 0.875rem; font-weight: 500; color: #ffffff; } .progress { width: 60px; height: 4px; background: #e9ecef; border-radius: 2px; overflow: hidden; margin-left: 0.5rem; } .progress-bar { height: 100%; background: linear-gradient(90deg, #2ecc71, #27ae60); transition: width 0.3s ease; } .device-actions { display: flex; align-items: center; gap: 1rem; } .device-actions .btn { flex: 1; padding: 0.5rem; font-size: 0.875rem; } /* 预警系统样式 */ .warning-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem; margin-bottom: 2rem; } .warning-card { background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%); border-radius: 8px; padding: 1.5rem; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); border: 1px solid rgba(0, 212, 255, 0.3); } .warning-card h3 { margin: 0 0 1rem 0; font-size: 1.125rem; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } .weather-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; } .weather-item { text-align: center; padding: 1rem; background: rgba(15, 20, 25, 0.6); border-radius: 6px; border: 1px solid rgba(0, 212, 255, 0.2); } .weather-label { font-size: 0.875rem; color: #b0c4de; margin-bottom: 0.5rem; } .weather-value { font-size: 1.125rem; font-weight: 600; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } .alert-list { max-height: 300px; overflow-y: auto; } .alert-item { display: flex; align-items: center; padding: 0.75rem; border-left: 4px solid #e74c3c; background: #fff5f5; border-radius: 4px; margin-bottom: 0.75rem; } .alert-item.medium { border-left-color: #f39c12; background: #fffbf0; } .alert-item.low { border-left-color: #f1c40f; background: #fffef0; } .alert-icon { margin-right: 0.75rem; font-size: 1.125rem; } .alert-content { flex: 1; } .alert-title { font-weight: 600; margin-bottom: 0.25rem; } .alert-time { font-size: 0.875rem; color: #666; } /* 统计分析样式 */ .stats-overview { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-bottom: 30px; background-image: url('images/chart-bg.svg'); background-size: cover; background-position: center; background-repeat: no-repeat; padding: 20px; border-radius: 8px; } .stat-card { background: white; border-radius: 8px; padding: 1.5rem; text-align: center; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .stat-value { font-size: 2rem; font-weight: 700; color: #4a90e2; margin-bottom: 0.5rem; } .stat-label { color: #666; font-size: 0.875rem; } .charts-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 1.5rem; } .chart-card { background: white; border-radius: 8px; padding: 1.5rem; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .chart-card h3, .chart-card h4 { margin: 0 0 1rem 0; font-size: 1.125rem; color: #333; font-weight: 600; } .chart-container { position: relative; height: 300px; } /* 响应式设计 */ @media (max-width: 1200px) { .monitor-layout { grid-template-columns: 1fr; grid-template-rows: 1fr auto; } .info-panel { max-height: 400px; } .device-categories { grid-template-columns: repeat(3, 1fr); } .charts-container { grid-template-columns: 1fr; } .charts-grid { grid-template-columns: 1fr; } .modal-content { width: 95%; margin: 2% auto; } .schedule-item { grid-template-columns: 1fr; gap: 0.5rem; text-align: center; } .history-item { grid-template-columns: 1fr; gap: 0.5rem; text-align: left; } } /* 模态框样式 */ .modal { display: none; position: fixed; z-index: 2000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); animation: fadeIn 0.3s ease; } .modal-content { background-color: white; margin: 5% auto; padding: 0; border-radius: 8px; width: 90%; max-width: 600px; max-height: 80vh; overflow-y: auto; animation: slideIn 0.3s ease; } .modal-header { padding: 1.5rem; border-bottom: 1px solid #e9ecef; display: flex; justify-content: space-between; align-items: center; } .modal-header h2 { margin: 0; font-size: 1.25rem; } .close { background: none; border: none; font-size: 1.5rem; cursor: pointer; color: #666; padding: 0; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 4px; transition: all 0.2s ease; } .close:hover { background: #f8f9fa; color: #333; } .modal-body { padding: 1.5rem; } .form-group { margin-bottom: 1rem; } .form-group label { display: block; margin-bottom: 0.5rem; font-weight: 500; color: #333; } .form-group input, .form-group select, .form-group textarea { width: 100%; padding: 0.75rem; border: 1px solid #ddd; border-radius: 4px; font-size: 0.875rem; transition: border-color 0.2s ease; box-sizing: border-box; } .form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; border-color: #4a90e2; box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1); } .form-actions { display: flex; gap: 0.75rem; justify-content: flex-end; margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid #e9ecef; } .workorder-details, .device-details { display: grid; gap: 1rem; } .detail-item { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem; background: #f8f9fa; border-radius: 4px; } .detail-item label { font-weight: 500; color: #333; margin: 0; } .detail-item span { color: #666; } /* 通知样式 */ @keyframes slideInRight { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideIn { from { transform: translateY(-50px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .notification { animation: slideInRight 0.3s ease; } .notification-content { display: flex; align-items: center; gap: 0.75rem; } .notification-close { background: none; border: none; cursor: pointer; color: #666; padding: 0.25rem; border-radius: 4px; transition: background 0.2s ease; } .notification-close:hover { background: rgba(0, 0, 0, 0.1); } /* 自定义地图标记样式 */ .custom-marker { background: white; border-radius: 50%; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); display: flex; align-items: center; justify-content: center; border: 2px solid white; } .camera-marker { background: #f0f8ff; } .ship-marker { background: #f0fff0; } .drone-marker { background: #fff0f5; } .garbage-marker { background: #fff8dc; } /* 维护计划样式 */ .maintenance-schedule { max-height: 400px; overflow-y: auto; } .schedule-item { display: grid; grid-template-columns: 100px 1fr 100px 80px; gap: 1rem; align-items: center; padding: 1rem; border: 1px solid #e9ecef; border-radius: 6px; margin-bottom: 0.75rem; } .schedule-date { font-weight: 500; color: #333; } .schedule-device { color: #666; } .schedule-type { font-size: 0.875rem; color: #666; } .schedule-status { padding: 0.25rem 0.5rem; border-radius: 12px; font-size: 0.75rem; text-align: center; font-weight: 500; } .schedule-status.pending { background: #fff3cd; color: #856404; } .schedule-status.processing { background: #cce5ff; color: #004085; } .schedule-status.completed { background: #d4edda; color: #155724; } /* 预警历史样式 */ .warning-history { max-height: 400px; overflow-y: auto; } .history-item { display: grid; grid-template-columns: 120px 80px 1fr 80px; gap: 1rem; align-items: center; padding: 1rem; border-radius: 6px; margin-bottom: 0.75rem; } .history-item.critical { background: #fff5f5; border-left: 4px solid #e74c3c; } .history-item.high { background: #fffbf0; border-left: 4px solid #f39c12; } .history-item.medium { background: #fffef0; border-left: 4px solid #f1c40f; } .history-time { font-size: 0.875rem; color: #666; } .history-type { font-size: 0.875rem; font-weight: 500; color: #333; } .history-message { color: #666; } .history-status { padding: 0.25rem 0.5rem; border-radius: 12px; font-size: 0.75rem; text-align: center; font-weight: 500; } .history-status.resolved { background: #d4edda; color: #155724; } .history-status.pending { background: #fff3cd; color: #856404; } /* 设置部分样式 */ .settings-section { margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 1px solid #e9ecef; } .settings-section:last-child { border-bottom: none; margin-bottom: 0; } .settings-section h4 { margin: 0 0 1rem 0; color: #333; font-size: 1rem; } @media (max-width: 768px) { .header-content { flex-direction: column; height: auto; padding: 1rem; } .nav-menu { flex-wrap: wrap; justify-content: center; } .main-content { margin-top: 120px; padding: 1rem; } .workorder-stats, .warning-overview, .kpi-cards { grid-template-columns: repeat(2, 1fr); } .device-categories { grid-template-columns: 1fr; } .warning-types { grid-template-columns: 1fr; } .device-grid { grid-template-columns: 1fr; } .warning-grid { grid-template-columns: 1fr; } .charts-grid { grid-template-columns: 1fr; } } @media (max-width: 480px) { .workorder-stats, .warning-overview, .kpi-cards { grid-template-columns: 1fr; } .status-grid { grid-template-columns: 1fr; } .video-grid { grid-template-columns: 1fr; } } /* 滚动条样式 */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; } ::-webkit-scrollbar-thumb { background: linear-gradient(135deg, #4a90e2, #357abd); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: linear-gradient(135deg, #357abd, #2c5aa0); } /* 工具提示 */ .tooltip { position: relative; cursor: help; } .tooltip::after { content: attr(data-tooltip); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.8); color: white; padding: 0.5rem; border-radius: 4px; font-size: 0.8rem; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; z-index: 1000; } .tooltip:hover::after { opacity: 1; } /* 加载动画 */ .loading { display: inline-block; width: 20px; height: 20px; border: 3px solid rgba(74, 144, 226, 0.3); border-radius: 50%; border-top-color: #4a90e2; animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* 状态指示器 */ .status-indicator { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 0.5rem; } .status-indicator.online { background: #2ecc71; } .status-indicator.offline { background: #e74c3c; } .status-indicator.warning { background: #f39c12; } /* 徽章 */ .badge { display: inline-block; padding: 0.3rem 0.6rem; font-size: 0.7rem; font-weight: 600; border-radius: 12px; text-transform: uppercase; } .badge.success { background: #2ecc71; color: white; } .badge.warning { background: #f39c12; color: white; } .badge.danger { background: #e74c3c; color: white; } .badge.info { background: #3498db; color: white; } /* 进度条 */ .progress { width: 100%; height: 8px; background: #ecf0f1; border-radius: 4px; overflow: hidden; } .progress-bar { height: 100%; background: linear-gradient(135deg, #4a90e2, #357abd); border-radius: 4px; transition: width 0.3s ease; } /* 卡片悬停效果 */ .card-hover { transition: all 0.3s ease; } .card-hover:hover { transform: translateY(-3px); box-shadow: 0 10px 40px rgba(0, 212, 255, 0.2); border-color: rgba(0, 212, 255, 0.5); } /* 通用卡片样式 */ .card { background: linear-gradient(135deg, rgba(30, 60, 114, 0.8) 0%, rgba(42, 82, 152, 0.6) 100%); border-radius: 10px; padding: 18px; box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4); transition: all 0.3s ease; border: 1px solid rgba(0, 212, 255, 0.3); backdrop-filter: blur(15px); position: relative; overflow: hidden; } .card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, #00d4ff, #0099cc, #00d4ff); background-size: 200% 100%; animation: gradientMove 3s ease-in-out infinite; } @keyframes gradientMove { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } } .overview-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 15px; margin-bottom: 25px; } /* 渐变文字 */ .gradient-text { background: linear-gradient(135deg, #4a90e2, #357abd); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; font-weight: 600; } /* 玻璃态效果 */ .glass { background: rgba(255, 255, 255, 0.1); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.2); } /* 阴影效果 */ .shadow-sm { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .shadow-md { box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } .shadow-lg { box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); } .shadow-xl { box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2); } /* 边框效果 */ .border-gradient { border: 2px solid; border-image: linear-gradient(135deg, #4a90e2, #357abd) 1; } /* 文字效果 */ .text-shadow { text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } /* 过渡效果 */ .transition-all { transition: all 0.3s ease; } .transition-transform { transition: transform 0.3s ease; } .transition-opacity { transition: opacity 0.3s ease; } /* 隐藏/显示 */ .hidden { display: none !important; } .invisible { opacity: 0; } .visible { opacity: 1; } /* 文本对齐 */ .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; } /* 弹性布局 */ .flex { display: flex; } .flex-col { flex-direction: column; } .flex-row { flex-direction: row; } .items-center { align-items: center; } .justify-center { justify-content: center; } .justify-between { justify-content: space-between; } .flex-1 { flex: 1; } /* 间距 */ .gap-1 { gap: 0.25rem; } .gap-2 { gap: 0.5rem; } .gap-3 { gap: 0.75rem; } .gap-4 { gap: 1rem; } .gap-5 { gap: 1.25rem; } .gap-6 { gap: 1.5rem; } /* 内边距 */ .p-1 { padding: 0.25rem; } .p-2 { padding: 0.5rem; } .p-3 { padding: 0.75rem; } .p-4 { padding: 1rem; } .p-5 { padding: 1.25rem; } .p-6 { padding: 1.5rem; } /* 外边距 */ .m-1 { margin: 0.25rem; } .m-2 { margin: 0.5rem; } .m-3 { margin: 0.75rem; } .m-4 { margin: 1rem; } .m-5 { margin: 1.25rem; } .m-6 { margin: 1.5rem; } /* 圆角 */ .rounded-sm { border-radius: 4px; } .rounded { border-radius: 8px; } .rounded-lg { border-radius: 12px; } .rounded-xl { border-radius: 16px; } .rounded-full { border-radius: 50%; } /* 宽度 */ .w-full { width: 100%; } .w-1\/2 { width: 50%; } .w-1\/3 { width: 33.333333%; } .w-2\/3 { width: 66.666667%; } .w-1\/4 { width: 25%; } .w-3\/4 { width: 75%; } /* 高度 */ .h-full { height: 100%; } .h-screen { height: 100vh; } .h-auto { height: auto; } /* 字体大小 */ .text-xs { font-size: 0.75rem; } .text-sm { font-size: 0.875rem; } .text-base { font-size: 1rem; } .text-lg { font-size: 1.125rem; } .text-xl { font-size: 1.25rem; } .text-2xl { font-size: 1.5rem; } .text-3xl { font-size: 1.875rem; } /* 字体粗细 */ .font-light { font-weight: 300; } .font-normal { font-weight: 400; } .font-medium { font-weight: 500; } .font-semibold { font-weight: 600; } .font-bold { font-weight: 700; } /* 颜色 */ .text-primary { color: #4a90e2; } .text-secondary { color: #7f8c8d; } .text-success { color: #2ecc71; } .text-warning { color: #f39c12; } .text-danger { color: #e74c3c; } .text-info { color: #3498db; } .text-dark { color: #2c3e50; } .text-light { color: #ecf0f1; } /* 背景颜色 */ .bg-primary { background-color: #4a90e2; } .bg-secondary { background-color: #7f8c8d; } .bg-success { background-color: #2ecc71; } .bg-warning { background-color: #f39c12; } .bg-danger { background-color: #e74c3c; } .bg-info { background-color: #3498db; } .bg-dark { background-color: #2c3e50; } .bg-light { background-color: #ecf0f1; } .bg-white { background-color: white; } .bg-transparent { background-color: transparent; } /* 位置 */ .relative { position: relative; } .absolute { position: absolute; } .fixed { position: fixed; } .sticky { position: sticky; } /* 层级 */ .z-10 { z-index: 10; } .z-20 { z-index: 20; } .z-30 { z-index: 30; } .z-40 { z-index: 40; } .z-50 { z-index: 50; } /* 溢出 */ .overflow-hidden { overflow: hidden; } .overflow-auto { overflow: auto; } .overflow-scroll { overflow: scroll; } /* 显示 */ .block { display: block; } .inline { display: inline; } .inline-block { display: inline-block; } .grid { display: grid; } /* 光标 */ .cursor-pointer { cursor: pointer; } .cursor-default { cursor: default; } .cursor-not-allowed { cursor: not-allowed; } /* 选择 */ .select-none { user-select: none; } .select-text { user-select: text; } .select-all { user-select: all; } /* 指针事件 */ .pointer-events-none { pointer-events: none; } .pointer-events-auto { pointer-events: auto; } /* 变换 */ .transform { transform: translateZ(0); } .scale-95 { transform: scale(0.95); } .scale-100 { transform: scale(1); } .scale-105 { transform: scale(1.05); } .scale-110 { transform: scale(1.1); } /* 旋转 */ .rotate-0 { transform: rotate(0deg); } .rotate-45 { transform: rotate(45deg); } .rotate-90 { transform: rotate(90deg); } .rotate-180 { transform: rotate(180deg); } /* 透明度 */ .opacity-0 { opacity: 0; } .opacity-25 { opacity: 0.25; } .opacity-50 { opacity: 0.5; } .opacity-75 { opacity: 0.75; } .opacity-100 { opacity: 1; } /* 阴影 */ .drop-shadow-sm { filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.05)); } .drop-shadow { filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.1)); } .drop-shadow-md { filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.1)); } .drop-shadow-lg { filter: drop-shadow(0 10px 15px rgba(0, 0, 0, 0.1)); } .drop-shadow-xl { filter: drop-shadow(0 20px 25px rgba(0, 0, 0, 0.1)); } /* 模糊 */ .blur-none { filter: blur(0); } .blur-sm { filter: blur(4px); } .blur { filter: blur(8px); } .blur-md { filter: blur(12px); } .blur-lg { filter: blur(16px); } .blur-xl { filter: blur(24px); } /* 亮度 */ .brightness-50 { filter: brightness(0.5); } .brightness-75 { filter: brightness(0.75); } .brightness-100 { filter: brightness(1); } .brightness-125 { filter: brightness(1.25); } .brightness-150 { filter: brightness(1.5); } /* 对比度 */ .contrast-50 { filter: contrast(0.5); } .contrast-75 { filter: contrast(0.75); } .contrast-100 { filter: contrast(1); } .contrast-125 { filter: contrast(1.25); } .contrast-150 { filter: contrast(1.5); } /* 饱和度 */ .saturate-0 { filter: saturate(0); } .saturate-50 { filter: saturate(0.5); } .saturate-100 { filter: saturate(1); } .saturate-150 { filter: saturate(1.5); } .saturate-200 { filter: saturate(2); } /* 色调 */ .hue-rotate-0 { filter: hue-rotate(0deg); } .hue-rotate-15 { filter: hue-rotate(15deg); } .hue-rotate-30 { filter: hue-rotate(30deg); } .hue-rotate-60 { filter: hue-rotate(60deg); } .hue-rotate-90 { filter: hue-rotate(90deg); } .hue-rotate-180 { filter: hue-rotate(180deg); } /* 反转 */ .invert-0 { filter: invert(0); } .invert { filter: invert(1); } /* 深褐色 */ .sepia-0 { filter: sepia(0); } .sepia { filter: sepia(1); } /* 灰度 */ .grayscale-0 { filter: grayscale(0); } .grayscale { filter: grayscale(1); } /* 背景混合模式 */ .bg-blend-normal { background-blend-mode: normal; } .bg-blend-multiply { background-blend-mode: multiply; } .bg-blend-screen { background-blend-mode: screen; } .bg-blend-overlay { background-blend-mode: overlay; } .bg-blend-darken { background-blend-mode: darken; } .bg-blend-lighten { background-blend-mode: lighten; } .bg-blend-color-dodge { background-blend-mode: color-dodge; } .bg-blend-color-burn { background-blend-mode: color-burn; } .bg-blend-hard-light { background-blend-mode: hard-light; } .bg-blend-soft-light { background-blend-mode: soft-light; } .bg-blend-difference { background-blend-mode: difference; } .bg-blend-exclusion { background-blend-mode: exclusion; } .bg-blend-hue { background-blend-mode: hue; } .bg-blend-saturation { background-blend-mode: saturation; } .bg-blend-color { background-blend-mode: color; } .bg-blend-luminosity { background-blend-mode: luminosity; } /* 混合模式 */ .mix-blend-normal { mix-blend-mode: normal; } .mix-blend-multiply { mix-blend-mode: multiply; } .mix-blend-screen { mix-blend-mode: screen; } .mix-blend-overlay { mix-blend-mode: overlay; } .mix-blend-darken { mix-blend-mode: darken; } .mix-blend-lighten { mix-blend-mode: lighten; } .mix-blend-color-dodge { mix-blend-mode: color-dodge; } .mix-blend-color-burn { mix-blend-mode: color-burn; } .mix-blend-hard-light { mix-blend-mode: hard-light; } .mix-blend-soft-light { mix-blend-mode: soft-light; } .mix-blend-difference { mix-blend-mode: difference; } .mix-blend-exclusion { mix-blend-mode: exclusion; } .mix-blend-hue { mix-blend-mode: hue; } .mix-blend-saturation { mix-blend-mode: saturation; } .mix-blend-color { mix-blend-mode: color; } .mix-blend-luminosity { mix-blend-mode: luminosity; } /* 自定义滚动条 */ .custom-scrollbar::-webkit-scrollbar { width: 6px; height: 6px; } .custom-scrollbar::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 3px; } .custom-scrollbar::-webkit-scrollbar-thumb { background: linear-gradient(135deg, #4a90e2, #357abd); border-radius: 3px; } .custom-scrollbar::-webkit-scrollbar-thumb:hover { background: linear-gradient(135deg, #357abd, #2c5aa0); } /* 自定义选择框 */ .custom-select { position: relative; display: inline-block; } .custom-select select { appearance: none; -webkit-appearance: none; -moz-appearance: none; background: white; border: 1px solid #ddd; border-radius: 8px; padding: 0.8rem 2.5rem 0.8rem 1rem; font-size: 0.9rem; cursor: pointer; transition: border-color 0.3s ease; } .custom-select::after { content: '▼'; position: absolute; right: 1rem; top: 50%; transform: translateY(-50%); pointer-events: none; color: #666; font-size: 0.8rem; } .custom-select select:focus { outline: none; border-color: #4a90e2; } /* 自定义复选框 */ .custom-checkbox { position: relative; display: inline-block; cursor: pointer; } .custom-checkbox input[type="checkbox"] { opacity: 0; position: absolute; left: 0; top: 0; width: 100%; height: 100%; cursor: pointer; } .custom-checkbox .checkmark { display: inline-block; width: 20px; height: 20px; border: 2px solid #ddd; border-radius: 4px; position: relative; transition: all 0.3s ease; } .custom-checkbox input[type="checkbox"]:checked + .checkmark { background: linear-gradient(135deg, #4a90e2, #357abd); border-color: #4a90e2; } .custom-checkbox input[type="checkbox"]:checked + .checkmark::after { content: '✓'; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold; } /* 自定义单选框 */ .custom-radio { position: relative; display: inline-block; cursor: pointer; } .custom-radio input[type="radio"] { opacity: 0; position: absolute; left: 0; top: 0; width: 100%; height: 100%; cursor: pointer; } .custom-radio .radiomark { display: inline-block; width: 20px; height: 20px; border: 2px solid #ddd; border-radius: 50%; position: relative; transition: all 0.3s ease; } .custom-radio input[type="radio"]:checked + .radiomark { border-color: #4a90e2; } .custom-radio input[type="radio"]:checked + .radiomark::after { content: ''; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 10px; height: 10px; background: linear-gradient(135deg, #4a90e2, #357abd); border-radius: 50%; } /* 自定义开关 */ .custom-switch { position: relative; display: inline-block; width: 50px; height: 24px; } .custom-switch input[type="checkbox"] { opacity: 0; width: 0; height: 0; } .custom-switch .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: 0.3s; border-radius: 24px; } .custom-switch .slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: 0.3s; border-radius: 50%; } .custom-switch input:checked + .slider { background: linear-gradient(135deg, #4a90e2, #357abd); } .custom-switch input:checked + .slider:before { transform: translateX(26px); } /* 自定义范围滑块 */ .custom-range { -webkit-appearance: none; appearance: none; width: 100%; height: 6px; border-radius: 3px; background: #ddd; outline: none; transition: background 0.3s ease; } .custom-range::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; border-radius: 50%; background: linear-gradient(135deg, #4a90e2, #357abd); cursor: pointer; transition: all 0.3s ease; } .custom-range::-webkit-slider-thumb:hover { transform: scale(1.2); } .custom-range::-moz-range-thumb { width: 20px; height: 20px; border-radius: 50%; background: linear-gradient(135deg, #4a90e2, #357abd); cursor: pointer; border: none; transition: all 0.3s ease; } .custom-range::-moz-range-thumb:hover { transform: scale(1.2); } /* 自定义文件上传 */ .custom-file-upload { position: relative; display: inline-block; cursor: pointer; padding: 0.8rem 1.5rem; background: linear-gradient(135deg, #4a90e2, #357abd); color: white; border-radius: 8px; transition: all 0.3s ease; border: none; font-size: 0.9rem; } .custom-file-upload:hover { transform: translateY(-2px); box-shadow: 0 4px 15px rgba(74, 144, 226, 0.3); } .custom-file-upload input[type="file"] { position: absolute; left: -9999px; } /* 自定义标签 */ .custom-tag { display: inline-block; padding: 0.3rem 0.8rem; background: rgba(74, 144, 226, 0.1); color: #4a90e2; border-radius: 15px; font-size: 0.8rem; font-weight: 500; margin: 0.2rem; transition: all 0.3s ease; } .custom-tag:hover { background: rgba(74, 144, 226, 0.2); transform: translateY(-1px); } .custom-tag.removable { padding-right: 2rem; position: relative; } .custom-tag.removable::after { content: '×'; position: absolute; right: 0.5rem; top: 50%; transform: translateY(-50%); cursor: pointer; font-weight: bold; opacity: 0.7; transition: opacity 0.3s ease; } .custom-tag.removable:hover::after { opacity: 1; } /* 自定义分页 */ .custom-pagination { display: flex; align-items: center; gap: 0.5rem; justify-content: center; margin: 2rem 0; } .custom-pagination .page-item { padding: 0.5rem 0.8rem; border: 1px solid #ddd; background: white; color: #666; border-radius: 6px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9rem; } .custom-pagination .page-item:hover { background: #f8f9fa; border-color: #4a90e2; color: #4a90e2; } .custom-pagination .page-item.active { background: linear-gradient(135deg, #4a90e2, #357abd); border-color: #4a90e2; color: white; } .custom-pagination .page-item.disabled { opacity: 0.5; cursor: not-allowed; pointer-events: none; } /* 大屏模式动画效果 */ @keyframes titleGlow { 0%, 100% { text-shadow: 0 0 10px rgba(0, 212, 255, 0.8), 0 0 20px rgba(0, 212, 255, 0.6), 0 0 30px rgba(0, 212, 255, 0.4); } 50% { text-shadow: 0 0 20px rgba(0, 212, 255, 1), 0 0 30px rgba(0, 212, 255, 0.8), 0 0 40px rgba(0, 212, 255, 0.6); } } @keyframes mapScan { 0% { transform: translateX(-100%); } 100% { transform: translateX(100vw); } } @keyframes legendPulse { 0%, 100% { box-shadow: 0 0 5px rgba(0, 212, 255, 0.5); } 50% { box-shadow: 0 0 15px rgba(0, 212, 255, 0.8), 0 0 25px rgba(0, 212, 255, 0.4); } } @keyframes iconGlow { 0%, 100% { text-shadow: 0 0 10px rgba(0, 212, 255, 0.8); } 50% { text-shadow: 0 0 20px rgba(0, 212, 255, 1), 0 0 30px rgba(0, 212, 255, 0.6); } } @keyframes statusPulse { 0%, 100% { box-shadow: 0 4px 20px rgba(0, 212, 255, 0.3); } 50% { box-shadow: 0 6px 30px rgba(0, 212, 255, 0.6), 0 0 20px rgba(0, 212, 255, 0.4); } } @keyframes videoScan { 0% { transform: translateY(-100%); opacity: 0.3; } 50% { opacity: 0.8; } 100% { transform: translateY(100%); opacity: 0.3; } } @keyframes videoIconPulse { 0%, 100% { transform: scale(1); filter: drop-shadow(0 0 10px rgba(0, 212, 255, 0.6)); } 50% { transform: scale(1.1); filter: drop-shadow(0 0 20px rgba(0, 212, 255, 0.9)); } } @keyframes dataFlow { 0% { transform: translateX(-100%) scaleX(0); } 50% { transform: translateX(0) scaleX(1); } 100% { transform: translateX(100%) scaleX(0); } } @keyframes borderScan { 0% { border-color: rgba(0, 212, 255, 0.3); } 50% { border-color: rgba(0, 212, 255, 1); } 100% { border-color: rgba(0, 212, 255, 0.3); } } /* 大屏模式下的特殊效果 */ body.fullscreen-mode .monitor-layout::before { content: ''; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient(circle at 20% 20%, rgba(0, 212, 255, 0.1) 0%, transparent 50%), radial-gradient(circle at 80% 80%, rgba(116, 75, 162, 0.1) 0%, transparent 50%), radial-gradient(circle at 40% 60%, rgba(102, 126, 234, 0.1) 0%, transparent 50%); pointer-events: none; z-index: 1; } body.fullscreen-mode .status-card { animation: statusPulse 3s ease-in-out infinite; } body.fullscreen-mode .legend-color { animation: legendPulse 2s ease-in-out infinite; } body.fullscreen-mode .video-placeholder::before { animation: videoScan 3s ease-in-out infinite; } body.fullscreen-mode .video-placeholder i { animation: videoIconPulse 2s ease-in-out infinite; } body.fullscreen-mode .area-item { animation: borderScan 4s ease-in-out infinite; } /* 自定义面包屑 */ .custom-breadcrumb { display: flex; align-items: center; gap: 0.5rem; padding: 1rem; background: rgba(255, 255, 255, 0.1); border-radius: 8px; margin-bottom: 1rem; } .custom-breadcrumb .breadcrumb-item { color: #666; text-decoration: none; transition: color 0.3s ease; } .custom-breadcrumb .breadcrumb-item:hover { color: #4a90e2; } .custom-breadcrumb .breadcrumb-item.active { color: #2c3e50; font-weight: 500; } .custom-breadcrumb .breadcrumb-separator { color: #999; margin: 0 0.5rem; } /* 工单系统样式 */ .workorder-layout { padding: 20px; max-width: 1400px; margin: 0 auto; } .workorder-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; padding-bottom: 20px; border-bottom: 2px solid #2a3f5f; } .workorder-header h3 { color: #64b5f6; font-size: 24px; margin: 0; } .workorder-actions { display: flex; gap: 10px; } .workorder-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 30px; } .stat-card { background: linear-gradient(135deg, #1e3a5f 0%, #2a4a6b 100%); border: 1px solid #3a5f7f; border-radius: 12px; padding: 20px; display: flex; align-items: center; gap: 15px; transition: all 0.3s ease; } .stat-card:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(100, 181, 246, 0.2); } .stat-icon { width: 50px; height: 50px; border-radius: 50%; background: linear-gradient(135deg, #64b5f6, #42a5f5); display: flex; align-items: center; justify-content: center; color: white; font-size: 20px; } .stat-info { flex: 1; } .stat-number { font-size: 28px; font-weight: bold; color: #64b5f6; margin-bottom: 5px; } .stat-label { color: #b0bec5; font-size: 14px; } .workorder-table { background: #1a2332; border-radius: 12px; overflow: hidden; border: 1px solid #2a3f5f; } .table-header { padding: 20px; background: #2a3f5f; border-bottom: 1px solid #3a5f7f; } .table-controls { display: flex; gap: 15px; align-items: center; } .filter-select, .search-input { padding: 8px 12px; background: #1a2332; border: 1px solid #3a5f7f; border-radius: 6px; color: #e0e0e0; font-size: 14px; } .search-input { flex: 1; max-width: 300px; } .workorder-list { width: 100%; border-collapse: collapse; } .workorder-list th, .workorder-list td { padding: 15px; text-align: left; border-bottom: 1px solid #2a3f5f; } .workorder-list th { background: #2a3f5f; color: #64b5f6; font-weight: 600; font-size: 14px; } .workorder-list td { color: #e0e0e0; font-size: 14px; } /* 设备管理样式 */ .device-layout { padding: 20px; max-width: 1400px; margin: 0 auto; } .device-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; padding-bottom: 20px; border-bottom: 2px solid #2a3f5f; } .device-header h3 { color: #64b5f6; font-size: 24px; margin: 0; } .device-actions { display: flex; gap: 10px; } .device-categories { display: flex; gap: 10px; margin-bottom: 30px; flex-wrap: wrap; } .category-btn { padding: 10px 20px; background: #2a3f5f; border: 1px solid #3a5f7f; border-radius: 25px; color: #b0bec5; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; } .category-btn:hover, .category-btn.active { background: linear-gradient(135deg, #64b5f6, #42a5f5); color: white; border-color: #64b5f6; } .device-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; } /* 告警系统样式 */ .warning-layout { padding: 20px; max-width: 1400px; margin: 0 auto; } .warning-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; padding-bottom: 20px; border-bottom: 2px solid #2a3f5f; } .warning-header h3 { color: #64b5f6; font-size: 24px; margin: 0; } .warning-actions { display: flex; gap: 10px; } .warning-overview { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-bottom: 30px; } .warning-card { background: linear-gradient(135deg, #1e3a5f 0%, #2a4a6b 100%); border-radius: 12px; padding: 20px; display: flex; align-items: center; gap: 15px; transition: all 0.3s ease; border-left: 4px solid; } .warning-card.critical { border-left-color: #f44336; } .warning-card.high { border-left-color: #ff9800; } .warning-card.medium { border-left-color: #ffeb3b; } .warning-card.low { border-left-color: #4caf50; } .warning-icon { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 18px; } .warning-card.critical .warning-icon { background: #f44336; } .warning-card.high .warning-icon { background: #ff9800; } .warning-card.medium .warning-icon { background: #ffeb3b; color: #333; } .warning-card.low .warning-icon { background: #4caf50; } .warning-info { flex: 1; } .warning-number { font-size: 24px; font-weight: bold; color: #e0e0e0; margin-bottom: 5px; } .warning-label { color: #b0bec5; font-size: 14px; } .warning-types { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 20px; } .warning-type-card { background: #1a2332; border: 1px solid #2a3f5f; border-radius: 12px; padding: 20px; } .warning-type-card h4 { color: #64b5f6; margin: 0 0 15px 0; font-size: 18px; } .warning-grid { display: grid; gap: 10px; } /* 统计分析样式 */ .statistics-layout { padding: 20px; max-width: 1400px; margin: 0 auto; } .statistics-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; padding-bottom: 20px; border-bottom: 2px solid #2a3f5f; } .statistics-header h3 { color: #64b5f6; font-size: 24px; margin: 0; } .statistics-actions { display: flex; gap: 10px; align-items: center; } .time-range-select { padding: 8px 12px; background: #2a3f5f; border: 1px solid #3a5f7f; border-radius: 6px; color: #e0e0e0; font-size: 14px; } .kpi-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 30px; } .kpi-card { background: linear-gradient(135deg, #1e3a5f 0%, #2a4a6b 100%); border: 1px solid #3a5f7f; border-radius: 12px; padding: 20px; display: flex; align-items: center; gap: 15px; transition: all 0.3s ease; } .kpi-card:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(100, 181, 246, 0.2); } .kpi-icon { width: 50px; height: 50px; border-radius: 50%; background: linear-gradient(135deg, #64b5f6, #42a5f5); display: flex; align-items: center; justify-content: center; color: white; font-size: 20px; } .kpi-info { flex: 1; } .kpi-value { font-size: 28px; font-weight: bold; color: #64b5f6; margin-bottom: 5px; } .kpi-label { color: #b0bec5; font-size: 14px; margin-bottom: 5px; } .kpi-change { font-size: 12px; font-weight: 600; } .kpi-change.positive { color: #4caf50; } .kpi-change.negative { color: #f44336; } .charts-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 20px; } .chart-card { background: #1a2332; border: 1px solid #2a3f5f; border-radius: 12px; padding: 20px; } .chart-card h4 { color: #64b5f6; margin: 0 0 15px 0; font-size: 18px; } .chart-card canvas { width: 100% !important; height: 300px !important; } /* 通用按钮样式 */ .btn { padding: 10px 20px; border: none; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: 500; display: inline-flex; align-items: center; gap: 8px; transition: all 0.3s ease; text-decoration: none; } .btn-primary { background: linear-gradient(135deg, #64b5f6, #42a5f5); color: white; } .btn-primary:hover { background: linear-gradient(135deg, #42a5f5, #2196f3); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(100, 181, 246, 0.3); } .btn-secondary { background: #2a3f5f; color: #b0bec5; border: 1px solid #3a5f7f; } .btn-secondary:hover { background: #3a5f7f; color: #e0e0e0; border-color: #4a6f8f; } /* 模态框样式 */ #modalContainer { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.8); display: none; align-items: center; justify-content: center; z-index: 10000; } .modal { background: #1a2332; border: 1px solid #2a3f5f; border-radius: 12px; padding: 30px; max-width: 600px; width: 90%; max-height: 80vh; overflow-y: auto; } .modal h3 { color: #64b5f6; margin: 0 0 20px 0; font-size: 20px; } .modal-close { position: absolute; top: 15px; right: 15px; background: none; border: none; color: #b0bec5; font-size: 24px; cursor: pointer; padding: 5px; } .modal-close:hover { color: #e0e0e0; } /* 新增响应式设计 */ @media (max-width: 1200px) { .charts-container { grid-template-columns: 1fr; } .warning-types { grid-template-columns: 1fr; } } @media (max-width: 992px) { .workorder-stats, .kpi-cards { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } .device-grid { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); } .warning-overview { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); } } @media (max-width: 768px) { .workorder-header, .device-header, .warning-header, .statistics-header { flex-direction: column; gap: 15px; align-items: flex-start; } .workorder-actions, .device-actions, .warning-actions, .statistics-actions { width: 100%; justify-content: flex-start; } .device-categories { justify-content: center; } .table-controls { flex-direction: column; gap: 10px; } .search-input { max-width: 100%; } }