LLM-test/test/code/2/deepseek_v3.2_web.html

2283 lines
91 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>赛博朋克2078 - 神经网络城市可视化平台</title>
<!-- CDN资源引入 -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&family=Rajdhani:wght@300;400;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.8.5/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/particles.js/2.0.0/particles.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tween.js/18.6.4/tween.umd.js"></script>
<style>
/* 全局变量与基础重置 */
:root {
--neon-pink: #ff00ff;
--electric-blue: #00ffff;
--laser-purple: #8800ff;
--deep-black: #0a0a0a;
--metal-gray: #1a1a1a;
--hologram-teal: #00ffcc;
--grid-color: rgba(0, 255, 255, 0.1);
--glow-intensity: 0 0 15px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Rajdhani', sans-serif;
background-color: var(--deep-black);
color: white;
overflow-x: hidden;
line-height: 1.6;
font-weight: 400;
position: relative;
min-height: 100vh;
cursor: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" fill="none" stroke="%2300ffff" stroke-width="2" stroke-opacity="0.8"/><circle cx="12" cy="12" r="2" fill="%2300ffff"/></svg>') 12 12, auto;
}
h1, h2, h3, h4, .tech-font {
font-family: 'Orbitron', sans-serif;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
}
/* 开场动画容器 */
#intro-animation {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: var(--deep-black);
z-index: 1000;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
.neural-node {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
background-color: var(--neon-pink);
box-shadow: 0 0 20px var(--neon-pink);
z-index: 1001;
}
.neural-connection {
position: absolute;
height: 2px;
background: linear-gradient(90deg, transparent, var(--electric-blue), transparent);
transform-origin: left center;
z-index: 1000;
}
/* 主容器与布局 */
.main-container {
opacity: 0;
transition: opacity 1s ease;
position: relative;
}
.main-container.visible {
opacity: 1;
}
section {
position: relative;
padding: 100px 5%;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
border-bottom: 1px solid rgba(0, 255, 255, 0.1);
}
.section-title {
font-size: 2.5rem;
margin-bottom: 2rem;
position: relative;
display: inline-block;
color: var(--electric-blue);
text-shadow: 0 0 10px rgba(0, 255, 255, 0.5);
}
.section-title::after {
content: '';
position: absolute;
bottom: -10px;
left: 0;
width: 100px;
height: 3px;
background: linear-gradient(90deg, var(--neon-pink), var(--electric-blue));
border-radius: 2px;
}
/* 3D城市容器 */
#city-3d-container {
position: relative;
width: 100%;
height: 80vh;
border-radius: 10px;
overflow: hidden;
border: 1px solid rgba(0, 255, 255, 0.3);
box-shadow: 0 0 40px rgba(0, 255, 255, 0.2);
margin-top: 2rem;
}
#city-canvas {
width: 100%;
height: 100%;
display: block;
}
.city-info-panel {
position: absolute;
top: 20px;
right: 20px;
background: rgba(10, 10, 10, 0.8);
backdrop-filter: blur(10px);
border: 1px solid var(--electric-blue);
border-radius: 8px;
padding: 15px;
width: 300px;
box-shadow: 0 0 20px rgba(0, 255, 255, 0.3);
z-index: 10;
}
.info-row {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
font-size: 0.9rem;
}
.info-label {
color: #aaa;
}
.info-value {
color: var(--hologram-teal);
font-weight: 600;
}
/* 神经网络可视化 */
#neural-network {
position: relative;
width: 100%;
height: 70vh;
border-radius: 10px;
overflow: hidden;
background: rgba(5, 5, 15, 0.7);
border: 1px solid rgba(136, 0, 255, 0.5);
box-shadow: 0 0 30px rgba(136, 0, 255, 0.3);
margin-top: 2rem;
}
#neural-canvas {
width: 100%;
height: 100%;
}
.neural-stats {
display: flex;
justify-content: space-around;
flex-wrap: wrap;
margin-top: 30px;
gap: 20px;
}
.stat-box {
background: rgba(20, 20, 30, 0.8);
border: 1px solid var(--neon-pink);
border-radius: 8px;
padding: 20px;
min-width: 200px;
text-align: center;
transition: transform 0.3s ease, box-shadow 0.3s ease;
position: relative;
overflow: hidden;
}
.stat-box:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px rgba(255, 0, 255, 0.4);
}
.stat-value {
font-size: 2.5rem;
font-weight: 900;
color: var(--neon-pink);
margin: 10px 0;
text-shadow: 0 0 10px rgba(255, 0, 255, 0.7);
}
/* 监控面板 */
.monitor-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 30px;
margin-top: 2rem;
}
.monitor-card {
background: rgba(15, 15, 25, 0.9);
border-radius: 10px;
padding: 25px;
border: 1px solid rgba(0, 255, 255, 0.3);
box-shadow: 0 0 20px rgba(0, 255, 255, 0.1);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.monitor-card:hover {
border-color: var(--electric-blue);
box-shadow: 0 0 30px rgba(0, 255, 255, 0.3);
}
.card-title {
color: var(--electric-blue);
margin-bottom: 20px;
font-size: 1.3rem;
display: flex;
align-items: center;
gap: 10px;
}
.gauge-container {
position: relative;
width: 200px;
height: 200px;
margin: 0 auto;
}
.waveform-container {
width: 100%;
height: 150px;
position: relative;
}
#waveform-canvas {
width: 100%;
height: 100%;
}
.server-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(4, 1fr);
gap: 10px;
}
.server-node {
aspect-ratio: 1;
background-color: rgba(0, 255, 0, 0.1);
border-radius: 4px;
border: 1px solid rgba(0, 255, 0, 0.3);
transition: all 0.3s ease;
}
.server-node.alert {
background-color: rgba(255, 0, 0, 0.2);
border-color: rgba(255, 0, 0, 0.6);
animation: pulse-red 1s infinite alternate;
}
@keyframes pulse-red {
from { box-shadow: 0 0 5px rgba(255, 0, 0, 0.5); }
to { box-shadow: 0 0 15px rgba(255, 0, 0, 0.8); }
}
.log-window {
background-color: rgba(0, 20, 0, 0.8);
border: 1px solid rgba(0, 255, 0, 0.4);
border-radius: 5px;
padding: 15px;
height: 300px;
overflow-y: auto;
font-family: 'Courier New', monospace;
font-size: 0.9rem;
position: relative;
}
.log-window::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(
transparent 95%,
rgba(0, 255, 0, 0.05) 95%
);
background-size: 100% 20px;
pointer-events: none;
z-index: 1;
}
.log-entry {
color: #00ff00;
margin-bottom: 5px;
line-height: 1.4;
}
.log-timestamp {
color: #00aa00;
}
/* 时间线导航 */
.timeline-container {
position: relative;
margin-top: 3rem;
height: 200px;
overflow-x: auto;
overflow-y: hidden;
padding: 20px 0;
}
.timeline-track {
position: relative;
height: 4px;
background: linear-gradient(90deg, var(--neon-pink), var(--laser-purple), var(--electric-blue));
margin: 80px 50px;
border-radius: 2px;
}
.timeline-node {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
background-color: var(--metal-gray);
border: 3px solid var(--electric-blue);
border-radius: 50%;
cursor: pointer;
transition: all 0.3s ease;
z-index: 10;
}
.timeline-node:hover {
transform: translateY(-50%) scale(1.3);
background-color: var(--electric-blue);
box-shadow: 0 0 20px var(--electric-blue);
}
.timeline-node.active {
background-color: var(--neon-pink);
border-color: var(--neon-pink);
box-shadow: 0 0 25px var(--neon-pink);
}
.node-label {
position: absolute;
top: -50px;
left: 50%;
transform: translateX(-50%);
white-space: nowrap;
background: rgba(10, 10, 10, 0.9);
padding: 8px 15px;
border-radius: 6px;
border: 1px solid var(--electric-blue);
color: var(--electric-blue);
font-weight: 600;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.timeline-node:hover .node-label {
opacity: 1;
}
/* 数据卡片 */
.cards-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 30px;
margin-top: 3rem;
perspective: 1000px;
}
.data-card {
background: linear-gradient(145deg, rgba(0, 255, 255, 0.05), rgba(255, 0, 255, 0.05));
border-radius: 10px;
padding: 25px;
border: 1px solid rgba(255, 255, 255, 0.1);
transform-style: preserve-3d;
transform: rotateX(5deg);
transition: all 0.5s ease;
position: relative;
overflow: hidden;
}
.data-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg, transparent 30%, rgba(0, 255, 255, 0.05) 100%);
z-index: -1;
}
.data-card:hover {
transform: rotateX(0deg) translateY(-10px);
border-color: var(--hologram-teal);
box-shadow: 0 15px 35px rgba(0, 255, 204, 0.3);
}
.card-icon {
font-size: 2rem;
color: var(--hologram-teal);
margin-bottom: 15px;
}
.card-value {
font-size: 2.5rem;
font-weight: 900;
color: white;
margin: 15px 0;
text-shadow: 0 0 10px rgba(255, 255, 255, 0.5);
}
/* 命令控制台 */
.console-container {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background: rgba(5, 5, 15, 0.95);
backdrop-filter: blur(15px);
border-top: 2px solid var(--laser-purple);
padding: 15px 5%;
z-index: 100;
box-shadow: 0 -5px 30px rgba(136, 0, 255, 0.5);
}
.console-input {
width: 100%;
background: transparent;
border: none;
border-bottom: 2px solid var(--electric-blue);
color: white;
font-family: 'Rajdhani', sans-serif;
font-size: 1.2rem;
padding: 10px 0;
outline: none;
caret-color: var(--neon-pink);
}
.console-input::placeholder {
color: rgba(255, 255, 255, 0.5);
}
.cursor {
display: inline-block;
width: 2px;
height: 1.2em;
background-color: var(--neon-pink);
animation: blink 1s infinite;
vertical-align: middle;
margin-left: 2px;
}
@keyframes blink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
.console-prompt {
color: var(--hologram-teal);
font-weight: 600;
margin-right: 10px;
}
/* 响应式设计 */
@media (max-width: 1024px) {
.monitor-grid {
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
.cards-container {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
}
@media (max-width: 768px) {
section {
padding: 80px 5%;
}
.section-title {
font-size: 2rem;
}
.city-info-panel {
width: 250px;
padding: 10px;
}
.monitor-grid {
grid-template-columns: 1fr;
}
.cards-container {
grid-template-columns: 1fr;
}
.timeline-container {
height: 150px;
}
.console-input {
font-size: 1rem;
}
}
/* Glitch效果 */
.glitch {
position: relative;
display: inline-block;
}
.glitch::before,
.glitch::after {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: var(--deep-black);
}
.glitch::before {
left: 2px;
text-shadow: -2px 0 var(--neon-pink);
clip: rect(24px, 550px, 90px, 0);
animation: glitch-anim 5s infinite linear alternate-reverse;
}
.glitch::after {
left: -2px;
text-shadow: -2px 0 var(--electric-blue);
clip: rect(85px, 550px, 140px, 0);
animation: glitch-anim2 5s infinite linear alternate-reverse;
}
@keyframes glitch-anim {
0% { clip: rect(42px, 9999px, 44px, 0); }
5% { clip: rect(12px, 9999px, 59px, 0); }
10% { clip: rect(48px, 9999px, 29px, 0); }
15% { clip: rect(42px, 9999px, 73px, 0); }
20% { clip: rect(63px, 9999px, 27px, 0); }
25% { clip: rect(34px, 9999px, 55px, 0); }
30% { clip: rect(86px, 9999px, 73px, 0); }
35% { clip: rect(20px, 9999px, 20px, 0); }
40% { clip: rect(26px, 9999px, 60px, 0); }
45% { clip: rect(25px, 9999px, 66px, 0); }
50% { clip: rect(57px, 9999px, 98px, 0); }
55% { clip: rect(5px, 9999px, 46px, 0); }
60% { clip: rect(82px, 9999px, 31px, 0); }
65% { clip: rect(54px, 9999px, 27px, 0); }
70% { clip: rect(28px, 9999px, 99px, 0); }
75% { clip: rect(45px, 9999px, 69px, 0); }
80% { clip: rect(23px, 9999px, 85px, 0); }
85% { clip: rect(54px, 9999px, 84px, 0); }
90% { clip: rect(45px, 9999px, 47px, 0); }
95% { clip: rect(37px, 9999px, 20px, 0); }
100% { clip: rect(4px, 9999px, 91px, 0); }
}
@keyframes glitch-anim2 {
0% { clip: rect(65px, 9999px, 100px, 0); }
5% { clip: rect(52px, 9999px, 74px, 0); }
10% { clip: rect(79px, 9999px, 85px, 0); }
15% { clip: rect(75px, 9999px, 5px, 0); }
20% { clip: rect(67px, 9999px, 61px, 0); }
25% { clip: rect(14px, 9999px, 79px, 0); }
30% { clip: rect(1px, 9999px, 66px, 0); }
35% { clip: rect(86px, 9999px, 30px, 0); }
40% { clip: rect(23px, 9999px, 98px, 0); }
45% { clip: rect(85px, 9999px, 72px, 0); }
50% { clip: rect(71px, 9999px, 75px, 0); }
55% { clip: rect(2px, 9999px, 48px, 0); }
60% { clip: rect(30px, 9999px, 16px, 0); }
65% { clip: rect(59px, 9999px, 50px, 0); }
70% { clip: rect(41px, 9999px, 62px, 0); }
75% { clip: rect(2px, 9999px, 82px, 0); }
80% { clip: rect(47px, 9999px, 73px, 0); }
85% { clip: rect(3px, 9999px, 27px, 0); }
90% { clip: rect(40px, 9999px, 86px, 0); }
95% { clip: rect(45px, 9999px, 72px, 0); }
100% { clip: rect(23px, 9999px, 49px, 0); }
}
/* 粒子背景 */
#particles-js {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
pointer-events: none;
}
/* 加载动画 */
.loading-ring {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 100px;
height: 100px;
z-index: 2000;
}
.loading-ring::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
border: 5px solid transparent;
border-top: 5px solid var(--neon-pink);
border-right: 5px solid var(--electric-blue);
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* 隐藏滚动条但保持滚动功能 */
.hide-scrollbar {
-ms-overflow-style: none;
scrollbar-width: none;
}
.hide-scrollbar::-webkit-scrollbar {
display: none;
}
/* 通用动画类 */
.fade-in {
animation: fadeIn 1s ease forwards;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.slide-up {
animation: slideUp 0.8s ease forwards;
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.pulse {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { box-shadow: 0 0 0 0 rgba(0, 255, 255, 0.7); }
70% { box-shadow: 0 0 0 15px rgba(0, 255, 255, 0); }
100% { box-shadow: 0 0 0 0 rgba(0, 255, 255, 0); }
}
</style>
</head>
<body>
<!-- 开场动画 -->
<div id="intro-animation">
<div class="loading-ring"></div>
</div>
<!-- 粒子背景 -->
<div id="particles-js"></div>
<!-- 主容器 -->
<div class="main-container">
<!-- 3D城市概览 -->
<section id="city-section">
<h2 class="section-title glitch" data-text="神经网络城市概览">神经网络城市概览</h2>
<div id="city-3d-container">
<canvas id="city-canvas"></canvas>
<div class="city-info-panel slide-up">
<div class="info-row">
<span class="info-label">当前时间</span>
<span class="info-value" id="current-time">2078-10-23 22:47:18</span>
</div>
<div class="info-row">
<span class="info-label">城市状态</span>
<span class="info-value" id="city-status">在线</span>
</div>
<div class="info-row">
<span class="info-label">神经元活跃度</span>
<span class="info-value" id="neuron-activity">94.7%</span>
</div>
<div class="info-row">
<span class="info-label">能量消耗</span>
<span class="info-value" id="energy-consumption">18.4 TW</span>
</div>
<div class="info-row">
<span class="info-label">网络延迟</span>
<span class="info-value" id="network-latency">0.8ms</span>
</div>
</div>
</div>
</section>
<!-- 神经网络可视化 -->
<section id="neural-section">
<h2 class="section-title glitch" data-text="实时数据流可视化">实时数据流可视化</h2>
<div id="neural-network">
<canvas id="neural-canvas"></canvas>
</div>
<div class="neural-stats">
<div class="stat-box fade-in">
<h3>神经元活跃度</h3>
<div class="stat-value" id="neuron-activity-value">94.7%</div>
<p>每秒处理数据包</p>
</div>
<div class="stat-box fade-in" style="animation-delay: 0.1s">
<h3>数据吞吐量</h3>
<div class="stat-value" id="data-throughput">18.4 PB/s</div>
<p>当前网络负载</p>
</div>
<div class="stat-box fade-in" style="animation-delay: 0.2s">
<h3>延迟指标</h3>
<div class="stat-value" id="latency-value">0.8ms</div>
<p>平均响应时间</p>
</div>
<div class="stat-box fade-in" style="animation-delay: 0.3s">
<h3>连接稳定性</h3>
<div class="stat-value" id="connection-stability">99.98%</div>
<p>系统正常运行时间</p>
</div>
</div>
</section>
<!-- 系统监控面板 -->
<section id="monitor-section">
<h2 class="section-title glitch" data-text="智能系统监控面板">智能系统监控面板</h2>
<div class="monitor-grid">
<div class="monitor-card slide-up">
<h3 class="card-title"><i class="fas fa-microchip"></i> 系统负载</h3>
<div class="gauge-container">
<canvas id="cpu-gauge"></canvas>
</div>
<div class="info-row" style="margin-top: 20px;">
<span class="info-label">CPU使用率</span>
<span class="info-value" id="cpu-usage">78%</span>
</div>
<div class="info-row">
<span class="info-label">内存使用率</span>
<span class="info-value" id="memory-usage">64%</span>
</div>
</div>
<div class="monitor-card slide-up" style="animation-delay: 0.1s">
<h3 class="card-title"><i class="fas fa-wave-square"></i> 网络流量</h3>
<div class="waveform-container">
<canvas id="waveform-canvas"></canvas>
</div>
<div class="info-row" style="margin-top: 20px;">
<span class="info-label">上传速度</span>
<span class="info-value" id="upload-speed">1.2 GB/s</span>
</div>
<div class="info-row">
<span class="info-label">下载速度</span>
<span class="info-value" id="download-speed">2.8 GB/s</span>
</div>
</div>
<div class="monitor-card slide-up" style="animation-delay: 0.2s">
<h3 class="card-title"><i class="fas fa-server"></i> 服务器状态</h3>
<div class="server-grid" id="server-grid">
<!-- 服务器节点由JS动态生成 -->
</div>
<div class="info-row" style="margin-top: 20px;">
<span class="info-label">在线服务器</span>
<span class="info-value" id="online-servers">148/150</span>
</div>
</div>
<div class="monitor-card slide-up" style="animation-delay: 0.3s">
<h3 class="card-title"><i class="fas fa-terminal"></i> 系统日志</h3>
<div class="log-window" id="log-window">
<!-- 日志条目由JS动态生成 -->
</div>
</div>
</div>
</section>
<!-- 时间线导航 -->
<section id="timeline-section">
<h2 class="section-title glitch" data-text="历史时间线">历史时间线</h2>
<div class="timeline-container hide-scrollbar">
<div class="timeline-track"></div>
<!-- 时间线节点由JS动态生成 -->
</div>
</section>
<!-- 数据卡片 -->
<section id="data-cards-section">
<h2 class="section-title glitch" data-text="全息数据投影">全息数据投影</h2>
<div class="cards-container">
<div class="data-card slide-up">
<div class="card-icon"><i class="fas fa-users"></i></div>
<h3>人口统计</h3>
<div class="card-value" id="population-value">42.7M</div>
<p>城市总人口数量</p>
<div class="card-details" style="margin-top: 15px; font-size: 0.9rem; color: #aaa; display: none;">
<p>• AI公民: 18.2M</p>
<p>• 人类居民: 24.5M</p>
<p>• 增长趋势: +1.2%/年</p>
</div>
</div>
<div class="data-card slide-up" style="animation-delay: 0.1s">
<div class="card-icon"><i class="fas fa-bolt"></i></div>
<h3>能量消耗</h3>
<div class="card-value" id="energy-value">18.4 TW</div>
<p>当前城市总能耗</p>
<div class="card-details" style="margin-top: 15px; font-size: 0.9rem; color: #aaa; display: none;">
<p>• 神经网络: 62%</p>
<p>• 基础设施: 28%</p>
<p>• 其他: 10%</p>
</div>
</div>
<div class="data-card slide-up" style="animation-delay: 0.2s">
<div class="card-icon"><i class="fas fa-project-diagram"></i></div>
<h3>网络节点</h3>
<div class="card-value" id="node-value">1.24M</div>
<p>活跃神经网络节点</p>
<div class="card-details" style="margin-top: 15px; font-size: 0.9rem; color: #aaa; display: none;">
<p>• 核心节点: 12</p>
<p>• 区域节点: 1,240</p>
<p>• 终端节点: 1.24M</p>
</div>
</div>
<div class="data-card slide-up" style="animation-delay: 0.3s">
<div class="card-icon"><i class="fas fa-brain"></i></div>
<h3>AI意识同步率</h3>
<div class="card-value" id="ai-sync-value">87.3%</div>
<p>神经网络意识统一度</p>
<div class="card-details" style="margin-top: 15px; font-size: 0.9rem; color: #aaa; display: none;">
<p>• 主AI核心: 100%</p>
<p>• 区域AI: 94.2%</p>
<p>• 边缘AI: 79.5%</p>
</div>
</div>
</div>
</section>
</div>
<!-- 命令控制台 -->
<div class="console-container">
<div style="display: flex; align-items: center;">
<span class="console-prompt">neuro://city2078></span>
<input type="text" class="console-input" id="console-input" placeholder="输入命令进行交互...">
<span class="cursor" id="console-cursor"></span>
</div>
</div>
<script>
// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', function() {
// 全局变量
let cityScene, cityCamera, cityRenderer;
let neuralNetworkNodes = [];
let neuralNetworkConnections = [];
let isIntroComplete = false;
let currentTime = new Date(2078, 9, 23, 22, 47, 18); // 2078年10月23日
// 初始化开场动画
initIntroAnimation();
// 初始化粒子背景
initParticles();
// 初始化3D城市
initCity3D();
// 初始化神经网络可视化
initNeuralNetwork();
// 初始化监控面板
initMonitorPanel();
// 初始化时间线
initTimeline();
// 初始化数据卡片交互
initDataCards();
// 初始化控制台
initConsole();
// 更新实时时间
updateRealTime();
// 开场动画
function initIntroAnimation() {
const introContainer = document.getElementById('intro-animation');
const loadingRing = document.querySelector('.loading-ring');
// 创建神经网络节点
const centerX = window.innerWidth / 2;
const centerY = window.innerHeight / 2;
const nodeCount = 25;
const connectionCount = 40;
// 创建节点
for (let i = 0; i < nodeCount; i++) {
const node = document.createElement('div');
node.className = 'neural-node';
// 初始位置在屏幕中心
node.style.left = centerX + 'px';
node.style.top = centerY + 'px';
node.style.opacity = '0';
node.style.transform = 'scale(0)';
introContainer.appendChild(node);
// 存储节点引用
neuralNetworkNodes.push({
element: node,
targetX: centerX + (Math.random() - 0.5) * 600,
targetY: centerY + (Math.random() - 0.5) * 400,
size: 4 + Math.random() * 6
});
}
// 创建连接线
for (let i = 0; i < connectionCount; i++) {
const connection = document.createElement('div');
connection.className = 'neural-connection';
connection.style.opacity = '0';
introContainer.appendChild(connection);
neuralNetworkConnections.push(connection);
}
// 开场动画时间线
const introTimeline = gsap.timeline({
onComplete: () => {
isIntroComplete = true;
introContainer.style.opacity = '0';
introContainer.style.pointerEvents = 'none';
// 显示主内容
document.querySelector('.main-container').classList.add('visible');
// 触发各模块入场动画
animateSectionEntrances();
// 移除开场动画容器
setTimeout(() => {
introContainer.style.display = 'none';
}, 1000);
}
});
// 开场动画序列
introTimeline
.to(loadingRing, {
duration: 1,
opacity: 0,
scale: 0.5,
ease: "power2.inOut"
})
.to(neuralNetworkNodes.map(node => node.element), {
duration: 1.5,
x: (i) => neuralNetworkNodes[i].targetX - centerX,
y: (i) => neuralNetworkNodes[i].targetY - centerY,
opacity: 1,
scale: 1,
ease: "back.out(1.7)",
stagger: 0.05
}, "-=0.5")
.to(neuralNetworkConnections, {
duration: 1,
opacity: 0.7,
stagger: 0.02,
onStart: updateConnections
}, "-=1")
.to('.neural-node', {
duration: 2,
boxShadow: "0 0 30px #ff00ff",
repeat: 3,
yoyo: true,
ease: "sine.inOut"
}, "-=0.5")
.to(introContainer, {
duration: 1.5,
backgroundColor: "rgba(10, 10, 10, 0.8)",
ease: "power2.inOut"
}, "-=0.5")
.to('.neural-node, .neural-connection', {
duration: 1,
opacity: 0,
ease: "power2.inOut"
}, "-=0.5");
// 更新连接线位置
function updateConnections() {
neuralNetworkConnections.forEach(conn => {
const node1 = neuralNetworkNodes[Math.floor(Math.random() * neuralNetworkNodes.length)];
const node2 = neuralNetworkNodes[Math.floor(Math.random() * neuralNetworkNodes.length)];
const dx = node2.targetX - node1.targetX;
const dy = node2.targetY - node1.targetY;
const length = Math.sqrt(dx * dx + dy * dy);
const angle = Math.atan2(dy, dx) * 180 / Math.PI;
conn.style.width = length + 'px';
conn.style.left = node1.targetX + 'px';
conn.style.top = node1.targetY + 'px';
conn.style.transform = `rotate(${angle}deg)`;
});
}
}
// 粒子背景初始化
function initParticles() {
particlesJS('particles-js', {
particles: {
number: { value: 150, density: { enable: true, value_area: 800 } },
color: { value: ["#ff00ff", "#00ffff", "#8800ff"] },
shape: { type: "circle" },
opacity: { value: 0.5, random: true },
size: { value: 2, random: true },
line_linked: {
enable: true,
distance: 150,
color: "#00ffff",
opacity: 0.2,
width: 1
},
move: {
enable: true,
speed: 1,
direction: "none",
random: true,
straight: false,
out_mode: "out",
bounce: false
}
},
interactivity: {
detect_on: "canvas",
events: {
onhover: { enable: true, mode: "repulse" },
onclick: { enable: true, mode: "push" },
resize: true
}
},
retina_detect: true
});
}
// 3D城市初始化
function initCity3D() {
const container = document.getElementById('city-canvas');
const width = container.clientWidth;
const height = container.clientHeight;
// 创建场景
cityScene = new THREE.Scene();
cityScene.fog = new THREE.Fog(0x0a0a0a, 10, 100);
// 创建相机
cityCamera = new THREE.PerspectiveCamera(60, width / height, 0.1, 1000);
cityCamera.position.set(15, 25, 30);
cityCamera.lookAt(0, 0, 0);
// 创建渲染器
cityRenderer = new THREE.WebGLRenderer({
canvas: container,
antialias: true,
alpha: true
});
cityRenderer.setSize(width, height);
cityRenderer.setPixelRatio(window.devicePixelRatio);
cityRenderer.setClearColor(0x0a0a0a, 1);
// 添加光源
const ambientLight = new THREE.AmbientLight(0x444444);
cityScene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0x00ffff, 0.8);
directionalLight.position.set(10, 20, 5);
cityScene.add(directionalLight);
const pinkLight = new THREE.PointLight(0xff00ff, 0.5, 50);
pinkLight.position.set(-10, 10, -10);
cityScene.add(pinkLight);
// 创建城市建筑
createCityBuildings();
// 创建飞行粒子
createFlyingParticles();
// 添加交互控制
initCityControls();
// 开始动画循环
animateCity();
// 窗口大小调整处理
window.addEventListener('resize', onWindowResize);
}
// 创建城市建筑
function createCityBuildings() {
const buildingGeometry = new THREE.BoxGeometry(1, 1, 1);
const buildingMaterial = new THREE.MeshPhongMaterial({
color: 0x222222,
shininess: 30
});
// 生成随机建筑
for (let i = 0; i < 200; i++) {
const building = new THREE.Mesh(buildingGeometry, buildingMaterial);
// 随机位置
const x = (Math.random() - 0.5) * 40;
const z = (Math.random() - 0.5) * 40;
// 随机高度
const height = 1 + Math.random() * 10;
building.position.set(x, height / 2, z);
building.scale.set(
0.5 + Math.random() * 1.5,
height,
0.5 + Math.random() * 1.5
);
// 添加建筑顶部的灯光
if (Math.random() > 0.7) {
const light = new THREE.PointLight(
Math.random() > 0.5 ? 0x00ffff : 0xff00ff,
0.5,
5
);
light.position.set(0, height / 2 + 0.2, 0);
building.add(light);
}
cityScene.add(building);
}
// 添加地面
const groundGeometry = new THREE.PlaneGeometry(100, 100);
const groundMaterial = new THREE.MeshPhongMaterial({
color: 0x111111,
side: THREE.DoubleSide
});
const ground = new THREE.Mesh(groundGeometry, groundMaterial);
ground.rotation.x = Math.PI / 2;
ground.position.y = -0.5;
cityScene.add(ground);
// 添加地面网格
const gridHelper = new THREE.GridHelper(100, 50, 0x00ffff, 0x333333);
gridHelper.position.y = 0.01;
cityScene.add(gridHelper);
}
// 创建飞行粒子
function createFlyingParticles() {
const particleCount = 100;
const particles = new THREE.BufferGeometry();
const positions = new Float32Array(particleCount * 3);
const colors = new Float32Array(particleCount * 3);
for (let i = 0; i < particleCount; i++) {
// 随机位置
positions[i * 3] = (Math.random() - 0.5) * 40;
positions[i * 3 + 1] = 5 + Math.random() * 15;
positions[i * 3 + 2] = (Math.random() - 0.5) * 40;
// 随机颜色
const color = Math.random() > 0.5 ?
new THREE.Color(0x00ffff) : new THREE.Color(0xff00ff);
colors[i * 3] = color.r;
colors[i * 3 + 1] = color.g;
colors[i * 3 + 2] = color.b;
}
particles.setAttribute('position', new THREE.BufferAttribute(positions, 3));
particles.setAttribute('color', new THREE.BufferAttribute(colors, 3));
const particleMaterial = new THREE.PointsMaterial({
size: 0.1,
vertexColors: true,
transparent: true,
opacity: 0.8
});
const particleSystem = new THREE.Points(particles, particleMaterial);
cityScene.add(particleSystem);
// 存储粒子系统以便动画更新
cityScene.userData.particleSystem = particleSystem;
cityScene.userData.particlePositions = positions;
}
// 初始化城市交互控制
function initCityControls() {
let isMouseDown = false;
let previousMouseX = 0;
let previousMouseY = 0;
let targetCameraRotationX = 0;
let targetCameraRotationY = 0;
let currentCameraRotationX = 0;
let currentCameraRotationY = 0;
const container = document.getElementById('city-3d-container');
// 鼠标按下事件
container.addEventListener('mousedown', (e) => {
isMouseDown = true;
previousMouseX = e.clientX;
previousMouseY = e.clientY;
});
// 鼠标释放事件
document.addEventListener('mouseup', () => {
isMouseDown = false;
});
// 鼠标移动事件
document.addEventListener('mousemove', (e) => {
if (!isMouseDown) return;
const deltaX = e.clientX - previousMouseX;
const deltaY = e.clientY - previousMouseY;
targetCameraRotationY += deltaX * 0.01;
targetCameraRotationX += deltaY * 0.01;
// 限制X轴旋转角度
targetCameraRotationX = Math.max(-Math.PI/2, Math.min(Math.PI/2, targetCameraRotationX));
previousMouseX = e.clientX;
previousMouseY = e.clientY;
});
// 鼠标滚轮缩放
container.addEventListener('wheel', (e) => {
e.preventDefault();
const zoomSpeed = 0.1;
const delta = e.deltaY > 0 ? zoomSpeed : -zoomSpeed;
cityCamera.position.x += (cityCamera.position.x * delta) * 0.1;
cityCamera.position.y += (cityCamera.position.y * delta) * 0.1;
cityCamera.position.z += (cityCamera.position.z * delta) * 0.1;
// 限制缩放范围
const minDistance = 10;
const maxDistance = 50;
const distance = cityCamera.position.length();
if (distance < minDistance) {
cityCamera.position.normalize().multiplyScalar(minDistance);
} else if (distance > maxDistance) {
cityCamera.position.normalize().multiplyScalar(maxDistance);
}
}, { passive: false });
// 动画循环中更新相机旋转
function updateCameraRotation() {
// 平滑插值
currentCameraRotationX += (targetCameraRotationX - currentCameraRotationX) * 0.05;
currentCameraRotationY += (targetCameraRotationY - currentCameraRotationY) * 0.05;
// 计算相机位置
const radius = cityCamera.position.length();
cityCamera.position.x = radius * Math.sin(currentCameraRotationY) * Math.cos(currentCameraRotationX);
cityCamera.position.z = radius * Math.cos(currentCameraRotationY) * Math.cos(currentCameraRotationX);
cityCamera.position.y = radius * Math.sin(currentCameraRotationX);
cityCamera.lookAt(0, 5, 0);
}
// 存储更新函数
cityScene.userData.updateCameraRotation = updateCameraRotation;
}
// 城市动画循环
function animateCity() {
requestAnimationFrame(animateCity);
// 更新相机旋转
if (cityScene.userData.updateCameraRotation) {
cityScene.userData.updateCameraRotation();
}
// 更新粒子位置
if (cityScene.userData.particleSystem && cityScene.userData.particlePositions) {
const positions = cityScene.userData.particlePositions;
const time = Date.now() * 0.001;
for (let i = 0; i < positions.length / 3; i++) {
positions[i * 3] += Math.sin(time + i) * 0.01;
positions[i * 3 + 2] += Math.cos(time + i * 0.5) * 0.01;
// 边界检查
if (positions[i * 3] > 20) positions[i * 3] = -20;
if (positions[i * 3] < -20) positions[i * 3] = 20;
if (positions[i * 3 + 2] > 20) positions[i * 3 + 2] = -20;
if (positions[i * 3 + 2] < -20) positions[i * 3 + 2] = 20;
}
cityScene.userData.particleSystem.geometry.attributes.position.needsUpdate = true;
}
// 渲染场景
cityRenderer.render(cityScene, cityCamera);
}
// 窗口大小调整处理
function onWindowResize() {
const container = document.getElementById('city-canvas');
const width = container.clientWidth;
const height = container.clientHeight;
cityCamera.aspect = width / height;
cityCamera.updateProjectionMatrix();
cityRenderer.setSize(width, height);
}
// 神经网络可视化初始化
function initNeuralNetwork() {
const canvas = document.getElementById('neural-canvas');
const ctx = canvas.getContext('2d');
const width = canvas.clientWidth;
const height = canvas.clientHeight;
canvas.width = width;
canvas.height = height;
// 创建神经网络节点
const nodeCount = 20;
const nodes = [];
for (let i = 0; i < nodeCount; i++) {
nodes.push({
x: Math.random() * width,
y: Math.random() * height,
radius: 5 + Math.random() * 10,
color: Math.random() > 0.5 ? '#ff00ff' : '#00ffff',
pulse: 0,
pulseSpeed: 0.01 + Math.random() * 0.02,
connections: []
});
}
// 创建连接
const connectionCount = 30;
const connections = [];
for (let i = 0; i < connectionCount; i++) {
const nodeA = nodes[Math.floor(Math.random() * nodes.length)];
const nodeB = nodes[Math.floor(Math.random() * nodes.length)];
if (nodeA !== nodeB) {
connections.push({
from: nodeA,
to: nodeB,
pulse: 0,
pulseSpeed: 0.005 + Math.random() * 0.01,
pulsePosition: Math.random()
});
}
}
// 动画循环
function animateNeuralNetwork() {
requestAnimationFrame(animateNeuralNetwork);
// 清空画布
ctx.fillStyle = 'rgba(5, 5, 15, 0.1)';
ctx.fillRect(0, 0, width, height);
// 更新节点脉冲
nodes.forEach(node => {
node.pulse += node.pulseSpeed;
if (node.pulse > 1) node.pulse = 0;
});
// 更新连接脉冲
connections.forEach(conn => {
conn.pulsePosition += conn.pulseSpeed;
if (conn.pulsePosition > 1) conn.pulsePosition = 0;
});
// 绘制连接
connections.forEach(conn => {
const gradient = ctx.createLinearGradient(
conn.from.x, conn.from.y,
conn.to.x, conn.to.y
);
gradient.addColorStop(0, 'rgba(255, 0, 255, 0.3)');
gradient.addColorStop(0.5, 'rgba(0, 255, 255, 0.7)');
gradient.addColorStop(1, 'rgba(136, 0, 255, 0.3)');
ctx.strokeStyle = gradient;
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(conn.from.x, conn.from.y);
ctx.lineTo(conn.to.x, conn.to.y);
ctx.stroke();
// 绘制脉冲
const pulseX = conn.from.x + (conn.to.x - conn.from.x) * conn.pulsePosition;
const pulseY = conn.from.y + (conn.to.y - conn.from.y) * conn.pulsePosition;
ctx.beginPath();
ctx.arc(pulseX, pulseY, 3, 0, Math.PI * 2);
ctx.fillStyle = '#00ffff';
ctx.fill();
// 脉冲光晕
ctx.beginPath();
ctx.arc(pulseX, pulseY, 8, 0, Math.PI * 2);
const glowGradient = ctx.createRadialGradient(
pulseX, pulseY, 3,
pulseX, pulseY, 8
);
glowGradient.addColorStop(0, 'rgba(0, 255, 255, 0.8)');
glowGradient.addColorStop(1, 'rgba(0, 255, 255, 0)');
ctx.fillStyle = glowGradient;
ctx.fill();
});
// 绘制节点
nodes.forEach(node => {
// 节点光晕
const glowRadius = node.radius + node.pulse * 10;
const glowGradient = ctx.createRadialGradient(
node.x, node.y, node.radius,
node.x, node.y, glowRadius
);
glowGradient.addColorStop(0, node.color);
glowGradient.addColorStop(0.7, node.color + '80');
glowGradient.addColorStop(1, node.color + '00');
ctx.beginPath();
ctx.arc(node.x, node.y, glowRadius, 0, Math.PI * 2);
ctx.fillStyle = glowGradient;
ctx.fill();
// 节点主体
ctx.beginPath();
ctx.arc(node.x, node.y, node.radius, 0, Math.PI * 2);
ctx.fillStyle = node.color;
ctx.fill();
// 节点内圈
ctx.beginPath();
ctx.arc(node.x, node.y, node.radius / 2, 0, Math.PI * 2);
ctx.fillStyle = '#ffffff';
ctx.fill();
});
}
// 开始动画
animateNeuralNetwork();
// 响应式调整
window.addEventListener('resize', function() {
canvas.width = canvas.clientWidth;
canvas.height = canvas.clientHeight;
});
}
// 初始化监控面板
function initMonitorPanel() {
// 初始化CPU仪表
initCPUGauge();
// 初始化网络波形
initNetworkWaveform();
// 初始化服务器网格
initServerGrid();
// 初始化系统日志
initSystemLogs();
// 更新监控数据
updateMonitorData();
}
// 初始化CPU仪表
function initCPUGauge() {
const canvas = document.getElementById('cpu-gauge');
const ctx = canvas.getContext('2d');
const width = canvas.width = 200;
const height = canvas.height = 200;
function drawGauge(percentage) {
// 清空画布
ctx.clearRect(0, 0, width, height);
// 绘制外圈
const centerX = width / 2;
const centerY = height / 2;
const radius = 80;
// 绘制背景弧
ctx.beginPath();
ctx.arc(centerX, centerY, radius, 0.75 * Math.PI, 2.25 * Math.PI);
ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)';
ctx.lineWidth = 15;
ctx.stroke();
// 绘制进度弧
const endAngle = 0.75 * Math.PI + (1.5 * Math.PI * percentage / 100);
ctx.beginPath();
ctx.arc(centerX, centerY, radius, 0.75 * Math.PI, endAngle);
ctx.strokeStyle = getColorForPercentage(percentage);
ctx.lineWidth = 15;
ctx.stroke();
// 绘制指针
const pointerLength = radius - 10;
const pointerAngle = 0.75 * Math.PI + (1.5 * Math.PI * percentage / 100);
ctx.beginPath();
ctx.moveTo(centerX, centerY);
ctx.lineTo(
centerX + Math.cos(pointerAngle) * pointerLength,
centerY + Math.sin(pointerAngle) * pointerLength
);
ctx.strokeStyle = '#ffffff';
ctx.lineWidth = 3;
ctx.stroke();
// 绘制中心点
ctx.beginPath();
ctx.arc(centerX, centerY, 5, 0, Math.PI * 2);
ctx.fillStyle = '#ffffff';
ctx.fill();
// 绘制文本
ctx.font = 'bold 24px Orbitron';
ctx.fillStyle = '#ffffff';
ctx.textAlign = 'center';
ctx.fillText(percentage + '%', centerX, centerY + 10);
ctx.font = '14px Rajdhani';
ctx.fillStyle = '#aaaaaa';
ctx.fillText('CPU负载', centerX, centerY + 35);
}
function getColorForPercentage(percentage) {
if (percentage < 50) return '#00ff00';
if (percentage < 75) return '#ffff00';
return '#ff0000';
}
// 初始绘制
drawGauge(78);
// 存储绘制函数以便更新
canvas.drawGauge = drawGauge;
}
// 初始化网络波形
function initNetworkWaveform() {
const canvas = document.getElementById('waveform-canvas');
const ctx = canvas.getContext('2d');
const width = canvas.width = canvas.clientWidth;
const height = canvas.height = canvas.clientHeight;
let time = 0;
const dataPoints = 100;
const data = new Array(dataPoints).fill(0);
function drawWaveform() {
// 清空画布
ctx.fillStyle = 'rgba(5, 5, 15, 0.1)';
ctx.fillRect(0, 0, width, height);
// 更新数据
time += 0.1;
data.shift();
data.push(Math.sin(time) * 0.5 + Math.sin(time * 2.3) * 0.3 + Math.random() * 0.2);
// 绘制网格
ctx.strokeStyle = 'rgba(0, 255, 255, 0.1)';
ctx.lineWidth = 1;
// 水平网格线
for (let i = 0; i <= 10; i++) {
const y = i * height / 10;
ctx.beginPath();
ctx.moveTo(0, y);
ctx.lineTo(width, y);
ctx.stroke();
}
// 绘制波形
ctx.beginPath();
ctx.moveTo(0, height / 2);
for (let i = 0; i < dataPoints; i++) {
const x = i * width / dataPoints;
const y = height / 2 - data[i] * height / 3;
ctx.lineTo(x, y);
}
// 波形渐变
const gradient = ctx.createLinearGradient(0, 0, width, 0);
gradient.addColorStop(0, '#ff00ff');
gradient.addColorStop(0.5, '#00ffff');
gradient.addColorStop(1, '#8800ff');
ctx.strokeStyle = gradient;
ctx.lineWidth = 3;
ctx.stroke();
// 波形填充
ctx.lineTo(width, height);
ctx.lineTo(0, height);
ctx.closePath();
const fillGradient = ctx.createLinearGradient(0, height/2, 0, height);
fillGradient.addColorStop(0, 'rgba(0, 255, 255, 0.3)');
fillGradient.addColorStop(1, 'rgba(0, 255, 255, 0)');
ctx.fillStyle = fillGradient;
ctx.fill();
// 绘制脉冲点
const pulseIndex = Math.floor((time * 10) % dataPoints);
const pulseX = pulseIndex * width / dataPoints;
const pulseY = height / 2 - data[pulseIndex] * height / 3;
ctx.beginPath();
ctx.arc(pulseX, pulseY, 5, 0, Math.PI * 2);
ctx.fillStyle = '#00ffff';
ctx.fill();
// 脉冲光晕
ctx.beginPath();
ctx.arc(pulseX, pulseY, 15, 0, Math.PI * 2);
const glowGradient = ctx.createRadialGradient(
pulseX, pulseY, 5,
pulseX, pulseY, 15
);
glowGradient.addColorStop(0, 'rgba(0, 255, 255, 0.8)');
glowGradient.addColorStop(1, 'rgba(0, 255, 255, 0)');
ctx.fillStyle = glowGradient;
ctx.fill();
}
// 动画循环
function animateWaveform() {
requestAnimationFrame(animateWaveform);
drawWaveform();
}
// 开始动画
animateWaveform();
// 响应式调整
window.addEventListener('resize', function() {
canvas.width = canvas.clientWidth;
canvas.height = canvas.clientHeight;
});
}
// 初始化服务器网格
function initServerGrid() {
const serverGrid = document.getElementById('server-grid');
const serverCount = 20;
// 清空网格
serverGrid.innerHTML = '';
// 创建服务器节点
for (let i = 0; i < serverCount; i++) {
const serverNode = document.createElement('div');
serverNode.className = 'server-node';
// 随机设置一些服务器为异常状态
if (Math.random() < 0.1) {
serverNode.classList.add('alert');
}
serverGrid.appendChild(serverNode);
}
// 更新在线服务器计数
updateOnlineServers();
}
// 更新在线服务器计数
function updateOnlineServers() {
const serverNodes = document.querySelectorAll('.server-node');
let onlineCount = 0;
serverNodes.forEach(node => {
if (!node.classList.contains('alert')) {
onlineCount++;
}
});
document.getElementById('online-servers').textContent =
`${onlineCount}/${serverNodes.length}`;
}
// 初始化系统日志
function initSystemLogs() {
const logWindow = document.getElementById('log-window');
// 示例日志数据
const logEntries = [
{ time: '22:47:18', message: '神经网络节点 #1247 连接已建立', type: 'info' },
{ time: '22:46:55', message: '数据同步完成,吞吐量: 18.4 PB/s', type: 'success' },
{ time: '22:46:32', message: '检测到异常流量,已启动安全协议', type: 'warning' },
{ time: '22:46:10', message: '服务器集群 #3 负载均衡调整', type: 'info' },
{ time: '22:45:48', message: 'AI意识同步率更新: 87.3%', type: 'info' },
{ time: '22:45:25', message: '能源分配优化完成,效率提升 2.4%', type: 'success' },
{ time: '22:45:03', message: '用户接入请求: 1428', type: 'info' },
{ time: '22:44:41', message: '防火墙规则更新完成', type: 'info' },
{ time: '22:44:19', message: '存储系统检查: 无异常', type: 'info' },
{ time: '22:43:56', message: '备份系统: 例行备份完成', type: 'success' }
];
// 添加日志条目
logEntries.forEach(entry => {
const logEntry = document.createElement('div');
logEntry.className = 'log-entry';
const timestamp = document.createElement('span');
timestamp.className = 'log-timestamp';
timestamp.textContent = `[${entry.time}] `;
logEntry.appendChild(timestamp);
logEntry.appendChild(document.createTextNode(entry.message));
logWindow.appendChild(logEntry);
});
// 自动滚动到底部
logWindow.scrollTop = logWindow.scrollHeight;
// 定时添加新日志
setInterval(() => {
const now = new Date();
const timeStr = now.getHours().toString().padStart(2, '0') + ':' +
now.getMinutes().toString().padStart(2, '0') + ':' +
now.getSeconds().toString().padStart(2, '0');
const messages = [
'系统自检完成: 无异常',
'网络延迟: 0.8ms',
'数据包处理: 正常',
'温度监控: 正常范围',
'用户活动: 峰值时段',
'安全扫描: 无威胁检测',
'存储使用率: 74%',
'缓存命中率: 92%'
];
const randomMessage = messages[Math.floor(Math.random() * messages.length)];
const logEntry = document.createElement('div');
logEntry.className = 'log-entry';
const timestamp = document.createElement('span');
timestamp.className = 'log-timestamp';
timestamp.textContent = `[${timeStr}] `;
logEntry.appendChild(timestamp);
logEntry.appendChild(document.createTextNode(randomMessage));
logWindow.appendChild(logEntry);
// 保持日志窗口不超过50条
while (logWindow.children.length > 50) {
logWindow.removeChild(logWindow.firstChild);
}
// 自动滚动到底部
logWindow.scrollTop = logWindow.scrollHeight;
}, 5000);
}
// 更新监控数据
function updateMonitorData() {
// 更新CPU使用率
setInterval(() => {
const cpuUsage = 70 + Math.random() * 15;
document.getElementById('cpu-usage').textContent = Math.round(cpuUsage) + '%';
// 更新仪表
const canvas = document.getElementById('cpu-gauge');
if (canvas.drawGauge) {
canvas.drawGauge(Math.round(cpuUsage));
}
}, 2000);
// 更新内存使用率
setInterval(() => {
const memoryUsage = 60 + Math.random() * 10;
document.getElementById('memory-usage').textContent = Math.round(memoryUsage) + '%';
}, 3000);
// 更新网络速度
setInterval(() => {
const uploadSpeed = (0.8 + Math.random() * 0.8).toFixed(1);
const downloadSpeed = (2.0 + Math.random() * 1.6).toFixed(1);
document.getElementById('upload-speed').textContent = uploadSpeed + ' GB/s';
document.getElementById('download-speed').textContent = downloadSpeed + ' GB/s';
}, 2500);
// 随机切换服务器状态
setInterval(() => {
const serverNodes = document.querySelectorAll('.server-node');
const randomIndex = Math.floor(Math.random() * serverNodes.length);
// 切换状态
serverNodes[randomIndex].classList.toggle('alert');
// 更新在线服务器计数
updateOnlineServers();
}, 8000);
}
// 初始化时间线
function initTimeline() {
const timelineContainer = document.querySelector('.timeline-container');
const timelineTrack = document.querySelector('.timeline-track');
// 时间线数据
const timelineData = [
{ year: '2078', label: '神经网络城市上线', description: '全球首个全AI管理城市投入运行' },
{ year: '2075', label: '量子网络部署', description: '城市范围量子通信网络完成建设' },
{ year: '2072', label: '意识上传合法化', description: '数字意识存储与传输法案通过' },
{ year: '2068', label: 'AI公民权确立', description: '高级AI获得部分公民权利' },
{ year: '2065', label: '全自动基建完成', description: '城市基础设施完全自动化' },
{ year: '2060', label: '神经接口普及', description: '80%人口使用脑机接口' },
{ year: '2055', label: '气候控制上线', description: '城市级天气调控系统启用' },
{ year: '2050', label: '数字货币统一', description: '全球采用统一数字货币标准' }
];
// 创建时间线节点
timelineData.forEach((data, index) => {
const node = document.createElement('div');
node.className = 'timeline-node';
if (index === 0) node.classList.add('active');
// 计算位置
const position = (index / (timelineData.length - 1)) * 100;
node.style.left = `calc(${position}% - 10px)`;
// 创建标签
const label = document.createElement('div');
label.className = 'node-label';
label.textContent = `${data.year}: ${data.label}`;
node.appendChild(label);
timelineTrack.appendChild(node);
// 点击事件
node.addEventListener('click', function() {
// 移除所有节点的active类
document.querySelectorAll('.timeline-node').forEach(n => {
n.classList.remove('active');
});
// 添加active类到当前节点
this.classList.add('active');
// 更新城市状态显示
document.getElementById('city-status').textContent = data.label;
// 显示时间线信息
showTimelineInfo(data);
});
});
}
// 显示时间线信息
function showTimelineInfo(data) {
// 这里可以添加更复杂的逻辑比如更新3D城市视图
console.log(`切换到时间点: ${data.year} - ${data.label}`);
// 示例:更新城市信息面板
const infoPanel = document.querySelector('.city-info-panel');
infoPanel.classList.add('pulse');
setTimeout(() => {
infoPanel.classList.remove('pulse');
}, 1000);
}
// 初始化数据卡片交互
function initDataCards() {
const dataCards = document.querySelectorAll('.data-card');
dataCards.forEach(card => {
// 鼠标进入事件
card.addEventListener('mouseenter', function() {
const details = this.querySelector('.card-details');
if (details) {
details.style.display = 'block';
}
// 添加发光效果
this.style.boxShadow = '0 15px 35px rgba(0, 255, 204, 0.5)';
});
// 鼠标离开事件
card.addEventListener('mouseleave', function() {
const details = this.querySelector('.card-details');
if (details) {
details.style.display = 'none';
}
// 恢复原始发光效果
this.style.boxShadow = '';
});
// 点击事件
card.addEventListener('click', function() {
// 添加点击效果
this.style.transform = 'rotateX(0deg) translateY(-10px) scale(1.05)';
setTimeout(() => {
this.style.transform = 'rotateX(0deg) translateY(-10px)';
}, 300);
});
});
}
// 初始化控制台
function initConsole() {
const consoleInput = document.getElementById('console-input');
const consoleCursor = document.getElementById('console-cursor');
// 聚焦输入框
consoleInput.focus();
// 命令历史
const commandHistory = [];
let historyIndex = -1;
// 可用命令
const commands = {
'help': '显示可用命令列表',
'status': '显示系统状态',
'time': '显示当前时间',
'energy': '显示能源分布',
'population': '显示人口统计',
'neural': '显示神经网络状态',
'servers': '显示服务器状态',
'clear': '清空控制台输出',
'diagnostic': '运行系统诊断',
'reboot': '模拟系统重启'
};
// 输入事件
consoleInput.addEventListener('keydown', function(e) {
// 上下箭头浏览历史
if (e.key === 'ArrowUp') {
e.preventDefault();
if (commandHistory.length > 0) {
historyIndex = Math.max(historyIndex - 1, -1);
if (historyIndex === -1) {
this.value = '';
} else {
this.value = commandHistory[commandHistory.length - 1 - historyIndex];
}
}
} else if (e.key === 'ArrowDown') {
e.preventDefault();
if (commandHistory.length > 0) {
historyIndex = Math.min(historyIndex + 1, commandHistory.length);
if (historyIndex === commandHistory.length) {
this.value = '';
} else {
this.value = commandHistory[commandHistory.length - 1 - historyIndex];
}
}
} else if (e.key === 'Enter') {
e.preventDefault();
const command = this.value.trim().toLowerCase();
if (command) {
// 添加到历史
commandHistory.push(command);
historyIndex = -1;
// 执行命令
executeCommand(command);
// 清空输入框
this.value = '';
}
}
});
// 执行命令
function executeCommand(command) {
// 显示命令回显
showCommandOutput(`neuro://city2078> ${command}`);
// 执行相应操作
switch (command) {
case 'help':
showCommandOutput('可用命令:');
Object.keys(commands).forEach(cmd => {
showCommandOutput(` ${cmd} - ${commands[cmd]}`);
});
break;
case 'status':
showCommandOutput('系统状态: 在线');
showCommandOutput('神经网络: 94.7% 活跃度');
showCommandOutput('能源消耗: 18.4 TW');
showCommandOutput('服务器: 148/150 在线');
break;
case 'time':
const now = new Date(2078, 9, 23, 22, 47, 18);
showCommandOutput(`当前时间: ${now.toLocaleString()}`);
break;
case 'energy':
showCommandOutput('能源分布:');
showCommandOutput(' 神经网络: 62%');
showCommandOutput(' 基础设施: 28%');
showCommandOutput(' 其他: 10%');
break;
case 'population':
showCommandOutput('人口统计:');
showCommandOutput(' 总人口: 42.7M');
showCommandOutput(' AI公民: 18.2M');
showCommandOutput(' 人类居民: 24.5M');
break;
case 'neural':
showCommandOutput('神经网络状态:');
showCommandOutput(' 节点数: 1.24M');
showCommandOutput(' 连接数: 8.7B');
showCommandOutput(' 吞吐量: 18.4 PB/s');
break;
case 'servers':
showCommandOutput('服务器状态:');
showCommandOutput(' 在线: 148');
showCommandOutput(' 离线: 2');
showCommandOutput(' 负载: 平均 78%');
break;
case 'clear':
clearCommandOutput();
break;
case 'diagnostic':
showCommandOutput('开始系统诊断...');
setTimeout(() => showCommandOutput('✓ 神经网络: 正常'), 500);
setTimeout(() => showCommandOutput('✓ 能源系统: 正常'), 1000);
setTimeout(() => showCommandOutput('✓ 通信系统: 正常'), 1500);
setTimeout(() => showCommandOutput('✓ 安全系统: 正常'), 2000);
setTimeout(() => showCommandOutput('诊断完成: 所有系统正常'), 2500);
break;
case 'reboot':
showCommandOutput('初始化系统重启...');
showCommandOutput('警告: 此操作将中断所有服务');
showCommandOutput('输入确认代码以继续: 2078-NEURAL-CITY');
break;
default:
showCommandOutput(`未知命令: ${command}`);
showCommandOutput('输入 "help" 查看可用命令');
}
}
// 显示命令输出
function showCommandOutput(text) {
// 创建输出元素
const output = document.createElement('div');
output.className = 'log-entry';
output.style.color = '#00ff00';
output.style.marginTop = '5px';
output.textContent = text;
// 添加到控制台上方
const consoleContainer = document.querySelector('.console-container');
consoleContainer.parentNode.insertBefore(output, consoleContainer);
// 滚动到输出
output.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
// 清空命令输出
function clearCommandOutput() {
const outputs = document.querySelectorAll('.console-container ~ .log-entry');
outputs.forEach(output => {
output.remove();
});
}
}
// 更新实时时间
function updateRealTime() {
function update() {
currentTime.setSeconds(currentTime.getSeconds() + 1);
const timeString = currentTime.toISOString()
.replace('T', ' ')
.replace(/\.\d+Z/, '');
document.getElementById('current-time').textContent = timeString;
// 更新统计数据的随机波动
document.getElementById('neuron-activity').textContent =
(93 + Math.random() * 3).toFixed(1) + '%';
document.getElementById('neuron-activity-value').textContent =
(93 + Math.random() * 3).toFixed(1) + '%';
document.getElementById('data-throughput').textContent =
(17.5 + Math.random() * 1.5).toFixed(1) + ' PB/s';
document.getElementById('latency-value').textContent =
(0.7 + Math.random() * 0.3).toFixed(1) + 'ms';
document.getElementById('network-latency').textContent =
(0.7 + Math.random() * 0.3).toFixed(1) + 'ms';
document.getElementById('energy-consumption').textContent =
(17.8 + Math.random() * 1.2).toFixed(1) + ' TW';
document.getElementById('energy-value').textContent =
(17.8 + Math.random() * 1.2).toFixed(1) + ' TW';
document.getElementById('connection-stability').textContent =
(99.95 + Math.random() * 0.03).toFixed(2) + '%';
document.getElementById('ai-sync-value').textContent =
(86.5 + Math.random() * 2).toFixed(1) + '%';
}
// 每秒更新一次
setInterval(update, 1000);
update(); // 立即执行一次
}
// 各模块入场动画
function animateSectionEntrances() {
// 使用GSAP为各模块添加动画
gsap.from('.section-title', {
duration: 1,
y: 50,
opacity: 0,
stagger: 0.2,
ease: "power3.out"
});
gsap.from('.city-info-panel', {
duration: 1,
x: 100,
opacity: 0,
delay: 0.5,
ease: "power3.out"
});
gsap.from('.stat-box', {
duration: 0.8,
y: 30,
opacity: 0,
stagger: 0.1,
delay: 0.7,
ease: "back.out(1.7)"
});
gsap.from('.monitor-card', {
duration: 0.8,
y: 50,
opacity: 0,
stagger: 0.15,
delay: 1,
ease: "power3.out"
});
gsap.from('.data-card', {
duration: 0.8,
y: 50,
opacity: 0,
stagger: 0.1,
delay: 1.2,
ease: "back.out(1.7)"
});
// 为时间线节点添加动画
setTimeout(() => {
gsap.from('.timeline-node', {
duration: 0.6,
scale: 0,
opacity: 0,
stagger: 0.1,
ease: "back.out(1.7)"
});
}, 1500);
}
});
</script>
</body>
</html>