diff --git a/web_frontend/web_result/order-classes/environmental/agent-avatars b/web_frontend/web_result/order-classes/environmental/agent-avatars
new file mode 120000
index 00000000..c2cf7c6b
--- /dev/null
+++ b/web_frontend/web_result/order-classes/environmental/agent-avatars
@@ -0,0 +1 @@
+../../../../data/订单班文档资料/环保/agent头像
\ No newline at end of file
diff --git a/web_frontend/web_result/order-classes/environmental/css/styles.css b/web_frontend/web_result/order-classes/environmental/css/styles.css
new file mode 100644
index 00000000..b53eefe8
--- /dev/null
+++ b/web_frontend/web_result/order-classes/environmental/css/styles.css
@@ -0,0 +1,997 @@
+/* 地表水环境质量监测方案 - 环保订单班水质监测设计系统 */
+
+/* ========== 设计变量 ========== */
+:root {
+ /* 专业蓝绿主题 - 环保水质监测风格 */
+ --bg-dark: #f0f9ff; /* 浅蓝背景 */
+ --bg-semi-dark: rgba(240, 249, 255, 0.95); /* 半透明浅蓝 */
+ --bg-overlay: rgba(255, 255, 255, 0.85); /* 白色遮罩 */
+ --bg-card: rgba(255, 255, 255, 0.9); /* 卡片背景 */
+ --primary-dark: #0c4a6e; /* 主色深蓝 */
+ --primary-blue: #0284c7; /* 主色蓝 - 水质专业 */
+ --accent-cyan: #06b6d4; /* 青色强调 - 水质主题 */
+ --accent-cyan-light: #22d3ee; /* 浅青色 */
+ --text-light: #1a1a1a; /* 深色文字 */
+ --text-gray: #666666; /* 灰色文字 */
+ --border-light: rgba(2, 132, 199, 0.2); /* 蓝色边框 */
+ --hover-bg: rgba(6, 182, 212, 0.15); /* 悬停背景 */
+ --active-bg: rgba(2, 132, 199, 0.2); /* 激活背景 */
+
+ /* 间距系统 - 针对大屏幕优化 */
+ --spacing-xs: 0.75rem; /* 12px */
+ --spacing-sm: 1.25rem; /* 20px */
+ --spacing-md: 2rem; /* 32px */
+ --spacing-lg: 3rem; /* 48px */
+ --spacing-xl: 4rem; /* 64px */
+ --spacing-2xl: 6rem; /* 96px */
+ --spacing-3xl: 8rem; /* 128px */
+
+ /* 字体系统 */
+ --font-primary: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
+ --font-display: 'Inter', sans-serif;
+
+ /* 字体大小 - 针对大屏幕优化 */
+ --text-xs: 0.875rem; /* 14px */
+ --text-sm: 1rem; /* 16px */
+ --text-base: 1.125rem; /* 18px */
+ --text-lg: 1.375rem; /* 22px */
+ --text-xl: 1.625rem; /* 26px */
+ --text-2xl: 2rem; /* 32px */
+ --text-3xl: 2.5rem; /* 40px */
+ --text-4xl: 3rem; /* 48px */
+ --text-5xl: 4rem; /* 64px */
+
+ /* 字重 */
+ --font-light: 300;
+ --font-normal: 400;
+ --font-medium: 500;
+ --font-semibold: 600;
+ --font-bold: 700;
+
+ /* 圆角 */
+ --radius-sm: 0.375rem;
+ --radius-md: 0.5rem;
+ --radius-lg: 0.75rem;
+ --radius-xl: 1rem;
+ --radius-2xl: 1.5rem;
+ --radius-full: 9999px;
+
+ /* 阴影 - 轻盈专业主题 */
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
+ --shadow-md: 0 2px 4px rgba(0,0,0,0.08);
+ --shadow-lg: 0 4px 8px rgba(0,0,0,0.1);
+ --shadow-xl: 0 8px 16px rgba(0,0,0,0.12);
+ --shadow-cyan: 0 2px 8px rgba(6, 182, 212, 0.15);
+
+ /* 过渡 */
+ --transition-fast: 150ms ease;
+ --transition-base: 250ms ease;
+ --transition-slow: 350ms ease;
+
+ /* 布局 */
+ --container-max: 1600px; /* 增加最大宽度适配1920屏幕 */
+}
+
+/* ========== 深色主题 - 深邃蓝绿配色 ========== */
+body.dark-theme {
+ --bg-dark: #0a1929; /* 深邃蓝色背景 */
+ --bg-semi-dark: rgba(10, 25, 41, 0.95); /* 深蓝半透明 */
+ --bg-overlay: rgba(15, 30, 45, 0.85); /* 深蓝遮罩层 */
+ --bg-card: rgba(18, 35, 52, 0.9); /* 深蓝卡片背景 */
+ --primary-dark: #0c4a6e; /* 中度深蓝 */
+ --primary-blue: #0ea5e9; /* 明亮蓝 */
+ --accent-cyan: #06b6d4; /* 深青色 */
+ --accent-cyan-light: #22d3ee; /* 亮青色 */
+ --text-light: #e5f2f9; /* 浅色文字 */
+ --text-gray: #94a3b8; /* 灰色文字 */
+ --border-light: rgba(14, 165, 233, 0.25); /* 蓝色边框 */
+ --hover-bg: rgba(6, 182, 212, 0.15); /* 悬停背景 */
+ --active-bg: rgba(14, 165, 233, 0.2); /* 激活背景 */
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.4);
+ --shadow-md: 0 2px 4px rgba(0,0,0,0.5);
+ --shadow-lg: 0 4px 8px rgba(0,0,0,0.6);
+ --shadow-xl: 0 8px 16px rgba(0,0,0,0.7);
+ --shadow-cyan: 0 2px 8px rgba(6, 182, 212, 0.25);
+}
+
+/* ========== 重置样式 ========== */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+body {
+ font-family: var(--font-primary);
+ font-size: var(--text-base);
+ line-height: 1.6;
+ color: var(--text-light);
+ background-color: var(--bg-dark);
+ overflow-x: hidden;
+}
+
+/* ========== Hero 区域 - 全屏图片背景 ========== */
+.hero {
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background:
+ linear-gradient(135deg, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 0.95) 100%),
+ url('../images/长江航海图片.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+ position: relative;
+ overflow: hidden;
+}
+
+/* 深色主题下的Hero渐变 */
+body.dark-theme .hero {
+ background:
+ linear-gradient(135deg, rgba(10, 25, 41, 0.9) 0%, rgba(15, 30, 45, 0.8) 100%),
+ url('../images/长江航海图片.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+.hero::before {
+ content: '';
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 50%, rgba(6, 182, 212, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 80%, rgba(2, 132, 199, 0.05) 0%, transparent 50%);
+ pointer-events: none;
+ animation: glow 8s ease-in-out infinite;
+}
+
+@keyframes glow {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.6; }
+}
+
+.hero-content {
+ text-align: center;
+ color: var(--text-light);
+ z-index: 1;
+ position: relative;
+ padding: var(--spacing-xl);
+ max-width: 900px;
+}
+
+.hero-badge {
+ display: inline-block;
+ padding: var(--spacing-md) var(--spacing-xl);
+ background: rgba(6, 182, 212, 0.15);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border-radius: var(--radius-full);
+ font-size: var(--text-lg);
+ font-weight: var(--font-semibold);
+ letter-spacing: 0.1em;
+ margin-bottom: var(--spacing-xl);
+ border: 3px solid var(--accent-cyan);
+ box-shadow: var(--shadow-cyan);
+ text-transform: uppercase;
+ transition: all var(--transition-base);
+}
+
+.hero-badge:hover {
+ background: rgba(6, 182, 212, 0.25);
+ transform: translateY(-2px);
+}
+
+.hero-title {
+ font-size: clamp(3.5rem, 10vw, 6.5rem);
+ font-weight: var(--font-bold);
+ margin-bottom: var(--spacing-lg);
+ letter-spacing: -0.02em;
+ line-height: 1.1;
+ color: var(--accent-cyan-light);
+ text-shadow: 0 6px 30px rgba(0,0,0,0.8), 0 0 60px rgba(6, 182, 212, 0.4);
+}
+
+.hero-subtitle {
+ font-size: clamp(1.5rem, 4vw, 2.5rem);
+ font-weight: var(--font-light);
+ opacity: 0.95;
+ margin-bottom: var(--spacing-xl);
+ color: var(--text-light);
+}
+
+.hero-description {
+ font-size: var(--text-xl);
+ opacity: 0.85;
+ max-width: 800px;
+ margin: 0 auto;
+ line-height: 1.8;
+}
+
+/* ========== 导航 - 深色玻璃态 ========== */
+.nav {
+ position: sticky;
+ top: 0;
+ z-index: 100;
+ background: var(--bg-semi-dark);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border-bottom: 1px solid var(--border-light);
+ padding: var(--spacing-md) 0;
+ box-shadow: var(--shadow-md);
+}
+
+.nav-container {
+ display: flex;
+ justify-content: center;
+ gap: var(--spacing-sm);
+ flex-wrap: wrap;
+ padding: 0 var(--spacing-md);
+}
+
+.nav-item {
+ padding: var(--spacing-sm) var(--spacing-lg);
+ background: var(--bg-overlay);
+ backdrop-filter: blur(10px);
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-lg);
+ cursor: pointer;
+ transition: all var(--transition-base);
+ font-weight: var(--font-medium);
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ color: var(--text-gray);
+}
+
+.nav-item i {
+ width: 20px;
+ height: 20px;
+ stroke-width: 2;
+}
+
+.nav-item span {
+ font-size: var(--text-base);
+}
+
+.nav-item:hover {
+ background: var(--hover-bg);
+ color: var(--accent-cyan);
+ transform: translateY(-2px);
+ box-shadow: var(--shadow-cyan);
+}
+
+.nav-item.active {
+ background: var(--active-bg);
+ color: var(--primary-blue);
+ border-color: var(--primary-blue);
+ box-shadow: var(--shadow-cyan);
+}
+
+/* ========== 内容区块 - 图片背景 ========== */
+.section {
+ padding: var(--spacing-2xl) 0;
+ background: var(--bg-dark);
+ position: relative;
+}
+
+/* 浅色图片背景 - 每个区块使用不同图片 */
+.section:nth-child(1) {
+ background-image:
+ linear-gradient(to bottom, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 1) 100%),
+ url('../images/长江采样布点图.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+.section:nth-child(2) {
+ background-image:
+ linear-gradient(to bottom, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 1) 100%),
+ url('../images/地表水环境质量标准示意图.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+.section:nth-child(3) {
+ background-image:
+ linear-gradient(to bottom, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 1) 100%),
+ url('../images/采样仪器设备.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+.section:nth-child(4) {
+ background-image:
+ linear-gradient(to bottom, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 1) 100%),
+ url('../images/检测仪器.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+.section:nth-child(5) {
+ background-image:
+ linear-gradient(to bottom, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 1) 100%),
+ url('../images/质量控制措施.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+.section:nth-child(6) {
+ background-image:
+ linear-gradient(to bottom, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 1) 100%),
+ url('../images/现场数据采集记录.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+/* 通用奇偶区块(当超过6个section时) */
+.section:nth-child(n+7):nth-child(odd) {
+ background-image:
+ linear-gradient(to bottom, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 1) 100%),
+ url('../images/文件输出与报告图标.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+.section:nth-child(n+7):nth-child(even) {
+ background-image:
+ linear-gradient(to bottom, rgba(240, 249, 255, 0.9) 0%, rgba(224, 242, 254, 1) 100%),
+ url('../images/生物指标示意图.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+/* 深色主题下的区块背景 - 每个区块使用对应图片 */
+body.dark-theme .section:nth-child(1) {
+ background-image:
+ linear-gradient(to bottom, rgba(10, 25, 41, 0.92) 0%, rgba(15, 30, 45, 0.88) 100%),
+ url('../images/长江采样布点图.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+body.dark-theme .section:nth-child(2) {
+ background-image:
+ linear-gradient(to bottom, rgba(15, 30, 45, 0.90) 0%, rgba(10, 25, 41, 0.88) 100%),
+ url('../images/地表水环境质量标准示意图.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+body.dark-theme .section:nth-child(3) {
+ background-image:
+ linear-gradient(to bottom, rgba(10, 25, 41, 0.92) 0%, rgba(15, 30, 45, 0.88) 100%),
+ url('../images/采样仪器设备.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+body.dark-theme .section:nth-child(4) {
+ background-image:
+ linear-gradient(to bottom, rgba(15, 30, 45, 0.90) 0%, rgba(10, 25, 41, 0.88) 100%),
+ url('../images/检测仪器.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+body.dark-theme .section:nth-child(5) {
+ background-image:
+ linear-gradient(to bottom, rgba(10, 25, 41, 0.92) 0%, rgba(15, 30, 45, 0.88) 100%),
+ url('../images/质量控制措施.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+body.dark-theme .section:nth-child(6) {
+ background-image:
+ linear-gradient(to bottom, rgba(15, 30, 45, 0.90) 0%, rgba(10, 25, 41, 0.88) 100%),
+ url('../images/现场数据采集记录.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+/* 通用奇偶区块(当超过6个section时) */
+body.dark-theme .section:nth-child(n+7):nth-child(odd) {
+ background-image:
+ linear-gradient(to bottom, rgba(10, 25, 41, 0.92) 0%, rgba(15, 30, 45, 0.88) 100%),
+ url('../images/文件输出与报告图标.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+body.dark-theme .section:nth-child(n+7):nth-child(even) {
+ background-image:
+ linear-gradient(to bottom, rgba(15, 30, 45, 0.90) 0%, rgba(10, 25, 41, 0.88) 100%),
+ url('../images/生物指标示意图.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+}
+
+/* 深色主题下的特定元素调整 */
+body.dark-theme .stat-item {
+ background: rgba(18, 35, 52, 0.8);
+ backdrop-filter: blur(5px);
+}
+
+body.dark-theme .stat-item:hover {
+ background: rgba(14, 165, 233, 0.15);
+ border-color: var(--primary-blue);
+}
+
+body.dark-theme .stat-value {
+ color: var(--accent-cyan-light);
+}
+
+body.dark-theme th {
+ background: rgba(14, 165, 233, 0.12);
+ color: var(--accent-cyan-light);
+}
+
+body.dark-theme tr:hover {
+ background: rgba(14, 165, 233, 0.08);
+}
+
+.container {
+ max-width: var(--container-max);
+ margin: 0 auto;
+ padding: 0 var(--spacing-md);
+}
+
+.section-header {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-lg);
+ margin-bottom: var(--spacing-xl);
+ padding: var(--spacing-lg);
+ background: var(--bg-card);
+ backdrop-filter: blur(15px);
+ -webkit-backdrop-filter: blur(15px);
+ border-radius: var(--radius-xl);
+ border: 2px solid var(--border-light);
+ box-shadow: var(--shadow-md);
+}
+
+.agent-avatar {
+ width: 100px;
+ height: 100px;
+ border-radius: var(--radius-xl);
+ object-fit: cover;
+ border: 3px solid var(--primary-blue);
+ box-shadow: var(--shadow-md);
+ transition: all var(--transition-base);
+}
+
+.agent-avatar:hover {
+ transform: scale(1.05);
+ box-shadow: var(--shadow-lg);
+ border-color: var(--accent-cyan);
+}
+
+.agent-info {
+ flex: 1;
+}
+
+.agent-name {
+ font-size: var(--text-lg);
+ color: var(--primary-blue);
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ margin-bottom: var(--spacing-sm);
+ font-weight: var(--font-semibold);
+}
+
+.section-title {
+ font-size: var(--text-4xl);
+ font-weight: var(--font-bold);
+ color: var(--text-light);
+ letter-spacing: -0.01em;
+ text-shadow: none;
+ position: relative;
+ padding-bottom: var(--spacing-sm);
+}
+
+.section-title::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 180px;
+ height: 4px;
+ background: linear-gradient(90deg, var(--accent-cyan), transparent);
+ border-radius: 2px;
+}
+
+.section-content {
+ max-width: 100%;
+ margin: 0 auto;
+}
+
+.expert-intro {
+ background: var(--bg-card);
+ backdrop-filter: blur(15px);
+ -webkit-backdrop-filter: blur(15px);
+ border-radius: var(--radius-xl);
+ padding: var(--spacing-lg);
+ margin-bottom: var(--spacing-xl);
+ border: 2px solid var(--border-light);
+ box-shadow: var(--shadow-md);
+}
+
+.expert-intro h3 {
+ font-size: var(--text-2xl);
+ color: var(--primary-blue);
+ margin-bottom: var(--spacing-lg);
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-md);
+}
+
+.expert-intro p {
+ color: var(--text-gray);
+ line-height: 1.8;
+ font-size: var(--text-lg);
+}
+
+/* ========== 网格布局 - 针对大屏幕优化,更大气的布局 ========== */
+.grid {
+ display: grid;
+ gap: var(--spacing-2xl);
+}
+
+.grid-2 {
+ grid-template-columns: repeat(2, 1fr);
+}
+
+.grid-3 {
+ grid-template-columns: repeat(2, 1fr);
+}
+
+.grid-4 {
+ grid-template-columns: repeat(3, 1fr);
+}
+
+/* ========== 卡片 - 图片优先布局 ========== */
+.card {
+ background: var(--bg-card);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ border-radius: var(--radius-2xl);
+ overflow: hidden;
+ border: 2px solid var(--border-light);
+ transition: all var(--transition-base);
+ box-shadow: var(--shadow-md);
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+}
+
+.card:hover {
+ transform: translateY(-8px);
+ box-shadow: var(--shadow-xl), var(--shadow-cyan);
+ border-color: var(--accent-cyan);
+}
+
+.card-header {
+ padding: var(--spacing-xl);
+ background: var(--bg-semi-dark);
+ border-bottom: 2px solid var(--border-light);
+ order: 2;
+}
+
+.card-title {
+ font-size: var(--text-2xl);
+ font-weight: var(--font-semibold);
+ color: var(--primary-blue);
+ margin-bottom: var(--spacing-sm);
+}
+
+.card-body {
+ padding: var(--spacing-xl);
+ order: 3;
+ flex: 1;
+}
+
+/* ========== 图片容器 - 突出展示 - 超大气布局 ========== */
+.image-container {
+ width: 100%;
+ aspect-ratio: 3/2;
+ overflow: hidden;
+ border-radius: 0;
+ margin-bottom: 0;
+ background: rgba(0,0,0,0.5);
+ position: relative;
+ box-shadow: none;
+ border: none;
+ transition: all var(--transition-base);
+ order: 1;
+ flex-shrink: 0;
+}
+
+.image-container img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ transition: transform var(--transition-slow);
+ filter: brightness(0.9);
+}
+
+.image-container:hover img {
+ transform: scale(1.1);
+ filter: brightness(1.1);
+}
+
+.image-caption {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: var(--spacing-md);
+ background: linear-gradient(to top, rgba(0,0,0,0.9), transparent);
+ color: var(--text-light);
+ font-size: var(--text-sm);
+ font-weight: var(--font-medium);
+ text-align: center;
+ transform: translateY(100%);
+ transition: transform var(--transition-base);
+}
+
+.image-container:hover .image-caption {
+ transform: translateY(0);
+}
+
+/* ========== 列表 ========== */
+.feature-list {
+ list-style: none;
+ padding: 0;
+}
+
+.feature-list li {
+ padding: var(--spacing-sm) 0;
+ border-bottom: 1px solid var(--border-light);
+ color: var(--text-gray);
+ transition: all var(--transition-fast);
+}
+
+.feature-list li:hover {
+ color: var(--primary-blue);
+ padding-left: var(--spacing-sm);
+}
+
+.feature-list li:last-child {
+ border-bottom: none;
+}
+
+/* ========== 统计数据 ========== */
+.stats {
+ display: flex;
+ gap: var(--spacing-md);
+ padding: var(--spacing-lg);
+ background: var(--bg-overlay);
+ backdrop-filter: blur(10px);
+ border-radius: var(--radius-lg);
+ border: 1px solid var(--border-light);
+}
+
+.stat-item {
+ flex: 1;
+ text-align: center;
+ padding: var(--spacing-md);
+ border-radius: var(--radius-md);
+ background: var(--bg-card);
+ border: 1px solid transparent;
+ transition: all var(--transition-base);
+}
+
+.stat-item:hover {
+ background: var(--hover-bg);
+ transform: translateY(-4px);
+ border-color: var(--border-light);
+ box-shadow: var(--shadow-md);
+}
+
+.stat-label {
+ font-size: var(--text-sm);
+ color: var(--text-gray);
+ margin-bottom: var(--spacing-xs);
+}
+
+.stat-value {
+ font-size: var(--text-2xl);
+ font-weight: var(--font-bold);
+ color: var(--primary-blue);
+ text-shadow: none;
+}
+
+/* ========== 表格 ========== */
+.table-container {
+ overflow-x: auto;
+ margin: var(--spacing-xl) 0;
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-lg);
+}
+
+table {
+ width: 100%;
+ border-collapse: collapse;
+ background: var(--bg-card);
+ backdrop-filter: blur(10px);
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+}
+
+th {
+ background: var(--active-bg);
+ color: var(--primary-blue);
+ padding: var(--spacing-md);
+ text-align: left;
+ font-weight: var(--font-semibold);
+ border-bottom: 2px solid var(--primary-blue);
+}
+
+td {
+ padding: var(--spacing-md);
+ border-bottom: 1px solid var(--border-light);
+ color: var(--text-gray);
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+
+tr:hover {
+ background: var(--hover-bg);
+}
+
+/* ========== 响应式 ========== */
+@media (max-width: 768px) {
+ :root {
+ --spacing-sm: 0.75rem;
+ --spacing-md: 1rem;
+ --spacing-lg: 1.5rem;
+ --spacing-xl: 2rem;
+ --spacing-2xl: 3rem;
+ --spacing-3xl: 4rem;
+ }
+
+ .hero {
+ background-attachment: scroll;
+ }
+
+ .section:nth-child(odd),
+ .section:nth-child(even) {
+ background-attachment: scroll;
+ }
+
+ .hero-content {
+ padding: var(--spacing-lg);
+ }
+
+ .nav-container {
+ gap: var(--spacing-xs);
+ }
+
+ .nav-item {
+ padding: var(--spacing-xs) var(--spacing-md);
+ font-size: var(--text-sm);
+ }
+
+ .section {
+ padding: var(--spacing-2xl) 0;
+ }
+
+ .grid-2,
+ .grid-3,
+ .grid-4 {
+ grid-template-columns: 1fr;
+ }
+
+ .section-header {
+ flex-direction: column;
+ text-align: center;
+ }
+
+ .stats {
+ flex-direction: column;
+ }
+}
+
+/* ========== 动画 ========== */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes slideIn {
+ from {
+ opacity: 0;
+ transform: translateX(-20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+
+@keyframes shimmer {
+ 0% {
+ background-position: -1000px 0;
+ }
+ 100% {
+ background-position: 1000px 0;
+ }
+}
+
+.fade-in {
+ animation: fadeIn 0.6s ease forwards;
+}
+
+.slide-in {
+ animation: slideIn 0.6s ease forwards;
+}
+
+/* ========== 工具类 ========== */
+.text-center { text-align: center; }
+.text-left { text-align: left; }
+.text-right { text-align: right; }
+
+.mt-sm { margin-top: var(--spacing-sm); }
+.mt-md { margin-top: var(--spacing-md); }
+.mt-lg { margin-top: var(--spacing-lg); }
+.mt-xl { margin-top: var(--spacing-xl); }
+
+.mb-sm { margin-bottom: var(--spacing-sm); }
+.mb-md { margin-bottom: var(--spacing-md); }
+.mb-lg { margin-bottom: var(--spacing-lg); }
+.mb-xl { margin-bottom: var(--spacing-xl); }
+
+.hidden { display: none; }
+.block { display: block; }
+.flex { display: flex; }
+.grid { display: grid; }
+
+.gap-sm { gap: var(--spacing-sm); }
+.gap-md { gap: var(--spacing-md); }
+.gap-lg { gap: var(--spacing-lg); }
+
+/* ========== 图片加载状态 ========== */
+img {
+ transition: opacity var(--transition-base);
+}
+
+img.loaded {
+ opacity: 1;
+}
+
+img.error {
+ opacity: 0.5;
+ filter: grayscale(1);
+}
+
+/* ========== SVG图标尺寸统一管理 ========== */
+.hero-description i[data-lucide] {
+ width: 24px !important;
+ height: 24px !important;
+ display: inline-block !important;
+ vertical-align: middle !important;
+ margin-right: 8px !important;
+}
+
+.agent-name i[data-lucide] {
+ width: 20px !important;
+ height: 20px !important;
+ display: inline-block !important;
+ vertical-align: middle !important;
+ margin-right: 8px !important;
+}
+
+.expert-intro h3 i[data-lucide] {
+ width: 40px !important;
+ height: 40px !important;
+ display: inline-block !important;
+ vertical-align: middle !important;
+ margin-right: 10px !important;
+}
+
+.feature-list li i[data-lucide] {
+ width: 18px !important;
+ height: 18px !important;
+ display: inline-block !important;
+ vertical-align: middle !important;
+ margin-right: 8px !important;
+}
+
+.nav-item i[data-lucide] {
+ width: 20px !important;
+ height: 20px !important;
+ display: block !important;
+ margin: 0 auto 4px !important;
+}
+
+/* ========== 主题切换按钮 ========== */
+.theme-toggle {
+ position: fixed;
+ top: 24px;
+ right: 24px;
+ z-index: 1000;
+}
+
+.theme-toggle-btn {
+ position: relative;
+ width: 64px;
+ height: 32px;
+ background: var(--bg-card);
+ border: 2px solid var(--border-light);
+ border-radius: var(--radius-full);
+ cursor: pointer;
+ padding: 0;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 6px;
+ transition: all var(--transition-base);
+ box-shadow: var(--shadow-md);
+}
+
+.theme-toggle-btn:hover {
+ transform: scale(1.05);
+ box-shadow: var(--shadow-lg);
+}
+
+.theme-toggle-btn:active {
+ transform: scale(0.95);
+}
+
+.theme-icon {
+ width: 18px !important;
+ height: 18px !important;
+ transition: all var(--transition-base);
+ color: var(--text-gray);
+}
+
+body:not(.dark-theme) .theme-icon-light {
+ color: var(--accent-cyan);
+ transform: scale(1.2);
+}
+
+body:not(.dark-theme) .theme-icon-dark {
+ opacity: 0.5;
+}
+
+body.dark-theme .theme-icon-dark {
+ color: var(--primary-blue);
+ transform: scale(1.2);
+}
+
+body.dark-theme .theme-icon-light {
+ opacity: 0.5;
+}
diff --git a/web_frontend/web_result/order-classes/environmental/images b/web_frontend/web_result/order-classes/environmental/images
new file mode 120000
index 00000000..31532bae
--- /dev/null
+++ b/web_frontend/web_result/order-classes/environmental/images
@@ -0,0 +1 @@
+../../../../data/订单班文档资料/环保/notion文稿/image
\ No newline at end of file
diff --git a/web_frontend/web_result/order-classes/environmental/index.html b/web_frontend/web_result/order-classes/environmental/index.html
new file mode 100644
index 00000000..cf77f16a
--- /dev/null
+++ b/web_frontend/web_result/order-classes/environmental/index.html
@@ -0,0 +1,981 @@
+
+
+
+
+
+ 某地表水环境质量考核断面水质采样方案 - 环保订单班
+
+
+
+
+
+
+
+
+
+
+
+
+
🌊 环保订单班
+
地表水环境质量监测方案
+
长江国考断面水质采样项目
+
+ 26项水质指标全面监测
+ 8大专业Agent协同作业
+ 符合GB 3838-2002国家标准
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
项目背景概况
+
受广东市生态环境局委托,对长江国考断面进行定期水质监测,评估其是否符合地表水Ⅲ类功能水体标准。监测数据将为地方政府水质管理政策提供数据支持,并为年度水质考核提供可靠依据。
+
+
+
+
![长江监测断面]()
+
长江国考"长江大桥"断面位置
+
+
+
+
+
+
+
+ - 评估地表水Ⅲ类标准符合性
+ - 为年度水质考核提供依据
+ - 支撑环境保护决策
+ - 污染控制措施制定
+
+
+
+
+
+
+
+
+ - 断面:长江大桥断面
+ - 坐标:E 114.3120°, N 30.5921°
+ - 河宽:85米
+ - 水深:1.8-5.2米(枯/丰水期)
+
+
+
+
+
+
+
法律法规依据
+
+
+
+
![环境保护法]()
+
+
+
《中华人民共和国环境保护法》
+
水质监测数据必须具有公信力,符合国家环境保护要求
+
+
+
+
+
![水污染防治法]()
+
+
+
《水污染防治法》
+
规定水质监测、污染源排放管控及水体自净能力保护
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
监测指标体系
+
根据监测任务需求,考核的水质指标包括理化指标、营养盐、重金属、有机污染物及生物指标,共26项关键参数,严格按照GB 3838-2002和HJ/T 91-2022标准执行。
+
+
+
+
+
![地表水环境质量标准]()
+
地表水环境质量标准
+
+
+
![监测技术规范]()
+
地表水监测技术规范
+
+
+
+
+
+
+
+ | 指标类别 |
+ 监测项目 |
+ 检测方法 |
+ 保存要求 |
+
+
+
+
+ | 理化指标 |
+ pH、DO、CODCr、BOD5、NH₃-N |
+ 现场+实验室 |
+ 现场测定 |
+
+
+ | 营养盐 |
+ TN、TP、Chl-a |
+ 实验室分析 |
+ H₂SO₄保存,7天 |
+
+
+ | 重金属 |
+ As、Hg、Cd、Pb、Cr⁶⁺、Cu、Zn、Ni |
+ 实验室分析 |
+ HNO₃保存,180天 |
+
+
+ | 有机物 |
+ 石油类、挥发酚、CN⁻、硫化物等 |
+ 实验室分析 |
+ NaOH保存,7天 |
+
+
+ | 生物指标 |
+ 粪大肠菌群、总大肠菌群 |
+ 实验室培养 |
+ 硫代硫酸钠,6小时 |
+
+
+
+
+
+
+
+
+
![营养盐监测]()
+
+
+
+
总氮、总磷、叶绿素a等营养盐指标分析,评估水体富营养化风险。
+
+
+
+
+
+
![重金属检测]()
+
+
+
+
砷、汞、镉、铅等8项重金属元素检测,保障水质安全。
+
+
+
+
+
+
![有机物分析]()
+
+
+
+
石油类、挥发酚、苯系物等有机污染物全面筛查。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
采样点位布设
+
根据河流宽度和水深条件,在断面设置3个垂线(左、中、右),每个垂线设置2-3个采样深度点,确保样品代表性。丰水期采集上、中、下层样品,枯水期采集上、下层样品。
+
+
+
+
+
![采样布点图]()
+
长江采样断面布点图
+
+
+
![河流断面位置]()
+
河流断面位置示意
+
+
+
+
+
+
+
![水流分布]()
+
+
+
+
通过流速仪测定各垂线水流分布,优化采样点位选择。
+
+
+
+
+
+
![垂线分布]()
+
+
+
+
+
+
+
+
![采样流程]()
+
+
+
+
标准化采样流程,从准备、采集到保存全程规范操作。
+
+
+
+
+
+
采样设备与工具
+
+
+
+
![采样仪器]()
+
+
+
专业采样设备
+
+ - 有机玻璃采水器
+ - GPS定位系统
+ - 便携式水质仪
+ - 保温箱与冰袋
+
+
+
+
+
+
![现场采样]()
+
+
+
现场操作规范
+
+ - 样品容器预处理
+ - 现场参数测定
+ - 样品标识编码
+ - 保存剂添加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
实验室检测体系
+
配备ICP-MS、GC-MS、分光光度计等先进检测设备,采用国家标准方法进行26项水质指标分析。所有检测方法均经过CMA认证,确保数据准确可靠。
+
+
+
+
![检测仪器设备]()
+
实验室检测仪器设备
+
+
+
+
+
+
+
+ - ICP-MS重金属检测
+ - 原子吸收光谱
+ - 紫外分光光度
+ - 荧光光谱分析
+
+
+
+
+
+
+
+
+ - GC-MS有机物检测
+ - 液相色谱分析
+ - 离子色谱法
+ - 气相色谱法
+
+
+
+
+
+
+
+
+ - BOD5生化需氧量
+ - 微生物培养法
+ - 酶标仪检测
+ - 生物指标分析
+
+
+
+
+
+
+
数据处理流程
+
+
+
+
![采样表]()
+
+
+
采样记录表
+
+
+
+
+
![数据采集]()
+
+
+
数据采集
+
+
+
+
+
![数据审核]()
+
+
+
数据审核
+
+
+
+
+
![数据存档]()
+
+
+
数据存档
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
全程质量保证
+
建立从采样到报告的全程质量控制体系,包括现场质控、实验室质控和数据质控三个层次。现场空白、平行样比例≥10%,加标回收率85-115%,相对偏差≤20%。
+
+
+
+
+
+
![质量控制措施]()
+
+
+
+
+ - 现场空白样品(10%)
+ - 平行样采集分析
+ - 仪器校准验证
+ - GPS精准定位
+
+
+
+
+
+
+
+
+ - 标准物质验证
+ - 加标回收试验
+ - 空白试验对照
+ - 精密度控制
+
+
+
+
+
+
+
+
+
+ | 质控指标 |
+ 控制要求 |
+ 实施方法 |
+ 合格标准 |
+
+
+
+
+ | 现场空白 |
+ ≥10%样品数 |
+ 纯水现场暴露 |
+ 不得检出目标物 |
+
+
+ | 平行样 |
+ ≥10%样品数 |
+ 同点位同时采样 |
+ 相对偏差≤20% |
+
+
+ | 加标回收 |
+ 每批次1-2个 |
+ 已知浓度标准添加 |
+ 回收率85-115% |
+
+
+ | 标准物质 |
+ 每批次检测 |
+ 国家标准物质验证 |
+ 在保证值范围内 |
+
+
+ | 仪器校准 |
+ 每日检测前 |
+ 标准曲线验证 |
+ R²≥0.995 |
+
+
+
+
+
+
+
技术规范依据
+
+
+
+
![排放标准]()
+
+
+
工业企业水污染物排放标准
+
GB 8978-1996及行业特定标准
+
+
+
+
+
![综合标准]()
+
+
+
污水综合排放标准
+
GB 3838-2002 地表水环境质量标准
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
费用预算明细
+
项目总预算约45万元,包含采样费用、检测分析费用、质量控制费用、人员及设备费用等。检测费用占比最大(55%),其次是人员及差旅费用(25%),设备及耗材费用(15%),质控及其他费用(5%)。
+
+
+
+
+
+
+ | 费用项目 |
+ 单价/次 |
+ 数量/频次 |
+ 小计(万元) |
+ 占比 |
+
+
+
+
+ | 采样作业费 |
+ 8000元/次 |
+ 12次/年 |
+ 9.6 |
+ 21% |
+
+
+ | 检测分析费 |
+ 1800元/样品 |
+ 144样品/年 |
+ 25.9 |
+ 58% |
+
+
+ | 质量控制费 |
+ 500元/批 |
+ 12批/年 |
+ 0.6 |
+ 1% |
+
+
+ | 人员差旅费 |
+ 2000元/次 |
+ 12次/年 |
+ 2.4 |
+ 5% |
+
+
+ | 设备耗材费 |
+ - |
+ - |
+ 4.5 |
+ 10% |
+
+
+ | 报告编制费 |
+ 5000元/份 |
+ 4份/年 |
+ 2.0 |
+ 4% |
+
+
+
+
+ | 合计 |
+ 45.0 |
+ 100% |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
交付成果清单
+
每季度提交1份季度监测报告,全年共4份。报告包含监测数据汇总、水质达标分析、污染趋势评估、改善建议等内容。同时提交原始记录、质控数据、电子数据库等附件材料。
+
+
+
+
+
+
![监测报告]()
+
+
+
+
+ - 监测数据汇总表
+ - 水质达标评价
+ - 污染趋势分析
+ - 改善建议措施
+
+
+
+
+
+
+
+
+ - 采样原始记录
+ - 实验室检测报告
+ - 质控数据记录
+ - 电子数据库
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
年度监测计划
+
全年12次监测,每月1次,涵盖丰水期、平水期、枯水期不同水文条件。重点关注汛期(6-9月)和枯水期(12-2月)的水质变化,及时预警污染风险。
+
+
+
+
+
+
+ | 监测月份 |
+ 水文期 |
+ 重点关注指标 |
+ 特别说明 |
+
+
+
+
+ | 1-2月 |
+ 枯水期 |
+ DO、氨氮、重金属 |
+ 水量小,污染物浓度高 |
+
+
+ | 3-5月 |
+ 平水期 |
+ 营养盐、有机物 |
+ 春季藻类易繁殖 |
+
+
+ | 6-9月 |
+ 丰水期 |
+ COD、悬浮物、粪大肠菌群 |
+ 汛期面源污染增加 |
+
+
+ | 10-12月 |
+ 平水-枯水期 |
+ 总氮、总磷 |
+ 水量递减,富营养化风险 |
+
+
+
+
+
+
+
+
+
![生物指标监测]()
+
+
+
+
粪大肠菌群、总大肠菌群等生物指标,评估水体卫生学安全性。
+
+
+
+
+
+
+
+ - 项目经理 1名
+ - 采样技术员 3名
+ - 检测分析员 4名
+ - 质量控制员 1名
+ - 报告编制员 1名
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 项目成果总结
+
+
+
+
+
+
+
+ - 采样方案报告
+ - 季度监测报告(4份)
+ - 年度总结报告
+ - 监测数据库
+ - 现场照片资料
+ - 质控记录文件
+ - 趋势分析图表
+ - 改善建议方案
+
+
+
+
+
+
+
+
+ - 26项指标全覆盖
+ - Ⅲ类水质达标率≥90%
+ - 12次/年定期监测
+ - 数据准确度≥95%
+ - 质控样本≥10%
+ - 报告及时提交
+ - 污染趋势预警
+ - CMA资质认证
+
+
+
+
+
+
+
+
+ - ICP-MS检测设备
+ - GC-MS分析仪器
+ - BOD培养箱
+ - 自动采样器
+ - GPS定位系统
+ - 数据传输系统
+ - LIMS实验室系统
+ - 三级质控体系
+
+
+
+
+
+
+
🌊 长江国考断面水质采样项目圆满完成!
+
© 2024 环保订单班 | AI驱动的环境监测解决方案
+
+
+
+
+
+
+
diff --git a/web_frontend/web_result/order-classes/environmental/js/main.js b/web_frontend/web_result/order-classes/environmental/js/main.js
new file mode 100644
index 00000000..2f4049f3
--- /dev/null
+++ b/web_frontend/web_result/order-classes/environmental/js/main.js
@@ -0,0 +1,263 @@
+// 地表水环境质量监测方案 - 主要JavaScript逻辑
+
+// 页面初始化
+document.addEventListener('DOMContentLoaded', function() {
+ console.log('🌊 环保订单班水质监测页面加载完成');
+
+ // 初始化Lucide图标
+ if (typeof lucide !== 'undefined') {
+ lucide.createIcons();
+ }
+
+ // 初始化组件
+ initNavigation();
+ initAnimations();
+ initLazyLoading();
+ initSmoothScroll();
+ updateStats();
+ initThemeToggle();
+});
+
+// 导航功能
+function initNavigation() {
+ const navItems = document.querySelectorAll('.nav-item');
+ const sections = document.querySelectorAll('.section');
+
+ // 点击导航项滚动到对应区块
+ navItems.forEach((item, index) => {
+ item.addEventListener('click', () => {
+ // 移除所有活跃状态
+ navItems.forEach(nav => nav.classList.remove('active'));
+ // 添加当前活跃状态
+ item.classList.add('active');
+
+ // 滚动到对应区块
+ if (sections[index]) {
+ const targetSection = sections[index];
+ const offsetTop = targetSection.offsetTop - 100;
+
+ window.scrollTo({
+ top: offsetTop,
+ behavior: 'smooth'
+ });
+ }
+ });
+ });
+
+ // 滚动时更新导航活跃状态
+ window.addEventListener('scroll', () => {
+ let current = '';
+ sections.forEach((section, index) => {
+ const sectionTop = section.offsetTop - 150;
+ if (scrollY >= sectionTop) {
+ current = index;
+ }
+ });
+
+ navItems.forEach((item, index) => {
+ item.classList.remove('active');
+ if (index === current) {
+ item.classList.add('active');
+ }
+ });
+ });
+}
+
+// 动画初始化
+function initAnimations() {
+ // 使用 Intersection Observer 实现滚动动画
+ const observerOptions = {
+ root: null,
+ rootMargin: '0px',
+ threshold: 0.1
+ };
+
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ entry.target.classList.add('fade-in');
+ observer.unobserve(entry.target);
+ }
+ });
+ }, observerOptions);
+
+ // 观察所有需要动画的元素
+ const animatedElements = document.querySelectorAll('.card, .expert-intro');
+ animatedElements.forEach(el => {
+ el.style.opacity = '0';
+ observer.observe(el);
+ });
+}
+
+// 图片懒加载
+function initLazyLoading() {
+ const images = document.querySelectorAll('img[data-src]');
+
+ const imageObserver = new IntersectionObserver((entries, observer) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ const img = entry.target;
+ const src = img.getAttribute('data-src');
+
+ // 创建新图片对象来预加载
+ const tempImg = new Image();
+ tempImg.onload = function() {
+ img.src = src;
+ img.classList.add('loaded');
+ };
+ tempImg.onerror = function() {
+ // 如果图片加载失败,使用占位图
+ img.src = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="400" height="300" viewBox="0 0 400 300"%3E%3Crect width="400" height="300" fill="%23e0f2fe"/%3E%3Ctext x="50%25" y="50%25" dominant-baseline="middle" text-anchor="middle" font-family="system-ui" font-size="20" fill="%230284c7"%3E图片加载中%3C/text%3E%3C/svg%3E';
+ img.classList.add('error');
+ };
+ tempImg.src = src;
+
+ img.removeAttribute('data-src');
+ observer.unobserve(img);
+ }
+ });
+ });
+
+ images.forEach(img => {
+ imageObserver.observe(img);
+ });
+}
+
+// 平滑滚动
+function initSmoothScroll() {
+ // 为所有锚点链接添加平滑滚动
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ e.preventDefault();
+ const targetId = this.getAttribute('href');
+ if (targetId === '#') return;
+
+ const target = document.querySelector(targetId);
+ if (target) {
+ target.scrollIntoView({
+ behavior: 'smooth',
+ block: 'start'
+ });
+ }
+ });
+ });
+}
+
+// 更新统计数据 - 环保监测数据
+function updateStats() {
+ // 动画数字增长效果 - 环保水质监测相关数据
+ const stats = [
+ { selector: '.monitoring-points', value: 144, suffix: '个' },
+ { selector: '.quality-indicators', value: 26, suffix: '项' },
+ { selector: '.sampling-frequency', value: 12, suffix: '次/年' },
+ { selector: '.data-accuracy', value: 95, suffix: '%' },
+ { selector: '.quality-control', value: 10, suffix: '%' },
+ { selector: '.project-budget', value: 45, suffix: '万元' },
+ { selector: '.team-members', value: 10, suffix: '人' },
+ { selector: '.monitoring-cycle', value: 12, suffix: '个月' }
+ ];
+
+ stats.forEach(stat => {
+ const element = document.querySelector(stat.selector);
+ if (element) {
+ animateValue(element, 0, stat.value, 2000, stat.suffix);
+ }
+ });
+}
+
+// 数字动画函数
+function animateValue(element, start, end, duration, suffix = '') {
+ const startTime = performance.now();
+
+ function update(currentTime) {
+ const elapsed = currentTime - startTime;
+ const progress = Math.min(elapsed / duration, 1);
+
+ // 使用缓动函数
+ const easeOutQuad = progress * (2 - progress);
+ const current = Math.floor(start + (end - start) * easeOutQuad);
+
+ element.textContent = current + suffix;
+
+ if (progress < 1) {
+ requestAnimationFrame(update);
+ }
+ }
+
+ requestAnimationFrame(update);
+}
+
+// 错误处理
+window.addEventListener('error', function(e) {
+ if (e.target.tagName === 'IMG') {
+ console.warn('图片加载失败:', e.target.src);
+ e.target.src = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="400" height="300" viewBox="0 0 400 300"%3E%3Crect width="400" height="300" fill="%23e0f2fe"/%3E%3Ctext x="50%25" y="50%25" dominant-baseline="middle" text-anchor="middle" font-family="system-ui" font-size="20" fill="%230284c7"%3E图片暂时无法显示%3C/text%3E%3C/svg%3E';
+ e.target.classList.add('error');
+ }
+}, true);
+
+// 移动端优化
+if ('ontouchstart' in window) {
+ document.body.classList.add('touch-device');
+
+ // 移动端点击优化
+ let touchStartTime;
+ document.addEventListener('touchstart', () => {
+ touchStartTime = Date.now();
+ });
+
+ document.addEventListener('touchend', (e) => {
+ const touchEndTime = Date.now();
+ if (touchEndTime - touchStartTime < 200) {
+ // 快速点击
+ e.preventDefault();
+ }
+ });
+}
+
+// 性能监控
+if (window.performance && window.performance.timing) {
+ window.addEventListener('load', () => {
+ setTimeout(() => {
+ const timing = window.performance.timing;
+ const loadTime = timing.loadEventEnd - timing.navigationStart;
+ console.log(`页面加载时间: ${loadTime}ms`);
+
+ // 如果加载时间过长,提示用户
+ if (loadTime > 3000) {
+ console.warn('页面加载时间较长,可能需要优化');
+ }
+ }, 0);
+ });
+}
+
+// 主题切换功能
+function initThemeToggle() {
+ const themeToggleBtn = document.getElementById('themeToggleBtn');
+
+ // 从localStorage读取用户的主题偏好
+ const savedTheme = localStorage.getItem('theme');
+ // 如果没有保存的偏好,默认使用暗色主题
+ if (savedTheme === 'dark' || savedTheme === null) {
+ document.body.classList.add('dark-theme');
+ }
+
+ // 点击切换主题
+ if (themeToggleBtn) {
+ themeToggleBtn.addEventListener('click', () => {
+ document.body.classList.toggle('dark-theme');
+
+ // 保存用户偏好
+ if (document.body.classList.contains('dark-theme')) {
+ localStorage.setItem('theme', 'dark');
+ } else {
+ localStorage.setItem('theme', 'light');
+ }
+
+ // 重新初始化图标以确保正确显示
+ if (typeof lucide !== 'undefined') {
+ lucide.createIcons();
+ }
+ });
+ }
+}