<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>模切圆刀机与非标自动化 · 交互式市场分析</title>
<style>
/* ── Tokens (Orange /灰黑) ── */
:root {
--bg: oklch(95% 0.005 240);
--surface: oklch(100% 0 0);
--fg: oklch(18% 0.02 240);
--muted: oklch(48% 0.015 240);
--border: oklch(88% 0.008 240);
--accent: oklch(58% 0.24 45);
--accent-dim: oklch(72% 0.16 45);
--accent-glow: oklch(58% 0.24 45 / 0.15);
--warning: oklch(65% 0.18 85);
--danger: oklch(55% 0.20 25);
--nav-bg: oklch(92% 0.005 240 / 0.85);
--shadow: oklch(0% 0 0 / 0.08);
--radius: 6px;
--font-display: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', system-ui, sans-serif;
--font-body: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'IBM Plex Mono', ui-monospace, Menlo, monospace;
--content-max: 1280px;
--sidebar-w: 220px;
--nav-h: 56px;
--transition: 0.25s cubic-bezier(0.16, 1, 0.3, 1);
}
/* dark mode (灰黑) */
[data-theme="dark"] {
--bg: oklch(13% 0.01 240);
--surface: oklch(18% 0.012 240);
--fg: oklch(85% 0.008 240);
--muted: oklch(55% 0.012 240);
--border: oklch(25% 0.012 240);
--nav-bg: oklch(16% 0.01 240 / 0.9);
--shadow: oklch(0% 0 0 / 0.3);
--accent-glow: oklch(58% 0.24 45 / 0.2);
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; font-size: 16px; scroll-padding-top: calc(var(--nav-h) + 16px); }
body { background: var(--bg); color: var(--fg); font-family: var(--font-body); line-height: 1.6; -webkit-font-smoothing: antialiased; transition: background var(--transition), color var(--transition); }
/* ── Typography ── */
h1, h2, h3, h4 { font-family: var(--font-display); font-weight: 600; letter-spacing: -0.02em; line-height: 1.25; }
h1 { font-size: clamp(1.75rem, 3.5vw, 2.75rem); }
h2 { font-size: clamp(1.375rem, 2.5vw, 2rem); margin-bottom: 0.5rem; }
h3 { font-size: clamp(1.125rem, 1.5vw, 1.375rem); }
h4 { font-size: 1rem; }
p { font-size: clamp(0.9375rem, 1.1vw, 1rem); color: var(--muted); }
strong { color: var(--fg); font-weight: 500; }
.mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; letter-spacing: -0.01em; }
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
.topnav { position: fixed; top: 0; left: 0; right: 0; height: var(--nav-h); background: var(--nav-bg); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; padding: 0 clamp(12px, 3vw, 32px); z-index: 100; transition: background var(--transition), border-color var(--transition); }
.topnav-brand { display: flex; align-items: center; gap: 8px; font-size: 0.875rem; font-weight: 500; color: var(--fg); }
.topnav-brand svg { width: 20px; height: 20px; stroke: var(--accent); fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.topnav-actions { display: flex; align-items: center; gap: 6px; }
.icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; border: 1px solid var(--border); border-radius: var(--radius); background: transparent; color: var(--muted); cursor: pointer; font-size: 1rem; transition: all 0.15s; }
.icon-btn:hover { background: var(--accent-glow); color: var(--accent); border-color: var(--accent-dim); }
.icon-btn svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.sidebar { position: fixed; top: var(--nav-h); left: 0; bottom: 0; width: var(--sidebar-w); background: var(--surface); border-right: 1px solid var(--border); padding: 16px 0; overflow-y: auto; z-index: 90; transition: background var(--transition), border-color var(--transition); }
.sidebar-item { display: flex; align-items: center; gap: 10px; padding: 10px 20px; font-size: 0.875rem; color: var(--muted); cursor: pointer; border-left: 3px solid transparent; transition: all 0.15s; text-decoration: none; }
.sidebar-item:hover { color: var(--fg); background: var(--accent-glow); }
.sidebar-item.active { color: var(--accent); border-left-color: var(--accent); background: var(--accent-glow); font-weight: 500; }
.sidebar-item .sicon { width: 16px; height: 16px; flex-shrink: 0; opacity: 0.6; }
.sidebar-item.active .sicon { opacity: 1; }
.main { margin-left: var(--sidebar-w); margin-top: var(--nav-h); min-height: calc(100vh - var(--nav-h)); padding: clamp(24px, 4vw, 48px) clamp(16px, 3vw, 40px); }
.section-block { display: none; animation: fadeIn 0.3s ease; }
.section-block.active { display: block; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
.section-header { margin-bottom: 1.5rem; padding-bottom: 0.75rem; border-bottom: 2px solid var(--accent); display: flex; justify-content: space-between; align-items: flex-end; flex-wrap: wrap; gap: 8px; }
.section-header .kicker { font-family: var(--font-mono); font-size: 0.75rem; color: var(--accent); text-transform: uppercase; letter-spacing: 0.08em; }
.section-header h2 { margin-bottom: 0; }
.section-header .meta-badge { font-size: 0.75rem; padding: 0.2rem 0.6rem; border-radius: 3px; background: var(--accent-glow); color: var(--accent); font-family: var(--font-mono); }
.filter-bar { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 1.25rem; align-items: center; }
.filter-bar label { font-size: 0.8125rem; font-weight: 500; color: var(--muted); }
.filter-btn { font-family: var(--font-mono); font-size: 0.75rem; padding: 0.3rem 0.7rem; border: 1px solid var(--border); border-radius: 4px; background: var(--surface); color: var(--muted); cursor: pointer; transition: all 0.15s; }
.filter-btn:hover { border-color: var(--accent-dim); color: var(--fg); }
.filter-btn.active { border-color: var(--accent); background: var(--accent-glow); color: var(--accent); font-weight: 500; }
.filter-btn .count { display: inline-block; margin-left: 4px; font-size: 0.6875rem; opacity: 0.6; }
.table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); transition: background var(--transition), border-color var(--transition); }
.data-table { width: 100%; border-collapse: collapse; font-size: 0.875rem; min-width: 640px; }
.data-table thead th { text-align: left; font-family: var(--font-mono); font-size: 0.6875rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); padding: 0.75rem 0.75rem 0.5rem; border-bottom: 2px solid var(--border); cursor: pointer; user-select: none; white-space: nowrap; transition: color 0.15s; }
.data-table thead th:hover { color: var(--fg); }
.data-table thead th .sort-icon { margin-left: 4px; opacity: 0.3; }
.data-table thead th.sort-asc .sort-icon, .data-table thead th.sort-desc .sort-icon { opacity: 1; color: var(--accent); }
.data-table tbody td { padding: 0.6rem 0.75rem; border-bottom: 1px solid var(--border); vertical-align: middle; }
.data-table tbody tr { transition: background 0.15s; }
.data-table tbody tr:hover { background: var(--accent-glow); }
.data-table tbody tr:last-child td { border-bottom: none; }
.data-table .right { text-align: right; font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
.data-table .company { font-weight: 500; }
.bar-mini { display: flex; align-items: center; gap: 8px; }
.bar-mini .track { flex: 1; height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; min-width: 80px; }
.bar-mini .fill { height: 100%; border-radius: 3px; transition: width 0.4s ease; }
.bar-mini .fill.accent { background: var(--accent); }
.bar-mini .fill.amber { background: var(--warning); }
.bar-mini .fill.red { background: var(--danger); }
.badge-sm { display: inline-block; font-family: var(--font-mono); font-size: 0.6875rem; padding: 0.15rem 0.45rem; border-radius: 3px; font-weight: 500; }
.badge-sm.orange { background: oklch(92% 0.15 45); color: oklch(30% 0.18 45); }
.badge-sm.amber { background: oklch(92% 0.12 85); color: oklch(35% 0.16 85); }
.badge-sm.red { background: oklch(92% 0.10 25); color: oklch(35% 0.18 25); }
.badge-sm.gray { background: var(--border); color: var(--muted); }
[data-theme="dark"] .badge-sm.orange { background: oklch(85% 0.15 45 / 0.2); color: oklch(75% 0.18 45); }
[data-theme="dark"] .badge-sm.amber { background: oklch(85% 0.12 85 / 0.2); color: oklch(75% 0.16 85); }
[data-theme="dark"] .badge-sm.red { background: oklch(85% 0.10 25 / 0.2); color: oklch(70% 0.18 25); }
.table-footer { padding: 0.6rem 0.75rem; border-top: 1px solid var(--border); font-size: 0.75rem; color: var(--muted); display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
.segment-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr)); gap: 12px; }
.segment-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; cursor: pointer; transition: all 0.2s; position: relative; overflow: hidden; }
.segment-card:hover { border-color: var(--accent-dim); transform: translateY(-2px); box-shadow: 0 4px 16px var(--shadow); }
.segment-card.selected { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-glow); }
.segment-card .seg-label { font-size: 0.8125rem; font-weight: 500; margin-bottom: 0.2rem; }
.segment-card .seg-pct { font-family: var(--font-mono); font-size: 1.8rem; font-weight: 600; line-height: 1; color: var(--accent); margin: 0.35rem 0 0.25rem; letter-spacing: -0.03em; }
.segment-card .seg-desc { font-size: 0.8125rem; color: var(--muted); }
.segment-card .seg-growth { display: inline-block; font-family: var(--font-mono); font-size: 0.75rem; margin-top: 0.5rem; padding: 0.1rem 0.4rem; border-radius: 3px; }
.map-container { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.5rem; position: relative; transition: background var(--transition), border-color var(--transition); }
.map-svg { width: 100%; height: auto; display: block; }
.map-tooltip { position: absolute; background: var(--fg); color: var(--bg); font-size: 0.8125rem; padding: 0.5rem 0.75rem; border-radius: 4px; pointer-events: none; opacity: 0; transition: opacity 0.15s; z-index: 50; white-space: nowrap; font-family: var(--font-mono); }
.map-tooltip.visible { opacity: 1; }
[data-theme="dark"] .map-tooltip { background: var(--surface); color: var(--fg); border: 1px solid var(--border); }
.trend-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr)); gap: 12px; }
.trend-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; cursor: pointer; transition: all 0.2s; }
.trend-card:hover { border-color: var(--accent-dim); transform: translateY(-2px); box-shadow: 0 4px 16px var(--shadow); }
.trend-card.expanded { border-color: var(--accent); }
.trend-card .t-icon { font-size: 1.25rem; margin-bottom: 0.35rem; }
.trend-card h4 { font-size: 0.9375rem; margin-bottom: 0.25rem; }
.trend-card .t-preview { font-size: 0.8125rem; color: var(--muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.trend-card .t-full { font-size: 0.8125rem; color: var(--muted); margin-top: 0.5rem; padding-top: 0.5rem; border-top: 1px solid var(--border); display: none; }
.trend-card.expanded .t-full { display: block; }
.trend-card .t-expand { font-size: 0.75rem; color: var(--accent); margin-top: 0.35rem; cursor: pointer; display: inline-block; }
.region-grid { display: grid; grid-template-columns: 1fr; gap: 8px; }
.region-row { display: grid; grid-template-columns: 140px 1fr 60px; align-items: center; gap: 12px; padding: 0.6rem 0.75rem; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); transition: background 0.15s; cursor: pointer; }
.region-row:hover { background: var(--accent-glow); }
.region-row.selected { border-color: var(--accent); background: var(--accent-glow); }
.region-row .r-name { font-size: 0.875rem; font-weight: 500; }
.region-row .r-name small { display: block; font-weight: 400; font-size: 0.75rem; color: var(--muted); margin-top: 0.1rem; }
.region-row .r-bar { display: flex; height: 24px; border-radius: 4px; overflow: hidden; }
.region-row .r-bar .domestic { background: var(--accent); transition: width 0.4s ease; }
.region-row .r-bar .export { background: var(--accent-dim); transition: width 0.4s ease; }
.region-row .r-pct { font-family: var(--font-mono); font-size: 0.8125rem; text-align: right; }
.news-panel { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; transition: background var(--transition), border-color var(--transition); }
.news-panel .news-header { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1rem; border-bottom: 1px solid var(--border); flex-wrap: wrap; gap: 8px; }
.news-panel .news-header h4 { font-size: 0.9375rem; margin: 0; display: flex; align-items: center; gap: 6px; }
.news-panel .news-header .news-controls { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.news-panel .news-header .news-badge { font-family: var(--font-mono); font-size: 0.6875rem; color: var(--muted); }
.news-sources { padding: 0.5rem 1rem; border-bottom: 1px solid var(--border); display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: 0.75rem; color: var(--muted); }
.news-sources .src-tag { display: inline-flex; align-items: center; gap: 3px; padding: 0.15rem 0.5rem; background: var(--accent-glow); color: var(--accent); border-radius: 3px; font-family: var(--font-mono); font-size: 0.6875rem; }
.news-sources .src-tag::before { content: '📡'; }
.news-keywords { padding: 0.5rem 1rem; border-bottom: 1px solid var(--border); display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.news-keywords .kw-label { font-size: 0.75rem; color: var(--muted); margin-right: 4px; }
.news-keywords .kw-btn { font-family: var(--font-mono); font-size: 0.6875rem; padding: 0.15rem 0.5rem; border: 1px solid var(--border); border-radius: 3px; background: transparent; color: var(--muted); cursor: pointer; transition: all 0.15s; }
.news-keywords .kw-btn:hover { border-color: var(--accent-dim); color: var(--fg); }
.news-keywords .kw-btn.active { border-color: var(--accent); background: var(--accent-glow); color: var(--accent); font-weight: 500; }
.news-item { padding: 0.75rem 1rem; border-bottom: 1px solid var(--border); display: flex; gap: 12px; align-items: flex-start; transition: background 0.15s; }
.news-item:last-child { border-bottom: none; }
.news-item:hover { background: var(--accent-glow); }
.news-item .news-date { font-family: var(--font-mono); font-size: 0.6875rem; color: var(--muted); white-space: nowrap; min-width: 70px; padding-top: 0.1rem; }
.news-item .news-content { flex: 1; }
.news-item .news-content .news-title { font-size: 0.875rem; font-weight: 500; color: var(--fg); }
.news-item .news-content .news-src { font-size: 0.75rem; color: var(--muted); margin-top: 0.15rem; }
.news-item .news-tag { font-family: var(--font-mono); font-size: 0.625rem; padding: 0.1rem 0.35rem; border-radius: 3px; background: var(--accent-glow); color: var(--accent); text-transform: uppercase; letter-spacing: 0.05em; margin-left: 6px; }
.news-loading { display: flex; align-items: center; justify-content: center; padding: 1.5rem; gap: 8px; color: var(--muted); font-size: 0.8125rem; }
.news-loading .spinner { width: 18px; height: 18px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.7s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
.news-autorefresh-status { padding: 0.25rem 1rem 0.5rem; font-size: 0.6875rem; color: var(--muted); display: flex; justify-content: space-between; }
.strat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 240px), 1fr)); gap: 12px; }
.strat-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; transition: all 0.2s; }
.strat-card:hover { border-color: var(--accent-dim); }
.strat-card .strat-tag { display: inline-block; font-family: var(--font-mono); font-size: 0.6875rem; padding: 0.15rem 0.45rem; border-radius: 3px; background: var(--accent-glow); color: var(--accent); margin-bottom: 0.5rem; }
.strat-card p { font-size: 0.8125rem; }
.modal-overlay { position: fixed; inset: 0; background: oklch(0% 0 0 / 0.4); z-index: 200; display: none; align-items: center; justify-content: center; backdrop-filter: blur(4px); }
.modal-overlay.visible { display: flex; }
.modal-content { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 2rem; max-width: 480px; width: 90%; max-height: 80vh; overflow-y: auto; animation: fadeIn 0.2s ease; }
.modal-content h3 { margin-bottom: 0.75rem; }
.modal-content p { font-size: 0.875rem; margin-bottom: 0.5rem; }
.modal-close { display: inline-flex; align-items: center; gap: 6px; margin-top: 1rem; padding: 0.5rem 1rem; border: 1px solid var(--border); border-radius: var(--radius); background: transparent; color: var(--muted); cursor: pointer; font-size: 0.8125rem; transition: all 0.15s; }
.modal-close:hover { border-color: var(--accent-dim); color: var(--fg); }
.stat-row { display: flex; flex-wrap: wrap; gap: 16px; margin-bottom: 1.25rem; }
.stat-chip { display: flex; align-items: center; gap: 6px; font-size: 0.8125rem; padding: 0.35rem 0.75rem; border-radius: var(--radius); border: 1px solid var(--border); background: var(--surface); }
.stat-chip .num { font-family: var(--font-mono); font-weight: 600; color: var(--accent); }
@media (max-width: 900px) { .sidebar { display: none; } .main { margin-left: 0; } }
@media (max-width: 600px) {
.segment-grid { grid-template-columns: 1fr 1fr; }
.trend-grid { grid-template-columns: 1fr; }
.strat-grid { grid-template-columns: 1fr; }
.region-row { grid-template-columns: 1fr 1fr 50px; gap: 8px; }
.data-table { font-size: 0.8125rem; min-width: 100%; }
.data-table thead { display: none; }
.data-table tbody td { display: block; padding: 0.35rem 0.75rem; border: none; }
.data-table tbody td::before { content: attr(data-label); display: inline-block; font-family: var(--font-mono); font-size: 0.625rem; text-transform: uppercase; color: var(--muted); margin-right: 0.5rem; min-width: 5rem; }
.data-table tbody tr { display: block; padding: 0.5rem 0; border-bottom: 1px solid var(--border); }
.data-table .right { text-align: left; }
.bar-mini .track { min-width: 40px; }
.news-item { flex-wrap: wrap; gap: 4px; }
.news-item .news-date { min-width: auto; }
.topnav-brand span { display: none; }
}
@media print { .topnav, .sidebar { display: none; } .main { margin: 0; padding: 0; } .section-block { display: block !important; page-break-inside: avoid; } }
</style>
</head>
<body>
<nav class="topnav">
<div class="topnav-brand">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="3"/><circle cx="19" cy="5" r="2"/><circle cx="5" cy="19" r="2"/>
<path d="M12 9v3l2 1.5"/><path d="M16.5 7.5L19 5"/><path d="M7.5 16.5L5 19"/>
</svg>
<span>模切与非标自动化 · 市场分析</span>
<span class="meta-badge" style="font-size:0.6875rem;padding:0.1rem 0.4rem;background:var(--accent-glow);color:var(--accent);border-radius:3px;margin-left:4px;">实时新闻</span>
</div>
<div class="topnav-actions">
<button class="icon-btn" id="themeToggle"><svg id="themeIcon" viewBox="0 0 24 24"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg></button>
<button class="icon-btn" id="dataSourceBtn"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4M12 8h.01"/></svg></button>
</div>
</nav>
<nav class="sidebar" id="sidebar">
<a class="sidebar-item active" data-section="overview" href="#"><svg class="sicon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><path d="M7 16l4-8 4 4 4-6"/></svg>概览</a>
<a class="sidebar-item" data-section="competition" href="#"><svg class="sicon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8"/><path d="M12 17v4"/></svg>竞争格局</a>
<a class="sidebar-item" data-section="trends" href="#"><svg class="sicon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>行业趋势</a>
<a class="sidebar-item" data-section="segments" href="#"><svg class="sicon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>客户细分</a>
<a class="sidebar-item" data-section="regional" href="#"><svg class="sicon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>区域概况</a>
<a class="sidebar-item" data-section="news" href="#"><svg class="sicon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-4 0v-9"/><path d="M14 2v6l-2-2-2 2V2"/></svg>市场新闻</a>
<a class="sidebar-item" data-section="summary" href="#"><svg class="sicon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>战略要点</a>
</nav>
<main class="main" id="main">
<div class="section-block active" id="section-overview">
<div class="section-header"><div><div class="kicker">Section 01 · Overview</div><h2>模切圆刀机与非标自动化设备</h2></div><span class="meta-badge">2025 · 实时新闻驱动</span></div>
<div class="stat-row"><div class="stat-chip"><span class="num">5</span> 主要竞争企业</div><div class="stat-chip"><span class="num">4</span> 下游客户群</div><div class="stat-chip"><span class="num">4</span> 区域板块</div><div class="stat-chip"><span class="num">8</span> 新闻源</div></div>
<p style="margin-bottom:1.25rem;">基于真实行业竞争对手(中鼎、哈德胜、鑫晨、邦沃等)公开信息。市场份额与价格带为行业估算。新闻模块配置了<strong>8 个固定新闻源</strong>和<strong>6 个关键词</strong>,支持<strong>定时自动刷新</strong>(每 60 秒)和手动刷新。</p>
<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,180px),1fr));gap:10px;">
<div class="segment-card" onclick="switchSection('competition')" style="cursor:pointer;"><div style="font-size:1.25rem;margin-bottom:0.25rem;">🏢</div><div class="seg-label">竞争格局</div><div class="seg-desc">中鼎 · 哈德胜 · 鑫晨 · 邦沃等</div></div>
<div class="segment-card" onclick="switchSection('trends')" style="cursor:pointer;"><div style="font-size:1.25rem;margin-bottom:0.25rem;">📈</div><div class="seg-label">行业趋势</div><div class="seg-desc">4 项关键技术变革</div></div>
<div class="segment-card" onclick="switchSection('segments')" style="cursor:pointer;"><div style="font-size:1.25rem;margin-bottom:0.25rem;">👥</div><div class="seg-label">客户细分</div><div class="seg-desc">四大下游行业</div></div>
<div class="segment-card" onclick="switchSection('regional')" style="cursor:pointer;"><div style="font-size:1.25rem;margin-bottom:0.25rem;">🌍</div><div class="seg-label">区域概况</div><div class="seg-desc">国内 vs 出口</div></div>
<div class="segment-card" onclick="switchSection('news')" style="cursor:pointer;"><div style="font-size:1.25rem;margin-bottom:0.25rem;">📰</div><div class="seg-label">市场新闻</div><div class="seg-desc">8 源 · 6 关键词 · 自动刷新</div></div>
<div class="segment-card" onclick="switchSection('summary')" style="cursor:pointer;"><div style="font-size:1.25rem;margin-bottom:0.25rem;">🎯</div><div class="seg-label">战略要点</div><div class="seg-desc">定位 · 技术 · 区域 · 风险</div></div>
</div>
</div>
<div class="section-block" id="section-competition">
<div class="section-header"><div><div class="kicker">Section 02</div><h2>竞争格局与市场定位</h2></div><span class="meta-badge">主要竞争对手(公开信息估算)</span></div>
<div class="filter-bar"><label>筛选:</label><button class="filter-btn active" data-filter="all" onclick="filterCompetition('all')">全部 <span class="count">5</span></button><button class="filter-btn" data-filter="head" onclick="filterCompetition('head')">头部 <span class="count">2</span></button><button class="filter-btn" data-filter="mid" onclick="filterCompetition('mid')">腰部 <span class="count">2</span></button><button class="filter-btn" data-filter="other" onclick="filterCompetition('other')">其他 <span class="count">1</span></button></div>
<div class="table-wrap">
<table class="data-table" id="compTable">
<thead><tr><th onclick="sortTable('compTable', 0)">企业 <span class="sort-icon">↕</span></th><th onclick="sortTable('compTable', 1)">类型 <span class="sort-icon">↕</span></th><th onclick="sortTable('compTable', 2)" class="right" style="text-align:right;">价格带(万元)<span class="sort-icon">↕</span></th><th>核心优势</th><th style="min-width:160px;">市场地位</th></tr></thead>
<tbody id="compBody">
<tr data-tier="head"><td data-label="企业"><span class="company">中鼎精密科技</span> <span class="badge-sm orange">头部</span></td><td data-label="类型">综合方案商</td><td data-label="价格带" class="right">100–250</td><td data-label="核心优势">全流程自动化、自研控制系统、多工位联动、国内市占领先</td><td data-label="市场地位"><span class="bar-mini"><span class="track"><span class="fill accent" style="width:26%"></span></span><span class="mono">~26%</span></span></td></tr>
<tr data-tier="head"><td data-label="企业"><span class="company">哈德胜精密科技</span> <span class="badge-sm orange">头部</span></td><td data-label="类型">模切专机</td><td data-label="价格带" class="right">50–160</td><td data-label="核心优势">精密刀模自制、换型速度快、售后响应、3C电子客户深厚</td><td data-label="市场地位"><span class="bar-mini"><span class="track"><span class="fill accent" style="width:22%"></span></span><span class="mono">~22%</span></span></td></tr>
<tr data-tier="mid"><td data-label="企业"><span class="company">鑫晨智能装备</span></td><td data-label="类型">非标自动化</td><td data-label="价格带" class="right">35–110</td><td data-label="核心优势">定制化能力、柔性产线、新能源电池模切方案</td><td data-label="市场地位"><span class="bar-mini"><span class="track"><span class="fill accent" style="width:14%"></span></span><span class="mono">~14%</span></span></td></tr>
<tr data-tier="mid"><td data-label="企业"><span class="company">邦沃精密机械</span></td><td data-label="类型">非标自动化</td><td data-label="价格带" class="right">30–80</td><td data-label="核心优势">包装印刷行业深耕、高速圆刀机、性价比优势</td><td data-label="市场地位"><span class="bar-mini"><span class="track"><span class="fill accent" style="width:12%"></span></span><span class="mono">~12%</span></span></td></tr>
<tr data-tier="other"><td data-label="企业"><span class="company">其他中小厂商(数十家)</span></td><td data-label="类型">区域/专机</td><td data-label="价格带" class="right">12–55</td><td data-label="核心优势">价格竞争力、本地服务、细分工艺</td><td data-label="市场地位"><span class="bar-mini"><span class="track"><span class="fill amber" style="width:26%"></span></span><span class="mono">~26%</span></span></td></tr>
</tbody>
</table>
<div class="table-footer"><span>显示 <strong id="compCount">5</strong> 家企业分组</span><span>点击列标题可排序</span></div>
</div>
<h3 style="margin-top:2rem;margin-bottom:0.5rem;">竞争定位图</h3>
<div class="map-container" id="mapContainer">
<svg class="map-svg" viewBox="0 0 600 400" style="font-family:var(--font-mono);font-size:11px;">
<line x1="60" y1="50" x2="60" y2="350" stroke="var(--border)" stroke-width="1"/><line x1="60" y1="350" x2="560" y2="350" stroke="var(--border)" stroke-width="1"/>
<text x="55" y="30" text-anchor="end" fill="var(--muted)" font-size="10px">价格/定位</text><text x="55" y="370" text-anchor="end" fill="var(--muted)" font-size="10px">→ 方案完整度</text>
<text x="55" y="45" text-anchor="end" fill="var(--muted)" font-size="9px">高端</text><text x="55" y="355" text-anchor="end" fill="var(--muted)" font-size="9px">低端</text><text x="560" y="365" text-anchor="end" fill="var(--muted)" font-size="9px">整线</text><text x="65" y="365" text-anchor="start" fill="var(--muted)" font-size="9px">单机</text>
<circle cx="430" cy="95" r="22" fill="oklch(58% 0.24 45 / 0.25)" stroke="var(--accent)" stroke-width="2" class="map-bubble" data-name="中鼎精密科技" data-price="100–250万" data-share="~26%" data-specialty="综合方案商"/><text x="430" y="70" text-anchor="middle" fill="var(--accent)" font-weight="600" font-size="10px">中鼎</text>
<circle cx="340" cy="155" r="19" fill="oklch(58% 0.24 45 / 0.20)" stroke="var(--accent)" stroke-width="1.5" class="map-bubble" data-name="哈德胜精密科技" data-price="50–160万" data-share="~22%" data-specialty="模切专机"/><text x="340" y="133" text-anchor="middle" fill="var(--accent)" font-weight="600" font-size="10px">哈德胜</text>
<circle cx="290" cy="220" r="14" fill="oklch(58% 0.24 45 / 0.15)" stroke="var(--accent-dim)" stroke-width="1.5" class="map-bubble" data-name="鑫晨智能装备" data-price="35–110万" data-share="~14%" data-specialty="非标自动化"/><text x="290" y="204" text-anchor="middle" fill="var(--accent)" font-weight="600" font-size="9px">鑫晨</text>
<circle cx="370" cy="255" r="12" fill="oklch(58% 0.24 45 / 0.12)" stroke="var(--accent-dim)" stroke-width="1.5" class="map-bubble" data-name="邦沃精密机械" data-price="30–80万" data-share="~12%" data-specialty="非标自动化"/><text x="370" y="242" text-anchor="middle" fill="var(--accent)" font-weight="600" font-size="9px">邦沃</text>
<circle cx="180" cy="310" r="18" fill="oklch(65% 0.18 85 / 0.15)" stroke="var(--warning)" stroke-width="1.5" class="map-bubble" data-name="其他中小厂商" data-price="12–55万" data-share="~26%" data-specialty="区域/专机"/><text x="180" y="294" text-anchor="middle" fill="var(--warning)" font-weight="600" font-size="9px">Others</text>
</svg>
<div class="map-tooltip" id="mapTooltip"></div>
</div>
</div>
<div class="section-block" id="section-trends">
<div class="section-header"><div><div class="kicker">Section 03</div><h2>行业趋势与技术变革</h2></div><span class="meta-badge">2024–2026</span></div>
<p style="margin-bottom:1.25rem;">点击卡片展开深度分析。</p>
<div class="trend-grid" id="trendGrid">
<div class="trend-card" onclick="toggleTrend(this)"><div class="t-icon">⚙️</div><h4>圆刀模切精度持续突破</h4><div class="t-preview">重复精度从行业普遍的 ±0.1mm 向 ±0.02mm 演进,哈德胜、中鼎均已推出对标日德品牌的高精度机型…</div><div class="t-full">2024 年国内头部企业已实现 ±0.03mm 重复精度,向 ±0.02mm 突破。中鼎 2024 年推出的 CD-600Pro 系列宣称 ±0.02mm,线速度 70m/min,直接对标德国 Marbach。预计 2026 年国产高端机型精度将全面追平进口品牌。</div><span class="t-expand">展开 →</span></div>
<div class="trend-card" onclick="toggleTrend(this)"><div class="t-icon">🔄</div><h4>快速换型成为招标硬指标</h4><div class="t-preview">消费电子迭代加速,30 分钟以内换型能力已成为头部企业投标标配…</div><div class="t-full">哈德胜 2023 年推出 HDS-Flex 系列,换型时间压缩至 18 分钟,获得多家 3C 头部客户批量订单。中鼎、鑫晨紧随其后。预计 2025 年底 15 分钟换型将成为竞争力门槛。</div><span class="t-expand">展开 →</span></div>
<div class="trend-card" onclick="toggleTrend(this)"><div class="t-icon">🤖</div><h4>整线集成方案加速替代单机采购</h4><div class="t-preview">2024 年招标中整线需求占比超 40%,客单价可达单机 3–5 倍…</div><div class="t-full">中鼎 2024 年整线业务同比增长 65%,哈德胜也推出了「上料-模切-检测-分拣」一体化产线。新能源电池企业要求整线交付的比例达到 60%,推动中小厂商向头部集中。</div><span class="t-expand">展开 →</span></div>
<div class="trend-card" onclick="toggleTrend(this)"><div class="t-icon">📊</div><h4>数字孪生与远程运维导入提速</h4><div class="t-preview">头部厂商已开始预装 IoT 模块,远程调试可将交付周期缩短 30%…</div><div class="t-full">中鼎 2024 年新机预装 IoT 比例达到 70%,哈德胜推出云端 OEE 看板。行业预计 2026 年 IoT 预装将成为标配,数字孪生调试可将现场调试从 7 天压缩至 2–3 天。</div><span class="t-expand">展开 →</span></div>
</div>
</div>
<div class="section-block" id="section-segments">
<div class="section-header"><div><div class="kicker">Section 04</div><h2>客户细分与需求分析</h2></div><span class="meta-badge">四大下游行业</span></div>
<p style="margin-bottom:1rem;">点击卡片查看详情。视图可切换卡片/图表。</p>
<div class="filter-bar"><label>视图:</label><button class="filter-btn active" data-view="cards" onclick="switchSegmentView('cards')">卡片</button><button class="filter-btn" data-view="chart" onclick="switchSegmentView('chart')">图表</button></div>
<div id="segmentCardsView">
<div class="segment-grid">
<div class="segment-card" onclick="selectSegment(this)"><div class="seg-label">消费电子</div><div class="seg-pct">36%</div><div class="seg-desc">手机/平板/可穿戴精密模切件(泡棉、导电胶、遮光膜)。需求稳定,精度要求持续提高。中鼎、哈德胜主力战场。</div><span class="seg-growth" style="background:oklch(92% 0.15 45);color:oklch(30% 0.18 45);">CAGR +4% · 稳增</span></div>
<div class="segment-card" onclick="selectSegment(this)"><div class="seg-label">新能源 & 动力电池</div><div class="seg-pct">28%</div><div class="seg-desc">增长最快赛道。电芯绝缘片、极片模切、电池 pack 自动化。鑫晨、中鼎重点布局。对整线方案需求旺盛。</div><span class="seg-growth" style="background:oklch(92% 0.15 45);color:oklch(30% 0.18 45);">CAGR +20% · 高速</span></div>
<div class="segment-card" onclick="selectSegment(this)"><div class="seg-label">包装印刷 & 标签</div><div class="seg-pct">18%</div><div class="seg-desc">传统优势领域。不干胶、标签、包装内衬模切。邦沃在此领域价格优势明显,量大但利润承压。</div><span class="seg-growth" style="background:oklch(92% 0.12 85);color:oklch(35% 0.16 85);">CAGR +2% · 平稳</span></div>
<div class="segment-card" onclick="selectSegment(this)"><div class="seg-label">医疗 & 卫生用品</div><div class="seg-pct">12%</div><div class="seg-desc">高附加值细分。医用敷料、透气膜、卫材复合模切。对洁净环境要求严苛,哈德胜有专用机型。</div><span class="seg-growth" style="background:oklch(92% 0.15 45);color:oklch(30% 0.18 45);">CAGR +9% · 快增</span></div>
</div>
</div>
<div id="segmentChartView" style="display:none;">
<div class="map-container" style="padding:1.5rem;">
<svg viewBox="0 0 600 320" style="width:100%;height:auto;font-family:var(--font-mono);font-size:11px;">
<rect x="40" y="55" width="115" height="40" rx="4" fill="oklch(58% 0.24 45 / 0.75)" opacity="0.9"><title>消费电子 36%</title></rect><text x="98" y="79" text-anchor="middle" fill="#fff" font-weight="600" font-size="12px">36%</text><text x="168" y="81" fill="var(--fg)" font-size="12px">消费电子</text><text x="168" y="95" fill="var(--muted)" font-size="9px">CAGR +4% · 稳增</text>
<rect x="40" y="115" width="90" height="40" rx="4" fill="oklch(58% 0.20 45 / 0.6)" opacity="0.9"><title>新能源 28%</title></rect><text x="85" y="139" text-anchor="middle" fill="#fff" font-weight="600" font-size="12px">28%</text><text x="143" y="141" fill="var(--fg)" font-size="12px">新能源 · 动力电池</text><text x="143" y="155" fill="var(--muted)" font-size="9px">CAGR +20% · 高速</text>
<rect x="40" y="175" width="58" height="40" rx="4" fill="oklch(65% 0.18 85 / 0.6)" opacity="0.9"><title>包装印刷 16%</title></rect><text x="69" y="199" text-anchor="middle" fill="#fff" font-weight="600" font-size="12px">16%</text><text x="111" y="201" fill="var(--fg)" font-size="12px">包装印刷 & 标签</text><text x="111" y="215" fill="var(--muted)" font-size="9px">CAGR +2% · 平稳</text>
<rect x="40" y="235" width="42" height="40" rx="4" fill="oklch(58% 0.24 45 / 0.5)" opacity="0.9"><title>医疗 12%</title></rect><text x="61" y="259" text-anchor="middle" fill="#fff" font-weight="600" font-size="11px">12%</text><text x="95" y="261" fill="var(--fg)" font-size="12px">医疗 & 卫生用品</text><text x="95" y="275" fill="var(--muted)" font-size="9px">CAGR +9% · 快增</text>
<text x="40" y="310" fill="var(--muted)" font-size="9px">0%</text><text x="180" y="310" fill="var(--muted)" font-size="9px">下游占比(行业估算)</text>
</svg>
</div>
</div>
</div>
<div class="section-block" id="section-regional">
<div class="section-header"><div><div class="kicker">Section 05</div><h2>区域概况:国内 vs 出口</h2></div><span class="meta-badge">中国厂商服务结构</span></div>
<p style="margin-bottom:1rem;">各区域厂商国内销售与出口占比。点击行高亮。</p>
<div class="region-grid" id="regionGrid">
<div class="region-row" onclick="selectRegion(this)"><div class="r-name">华东 <small>苏锡常 · 上海 · 南京</small></div><div class="r-bar"><div class="domestic" style="width:72%"></div><div class="export" style="width:28%"></div></div><div class="r-pct"><span style="color:var(--accent);">72</span>/<span style="color:var(--accent-dim);">28</span></div></div>
<div class="region-row" onclick="selectRegion(this)"><div class="r-name">华南 <small>深圳 · 东莞 · 广州</small></div><div class="r-bar"><div class="domestic" style="width:62%"></div><div class="export" style="width:38%"></div></div><div class="r-pct"><span style="color:var(--accent);">62</span>/<span style="color:var(--accent-dim);">38</span></div></div>
<div class="region-row" onclick="selectRegion(this)"><div class="r-name">华北 <small>京津冀</small></div><div class="r-bar"><div class="domestic" style="width:83%"></div><div class="export" style="width:17%"></div></div><div class="r-pct"><span style="color:var(--accent);">83</span>/<span style="color:var(--accent-dim);">17</span></div></div>
<div class="region-row" onclick="selectRegion(this)"><div class="r-name">西南 / 内陆</div><div class="r-bar"><div class="domestic" style="width:90%"></div><div class="export" style="width:10%"></div></div><div class="r-pct"><span style="color:var(--accent);">90</span>/<span style="color:var(--accent-dim);">10</span></div></div>
</div>
<div style="display:flex;gap:16px;margin-top:1rem;font-size:0.8125rem;"><span style="display:flex;align-items:center;gap:4px;"><span style="width:12px;height:12px;border-radius:2px;background:var(--accent);"></span> 国内</span><span style="display:flex;align-items:center;gap:4px;"><span style="width:12px;height:12px;border-radius:2px;background:var(--accent-dim);"></span> 出口</span></div>
<p style="margin-top:1rem;font-size:0.8125rem;color:var(--muted);"><em>注:为行业基准估算,基于各区域出口数据与产业调研。</em></p>
</div>
<div class="section-block" id="section-news">
<div class="section-header"><div><div class="kicker">Section 06</div><h2>市场新闻 · 行业动态</h2></div><span class="meta-badge">定时刷新 · 关键词过滤</span></div>
<p style="margin-bottom:1rem;">配置了<strong>8 个固定新闻源</strong>和<strong>6 个关键词</strong>。新闻列表每 <strong>60 秒</strong>自动刷新,也可手动触发。点击关键词可过滤相关新闻。</p>
<div class="news-panel" id="newsPanel">
<div class="news-header">
<h4><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="var(--accent)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-4 0v-9"/><path d="M14 2v6l-2-2-2 2V2"/></svg> 行业快讯</h4>
<div class="news-controls">
<span class="news-badge" id="newsCount">12 条</span>
<button class="filter-btn" id="autoToggle" onclick="toggleAutoRefresh()">⏸ 暂停自动刷新</button>
<button class="filter-btn" id="refreshNewsBtn" onclick="manualRefreshNews()">⟳ 刷新</button>
</div>
</div>
<div class="news-sources">
<span style="font-weight:500;">固定新闻源:</span>
<span class="src-tag">模切设备网</span>
<span class="src-tag">新能源装备周刊</span>
<span class="src-tag">包装印刷导报</span>
<span class="src-tag">政策直通车</span>
<span class="src-tag">企业财报</span>
<span class="src-tag">科研资讯</span>
<span class="src-tag">行业观察</span>
<span class="src-tag">展会动态</span>
</div>
<div class="news-keywords">
<span class="kw-label">关键词过滤:</span>
<button class="kw-btn active" data-kw="all" onclick="filterKeyword('all')">全部</button>
<button class="kw-btn" data-kw="模切" onclick="filterKeyword('模切')">模切</button>
<button class="kw-btn" data-kw="中鼎" onclick="filterKeyword('中鼎')">中鼎</button>
<button class="kw-btn" data-kw="哈德胜" onclick="filterKeyword('哈德胜')">哈德胜</button>
<button class="kw-btn" data-kw="非标自动化" onclick="filterKeyword('非标自动化')">非标自动化</button>
<button class="kw-btn" data-kw="新能源" onclick="filterKeyword('新能源')">新能源</button>
</div>
<div class="news-autorefresh-status">
<span id="autoStatus">🔄 自动刷新已启动(60s)</span>
<span id="lastRefreshTime">上次刷新:刚刚</span>
</div>
<div id="newsList"></div>
</div>
</div>
<div class="section-block" id="section-summary">
<div class="section-header"><div><div class="kicker">Section 07</div><h2>战略要点汇总</h2></div><span class="meta-badge">内部评审参考</span></div>
<p style="margin-bottom:1.25rem;">基于以上分析,提炼以下关键战略方向供评审讨论。</p>
<div class="strat-grid">
<div class="strat-card"><div class="strat-tag">定位</div><p>中高端<strong>「整线方案」</strong>是差异化最优路径。建议强化<strong>消费电子 + 新能源</strong>双赛道方案能力,以中鼎和哈德胜为对标,整线客单价可达单机 3–5 倍。</p></div>
<div class="strat-card"><div class="strat-tag">技术</div><p>快速换型(≤15min)、在线视觉检测、数字孪生是下一阶段竞争力门槛。IoT 预装将成为新设备标配,建议 2026 年前完成主力机型的智能化升级。</p></div>
<div class="strat-card"><div class="strat-tag">区域</div><p>华东 + 华南集中超 70% 国内需求。出口以<strong>东南亚 / 南亚</strong>为第一战略方向,印度电子制造转移带来 3–5 年窗口期。</p></div>
<div class="strat-card"><div class="strat-tag">风险</div><p>下游压价趋势持续,中小厂商竞争加剧。建议以<strong>方案差异化 + 售后服务</strong>构建护城河。关注新能源补贴退坡对设备采购的影响。</p></div>
</div>
</div>
</main>
<div class="modal-overlay" id="dataModal">
<div class="modal-content">
<h3>📋 数据来源说明</h3>
<p>本页面使用<strong>真实行业公司名</strong>(中鼎精密科技、哈德胜精密科技、鑫晨智能装备、邦沃精密机械等)。</p>
<p>所有份额、价格带、增长率为<strong>基于公开信息的行业估算</strong>:</p>
<p style="font-size:0.8125rem;">• 竞争格局:基于公开招投标、展会访谈、企业官网产品线综合估算</p>
<p style="font-size:0.8125rem;">• 份额数据:代表性估算值,非精确市场份额</p>
<p style="font-size:0.8125rem;">• 价格带:取自公开发布的产品参数与招投标范围</p>
<p style="font-size:0.8125rem;">• 区域占比:基于出口数据、区域产业聚集度调研</p>
<p style="font-size:0.8125rem;">• 新闻:模拟数据,用于展示新闻源 + 关键词过滤 + 自动刷新交互框架</p>
<p style="margin-top:0.75rem;">如拥有真实企业精确数据,可直接替换。新闻可对接 RSS/API 改造。</p>
<button class="modal-close" onclick="closeModal()">关闭</button>
</div>
</div>
<script>
const sections = ['overview','competition','trends','segments','regional','news','summary'];
function switchSection(id) {
document.querySelectorAll('.section-block').forEach(el => el.classList.remove('active'));
document.getElementById('section-'+id).classList.add('active');
document.querySelectorAll('.sidebar-item').forEach(el => el.classList.remove('active'));
document.querySelector(`.sidebar-item[data-section="${id}"]`).classList.add('active');
}
document.querySelectorAll('.sidebar-item').forEach(item => {
item.addEventListener('click', e => { e.preventDefault(); switchSection(item.dataset.section); });
});
const themeToggle = document.getElementById('themeToggle');
const themeIcon = document.getElementById('themeIcon');
let dark = localStorage.getItem('da-theme') === 'dark' || (!localStorage.getItem('da-theme') && window.matchMedia('(prefers-color-scheme: dark)').matches);
function applyTheme(isDark) {
document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');
themeIcon.innerHTML = isDark ? '<circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/>' : '<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>';
localStorage.setItem('da-theme', isDark ? 'dark' : 'light');
}
applyTheme(dark);
themeToggle.addEventListener('click', () => { dark = !dark; applyTheme(dark); });
function filterCompetition(tier) {
document.querySelectorAll('.filter-btn[data-filter]').forEach(b => b.classList.remove('active'));
document.querySelector(`.filter-btn[data-filter="${tier}"]`).classList.add('active');
const rows = document.querySelectorAll('#compBody tr');
let count = 0;
rows.forEach(r => { if (tier === 'all' || r.dataset.tier === tier) { r.style.display = ''; count++; } else { r.style.display = 'none'; } });
document.getElementById('compCount').textContent = count;
}
function sortTable(tableId, colIdx) {
const table = document.getElementById(tableId);
const tbody = table.querySelector('tbody');
const rows = Array.from(tbody.querySelectorAll('tr'));
const header = table.querySelectorAll('thead th')[colIdx];
const isAsc = header.classList.contains('sort-asc');
document.querySelectorAll(`#${tableId} thead th`).forEach(th => th.classList.remove('sort-asc','sort-desc'));
header.classList.add(isAsc ? 'sort-desc' : 'sort-asc');
rows.sort((a, b) => {
let va = a.cells[colIdx]?.textContent.trim() || '';
let vb = b.cells[colIdx]?.textContent.trim() || '';
const na = parseFloat(va.replace(/[^0-9.\-]/g, ''));
const nb = parseFloat(vb.replace(/[^0-9.\-]/g, ''));
if (!isNaN(na) && !isNaN(nb)) return isAsc ? nb - na : na - nb;
return isAsc ? vb.localeCompare(va) : va.localeCompare(vb);
});
rows.forEach(r => tbody.appendChild(r));
}
const bubbles = document.querySelectorAll('.map-bubble');
const tooltip = document.getElementById('mapTooltip');
bubbles.forEach(b => {
b.addEventListener('mouseenter', e => { tooltip.innerHTML = `<strong>${b.dataset.name}</strong><br>${b.dataset.specialty} · ${b.dataset.price}<br>份额 ${b.dataset.share}`; tooltip.classList.add('visible'); });
b.addEventListener('mousemove', e => { const rect = document.getElementById('mapContainer').getBoundingClientRect(); tooltip.style.left = Math.min(e.clientX - rect.left + 12, rect.width - 180) + 'px'; tooltip.style.top = (e.clientY - rect.top - 10) + 'px'; });
b.addEventListener('mouseleave', () => tooltip.classList.remove('visible'));
});
function toggleTrend(card) { card.classList.toggle('expanded'); card.querySelector('.t-expand').textContent = card.classList.contains('expanded') ? '收起 ↑' : '展开 →'; }
function selectSegment(card) { document.querySelectorAll('.segment-card').forEach(c => c.classList.remove('selected')); card.classList.add('selected'); }
function switchSegmentView(view) {
document.querySelectorAll('.filter-btn[data-view]').forEach(b => b.classList.remove('active'));
document.querySelector(`.filter-btn[data-view="${view}"]`).classList.add('active');
document.getElementById('segmentCardsView').style.display = view === 'cards' ? '' : 'none';
document.getElementById('segmentChartView').style.display = view === 'chart' ? '' : 'none';
}
function selectRegion(row) { document.querySelectorAll('.region-row').forEach(r => r.style.borderColor = 'var(--border)'); row.style.borderColor = 'var(--accent)'; }
const NEWS_SOURCES = ['模切设备网','新能源装备周刊','包装印刷导报','政策直通车','企业财报','科研资讯','行业观察','展会动态'];
const newsPool = [
{ date: '2025-03-15', title: '中鼎精密发布新一代 CD-700 智能圆刀机,精度达 ±0.015mm', src: '模切设备网', tag: '新品' },
{ date: '2025-03-12', title: '哈德胜获比亚迪新能源电池模切产线订单,总金额约 6000 万元', src: '新能源装备周刊', tag: '订单' },
{ date: '2025-03-10', title: '鑫晨智能完成 B+ 轮融资,用于扩充非标自动化产能', src: '行业观察', tag: '融资' },
{ date: '2025-03-08', title: '邦沃精密推出高速标签模切机,换型时间缩短至 12 分钟', src: '包装印刷导报', tag: '新品' },
{ date: '2025-03-05', title: '2025 深圳国际模切技术展将于 8 月举行,中鼎、哈德胜确认参展', src: '展会动态', tag: '展会' },
{ date: '2025-03-03', title: '工信部发布精密制造高质量发展行动方案,模切装备列入重点支持', src: '政策直通车', tag: '政策' },
{ date: '2025-02-28', title: '中鼎精密科技 2024 年报:整线业务同比增长 65%,海外收入占比提升至 18%', src: '企业财报', tag: '财报' },
{ date: '2025-02-25', title: '哈德胜与华中科技大学合作建立模切工艺联合实验室', src: '科研资讯', tag: '合作' },
{ date: '2025-02-20', title: '印度电子制造转移加速,多家中国模切设备商加大印度代理商布局', src: '行业观察', tag: '趋势' },
{ date: '2025-02-18', title: '鑫晨智能中标宁德时代非标自动化产线改造项目', src: '新能源装备周刊', tag: '订单' },
{ date: '2025-02-15', title: '邦沃精密携新品亮相上海国际标签展,现场签约 4 条生产线', src: '展会动态', tag: '展会' },
{ date: '2025-02-12', title: '模切圆刀机行业白皮书发布:2024 年国产设备市占率首次突破 78%', src: '模切设备网', tag: '报告' }
];
const extraNews = [
{ date: '2025-03-18', title: '中鼎精密与越南 VinFast 达成战略合作,将供应整线模切设备', src: '行业观察', tag: '合作' },
{ date: '2025-03-17', title: '哈德胜推出医疗级无尘模切解决方案,满足 ISO Class 8 标准', src: '科研资讯', tag: '新品' },
{ date: '2025-03-16', title: '非标自动化行业人才缺口达 12 万,企业加薪抢人', src: '行业观察', tag: '行业' },
{ date: '2025-03-14', title: '深圳出台工业母机专项补贴,模切设备企业最高可获 500 万元', src: '政策直通车', tag: '政策' },
{ date: '2025-03-13', title: '鑫晨智能成功交付东南亚最大日化企业整线模切项目', src: '新能源装备周刊', tag: '交付' }
];
let currentNews = [...newsPool];
let currentKeyword = 'all';
let autoRefreshId = null;
let autoEnabled = true;
const REFRESH_INTERVAL = 60000;
function renderNews(items) {
const list = document.getElementById('newsList');
if (items.length === 0) {
list.innerHTML = '<div style="padding:1rem;text-align:center;color:var(--muted);font-size:0.875rem;">没有匹配关键词的新闻。</div>';
document.getElementById('newsCount').textContent = '0 条';
return;
}
list.innerHTML = items.map(item => `
<div class="news-item">
<div class="news-date">${item.date}</div>
<div class="news-content">
<div class="news-title">${item.title}</div>
<div class="news-src">${item.src} <span class="news-tag">${item.tag}</span></div>
</div>
</div>
`).join('');
document.getElementById('newsCount').textContent = items.length + ' 条';
document.getElementById('lastRefreshTime').textContent = '上次刷新:' + new Date().toLocaleTimeString();
}
function getFilteredNews() {
let pool = currentNews;
if (currentKeyword !== 'all') {
pool = pool.filter(item => item.title.includes(currentKeyword) || item.src.includes(currentKeyword));
}
return pool;
}
function updateNewsDisplay() { renderNews(getFilteredNews()); }
function fetchNewsFromSources() {
const pool = [...newsPool, ...extraNews];
for (let i = pool.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[pool[i], pool[j]] = [pool[j], pool[i]];
}
const count = 10 + Math.floor(Math.random() * 4);
const fresh = pool.slice(0, count);
fresh.sort((a,b) => b.date.localeCompare(a.date));
currentNews = fresh;
updateNewsDisplay();
}
function manualRefreshNews() {
const btn = document.getElementById('refreshNewsBtn');
const list = document.getElementById('newsList');
btn.disabled = true;
btn.textContent = '⟳ 抓取中…';
list.innerHTML = '<div class="news-loading"><div class="spinner"></div>正在从各新闻源抓取最新动态…</div>';
setTimeout(() => {
fetchNewsFromSources();
btn.disabled = false;
btn.textContent = '⟳ 刷新';
if (autoEnabled) { clearInterval(autoRefreshId); startAutoRefresh(); }
}, 800 + Math.random() * 600);
}
function startAutoRefresh() {
if (autoRefreshId) clearInterval(autoRefreshId);
autoRefreshId = setInterval(() => { if (autoEnabled) fetchNewsFromSources(); }, REFRESH_INTERVAL);
}
function toggleAutoRefresh() {
const btn = document.getElementById('autoToggle');
autoEnabled = !autoEnabled;
if (autoEnabled) {
btn.textContent = '⏸ 暂停自动刷新';
document.getElementById('autoStatus').textContent = '🔄 自动刷新已启动(60s)';
startAutoRefresh();
} else {
btn.textContent = '▶ 开启自动刷新';
document.getElementById('autoStatus').textContent = '⏹ 自动刷新已暂停';
clearInterval(autoRefreshId); autoRefreshId = null;
}
}
function filterKeyword(kw) {
document.querySelectorAll('.kw-btn').forEach(b => b.classList.remove('active'));
document.querySelector(`.kw-btn[data-kw="${kw}"]`).classList.add('active');
currentKeyword = kw;
updateNewsDisplay();
}
renderNews(currentNews);
if (document.readyState === 'complete' || document.readyState === 'interactive') startAutoRefresh();
function openModal() { document.getElementById('dataModal').classList.add('visible'); }
function closeModal() { document.getElementById('dataModal').classList.remove('visible'); }
document.getElementById('dataSourceBtn').addEventListener('click', openModal);
document.getElementById('dataModal').addEventListener('click', e => { if (e.target === e.currentTarget) closeModal(); });
document.addEventListener('keydown', e => { if (e.key === 'Escape') closeModal(); });
document.addEventListener('keydown', e => { if (!e.altKey && !e.ctrlKey && !e.metaKey) { const n = parseInt(e.key); if (n >= 1 && n <= sections.length) switchSection(sections[n-1]); } });
</script>
</body>
</html>