戒酒的李白

Fix Bug.

Showing 35 changed files with 5303 additions and 722 deletions
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告 - 武汉大学</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
  19 + <style>
  20 + :root {
  21 + --bg-color: #f4f7f9;
  22 + --card-bg-color: #ffffff;
  23 + --text-color: #333333;
  24 + --heading-color: #1a253c;
  25 + --primary-color: #2a64b4;
  26 + --primary-hover-color: #1e4a8a;
  27 + --secondary-color: #6c757d;
  28 + --border-color: #e0e0e0;
  29 + --shadow-color: rgba(0, 0, 0, 0.05);
  30 + --sidebar-bg: #1a253c;
  31 + --sidebar-text: #ffffff;
  32 + --sidebar-hover: #3a4a6e;
  33 + --chart-grid-color: rgba(0, 0, 0, 0.05);
  34 + }
  35 +
  36 + html.dark-mode {
  37 + --bg-color: #121212;
  38 + --card-bg-color: #1e1e1e;
  39 + --text-color: #e0e0e0;
  40 + --heading-color: #ffffff;
  41 + --primary-color: #5893df;
  42 + --primary-hover-color: #7baef3;
  43 + --secondary-color: #adb5bd;
  44 + --border-color: #333333;
  45 + --shadow-color: rgba(0, 0, 0, 0.2);
  46 + --sidebar-bg: #1e1e1e;
  47 + --sidebar-text: #e0e0e0;
  48 + --sidebar-hover: #333333;
  49 + --chart-grid-color: rgba(255, 255, 255, 0.1);
  50 + }
  51 +
  52 + body {
  53 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  54 + margin: 0;
  55 + background-color: var(--bg-color);
  56 + color: var(--text-color);
  57 + display: flex;
  58 + transition: background-color 0.3s, color 0.3s;
  59 + }
  60 +
  61 + #sidebar {
  62 + width: 260px;
  63 + background-color: var(--sidebar-bg);
  64 + color: var(--sidebar-text);
  65 + padding: 20px 0;
  66 + position: fixed;
  67 + height: 100%;
  68 + overflow-y: auto;
  69 + transition: background-color 0.3s;
  70 + }
  71 +
  72 + #sidebar h2 {
  73 + text-align: center;
  74 + color: var(--sidebar-text);
  75 + padding: 0 20px;
  76 + margin-bottom: 30px;
  77 + font-size: 1.5em;
  78 + }
  79 +
  80 + #sidebar nav ul {
  81 + list-style: none;
  82 + padding: 0;
  83 + margin: 0;
  84 + }
  85 +
  86 + #sidebar nav ul li a {
  87 + display: block;
  88 + padding: 12px 20px;
  89 + color: var(--sidebar-text);
  90 + text-decoration: none;
  91 + transition: background-color 0.3s;
  92 + border-left: 3px solid transparent;
  93 + }
  94 +
  95 + #sidebar nav ul li a:hover {
  96 + background-color: var(--sidebar-hover);
  97 + border-left-color: var(--primary-color);
  98 + }
  99 +
  100 + #main-content {
  101 + margin-left: 260px;
  102 + flex-grow: 1;
  103 + padding: 30px 40px;
  104 + }
  105 +
  106 + #report-header {
  107 + display: flex;
  108 + justify-content: space-between;
  109 + align-items: center;
  110 + border-bottom: 2px solid var(--border-color);
  111 + padding-bottom: 20px;
  112 + margin-bottom: 30px;
  113 + }
  114 +
  115 + #report-header h1 {
  116 + color: var(--heading-color);
  117 + margin: 0;
  118 + font-size: 2.2em;
  119 + }
  120 +
  121 + .header-actions button {
  122 + background-color: var(--primary-color);
  123 + color: white;
  124 + border: none;
  125 + padding: 10px 15px;
  126 + border-radius: 5px;
  127 + cursor: pointer;
  128 + margin-left: 10px;
  129 + transition: background-color 0.3s;
  130 + }
  131 +
  132 + .header-actions button:hover {
  133 + background-color: var(--primary-hover-color);
  134 + }
  135 +
  136 + .theme-switcher {
  137 + cursor: pointer;
  138 + font-size: 1.5em;
  139 + margin-left: 15px;
  140 + color: var(--secondary-color);
  141 + }
  142 +
  143 + .card {
  144 + background-color: var(--card-bg-color);
  145 + border-radius: 8px;
  146 + box-shadow: 0 4px 12px var(--shadow-color);
  147 + margin-bottom: 30px;
  148 + padding: 25px;
  149 + transition: background-color 0.3s, box-shadow 0.3s;
  150 + }
  151 +
  152 + .card-header {
  153 + display: flex;
  154 + justify-content: space-between;
  155 + align-items: center;
  156 + margin-bottom: 20px;
  157 + cursor: pointer;
  158 + }
  159 +
  160 + .card-header h3 {
  161 + color: var(--heading-color);
  162 + margin: 0;
  163 + font-size: 1.4em;
  164 + }
  165 +
  166 + .card-header .toggle-icon {
  167 + font-size: 1.5em;
  168 + transition: transform 0.3s;
  169 + }
  170 +
  171 + .card-content.collapsed {
  172 + display: none;
  173 + }
  174 +
  175 + .grid-container {
  176 + display: grid;
  177 + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  178 + gap: 20px;
  179 + }
  180 +
  181 + .kpi-card {
  182 + background-color: var(--card-bg-color);
  183 + padding: 20px;
  184 + border-radius: 8px;
  185 + text-align: center;
  186 + border-left: 5px solid var(--primary-color);
  187 + }
  188 +
  189 + .kpi-card .value {
  190 + font-size: 2.5em;
  191 + font-weight: bold;
  192 + color: var(--heading-color);
  193 + }
  194 +
  195 + .kpi-card .label {
  196 + font-size: 1em;
  197 + color: var(--secondary-color);
  198 + }
  199 +
  200 + .chart-container {
  201 + position: relative;
  202 + height: 400px;
  203 + width: 100%;
  204 + }
  205 +
  206 + .timeline {
  207 + position: relative;
  208 + padding: 20px 0;
  209 + }
  210 +
  211 + .timeline::before {
  212 + content: '';
  213 + position: absolute;
  214 + left: 20px;
  215 + top: 0;
  216 + bottom: 0;
  217 + width: 2px;
  218 + background-color: var(--border-color);
  219 + }
  220 +
  221 + .timeline-item {
  222 + margin-bottom: 30px;
  223 + position: relative;
  224 + padding-left: 50px;
  225 + }
  226 +
  227 + .timeline-item::before {
  228 + content: '';
  229 + position: absolute;
  230 + left: 13px;
  231 + top: 5px;
  232 + width: 15px;
  233 + height: 15px;
  234 + border-radius: 50%;
  235 + background-color: var(--primary-color);
  236 + border: 2px solid var(--bg-color);
  237 + }
  238 +
  239 + .timeline-item .time {
  240 + font-weight: bold;
  241 + color: var(--primary-color);
  242 + margin-bottom: 5px;
  243 + }
  244 +
  245 + .hot-topic-table {
  246 + width: 100%;
  247 + border-collapse: collapse;
  248 + }
  249 +
  250 + .hot-topic-table th, .hot-topic-table td {
  251 + padding: 12px 15px;
  252 + border: 1px solid var(--border-color);
  253 + text-align: left;
  254 + }
  255 +
  256 + .hot-topic-table th {
  257 + background-color: var(--bg-color);
  258 + color: var(--heading-color);
  259 + }
  260 +
  261 + .tag {
  262 + display: inline-block;
  263 + padding: 4px 10px;
  264 + border-radius: 15px;
  265 + font-size: 0.8em;
  266 + font-weight: bold;
  267 + }
  268 + .tag-positive { background-color: #d4edda; color: #155724; }
  269 + .tag-negative { background-color: #f8d7da; color: #721c24; }
  270 + .tag-neutral { background-color: #e2e3e5; color: #383d41; }
  271 + .tag-pride { background-color: #cce5ff; color: #004085; }
  272 + .tag-anxiety { background-color: #fff3cd; color: #856404; }
  273 +
  274 + @media (max-width: 992px) {
  275 + #sidebar {
  276 + transform: translateX(-260px);
  277 + position: fixed;
  278 + z-index: 1000;
  279 + transition: transform 0.3s;
  280 + }
  281 + #sidebar.open {
  282 + transform: translateX(0);
  283 + }
  284 + #main-content {
  285 + margin-left: 0;
  286 + padding: 20px;
  287 + }
  288 + #report-header h1 { font-size: 1.8em; }
  289 + }
  290 +
  291 + @media (max-width: 768px) {
  292 + .grid-container {
  293 + grid-template-columns: 1fr;
  294 + }
  295 + #report-header {
  296 + flex-direction: column;
  297 + align-items: flex-start;
  298 + }
  299 + #report-header h1 { margin-bottom: 15px; }
  300 + }
  301 +
  302 + @media print {
  303 + #sidebar, .header-actions {
  304 + display: none;
  305 + }
  306 + #main-content {
  307 + margin-left: 0;
  308 + padding: 0;
  309 + width: 100%;
  310 + }
  311 + body {
  312 + display: block;
  313 + background-color: #fff;
  314 + color: #000;
  315 + }
  316 + .card {
  317 + box-shadow: none;
  318 + border: 1px solid #ccc;
  319 + page-break-inside: avoid;
  320 + }
  321 + }
  322 + </style>
  323 +</head>
  324 +<body>
  325 +
  326 + <aside id="sidebar">
  327 + <h2>舆情分析报告</h2>
  328 + <nav>
  329 + <ul>
  330 + <li><a href="#overview">1.0 舆情概览</a></li>
  331 + <li><a href="#trends">2.0 关键数据趋势</a></li>
  332 + <li><a href="#timeline">3.0 舆情动态时间轴</a></li>
  333 + <li><a href="#hot-topics">4.0 热点话题追踪</a></li>
  334 + <li><a href="#channels">5.0 重点渠道表现</a></li>
  335 + <li><a href="#risks">6.0 负面与风险监测</a></li>
  336 + <li><a href="#summary">7.0 简报与关注点</a></li>
  337 + <li><a href="#appendix">附录:综合信息</a></li>
  338 + </ul>
  339 + </nav>
  340 + </aside>
  341 +
  342 + <main id="main-content">
  343 + <header id="report-header">
  344 + <div>
  345 + <h1>智能舆情分析报告:武汉大学</h1>
  346 + <p style="color: var(--secondary-color); margin-top: 5px;">数据周期: 2024-03-01 至 2024-04-30</p>
  347 + </div>
  348 + <div class="header-actions">
  349 + <span id="theme-switcher" class="theme-switcher">☀️</span>
  350 + <button onclick="window.print()">打印报告</button>
  351 + <button id="download-pdf">导出PDF</button>
  352 + </div>
  353 + </header>
  354 +
  355 + <section id="overview" class="card">
  356 + <div class="card-header collapser">
  357 + <h3>1.0 本期舆情概览</h3>
  358 + <span class="toggle-icon"></span>
  359 + </div>
  360 + <div class="card-content">
  361 + <h4>1.1 核心数据看板</h4>
  362 + <div class="grid-container" style="margin-bottom: 30px;">
  363 + <div class="kpi-card">
  364 + <div class="value">~210万</div>
  365 + <div class="label">有效讨论量</div>
  366 + </div>
  367 + <div class="kpi-card">
  368 + <div class="value">~3.8亿</div>
  369 + <div class="label">总阅读/播放量</div>
  370 + </div>
  371 + <div class="kpi-card">
  372 + <div class="value">~420万</div>
  373 + <div class="label">总互动量</div>
  374 + </div>
  375 + </div>
  376 +
  377 + <h4>1.2 本期舆情热度 TOP 3</h4>
  378 + <ol>
  379 + <li><strong>武大樱花季预约与体验:</strong>微博话题 #武大樱花预约# 阅读量达3.8亿,引发关于“抢票难”、“校园过度商业化”的广泛讨论,情感呈现“浪漫”与“焦虑”交织。</li>
  380 + <li><strong>顶尖学科声誉与毕业生现实焦虑:</strong>知乎关于“测绘遥感世界第一”的讨论获4.5万赞,但同时伴随对毕业生薪资(春招中位数7.2k)与房价对比的焦虑,形成“自豪”与“现实压力”的强烈对比。</li>
  381 + <li><strong>校史叙事与文化认同:</strong>从“1893自强学堂”到“1913国立武昌高师”的校史起点争议在贴吧等平台持续发酵,同时抖音上“学大汉武立国”的倒读梗病毒式传播,体现了校友对历史的多元解读与文化认同。</li>
  382 + </ol>
  383 +
  384 + <h4>1.3 重点预警</h4>
  385 + <ul>
  386 + <li><strong>就业焦虑情绪上升:</strong>尽管学校学科排名高、科研实力强,但网络上关于优势专业毕业生薪资待遇不及预期的讨论增多,可能影响对未来考生的吸引力。</li>
  387 + <li><strong>校园资源分配不均感知:</strong>“院士隔壁的‘二等公民’”等言论反映出部分学生对校内顶尖资源与普通资源差距的强烈感知,存在内部矛盾激化的潜在风险。</li>
  388 + <li><strong>校园开放与管理矛盾:</strong>樱花季等开放活动在提升学校美誉度的同时,也带来了管理压力和校内师生体验下降的负面声音,需平衡社会服务与校内秩序。</li>
  389 + </ul>
  390 + </div>
  391 + </section>
  392 +
  393 + <section id="trends" class="card">
  394 + <div class="card-header collapser">
  395 + <h3>2.0 关键数据趋势</h3>
  396 + <span class="toggle-icon"></span>
  397 + </div>
  398 + <div class="card-content">
  399 + <div class="grid-container">
  400 + <div>
  401 + <h4>2.1 声量走势</h4>
  402 + <div class="chart-container">
  403 + <canvas id="volumeTrendChart"></canvas>
  404 + </div>
  405 + </div>
  406 + <div>
  407 + <h4>2.2 情感趋势</h4>
  408 + <div class="chart-container">
  409 + <canvas id="sentimentTrendChart"></canvas>
  410 + </div>
  411 + </div>
  412 + </div>
  413 + </div>
  414 + </section>
  415 +
  416 + <section id="timeline" class="card">
  417 + <div class="card-header collapser">
  418 + <h3>3.0 本周期舆情动态时间轴</h3>
  419 + <span class="toggle-icon"></span>
  420 + </div>
  421 + <div class="card-content">
  422 + <div class="timeline">
  423 + <div class="timeline-item">
  424 + <div class="time">3月初</div>
  425 + <p><strong>樱花季预热:</strong>小红书、抖音涌现大量“武大赏樱攻略”,正面情感以“浪漫”、“期待”为主。</p>
  426 + </div>
  427 + <div class="timeline-item">
  428 + <div class="time">3月中旬</div>
  429 + <p><strong>樱花预约开启:</strong>#武大樱花预约#登上微博热搜,因系统拥堵、黄牛等问题,负面“吐槽”、“焦虑”情绪显著上升,形成舆情高峰。</p>
  430 + </div>
  431 + <div class="timeline-item">
  432 + <div class="time">3月底</div>
  433 + <p><strong>春季招聘会:</strong>知乎、脉脉等平台出现关于武大毕业生薪资的讨论,测绘、法学等王牌专业就业的“焦虑”情绪开始发酵。</p>
  434 + </div>
  435 + <div class="timeline-item">
  436 + <div class="time">4月上旬</div>
  437 + <p><strong>校友返校与文化活动:</strong>京都大学学生朗诵《将进酒》视频在B站走红,引发对武大人文底蕴的“自豪”感;校史起点争议在贴吧被重提。</p>
  438 + </div>
  439 + <div class="timeline-item">
  440 + <div class="time">4月中旬</div>
  441 + <p><strong>科研成果发布:</strong>官方发布“给原子拍CT”等大科学装置进展,引发科技媒体和知识类博主关注,正面“敬意”、“感谢”声量增加。</p>
  442 + </div>
  443 + <div class="timeline-item">
  444 + <div class="time">4月底</div>
  445 + <p><strong>学期末与交换生话题:</strong>关于海外交换项目费用和学分转换的讨论增多,情感呈现“理想”与“质疑”的两极化。</p>
  446 + </div>
  447 + </div>
  448 + </div>
  449 + </section>
  450 +
  451 + <section id="hot-topics" class="card">
  452 + <div class="card-header collapser">
  453 + <h3>4.0 热点话题追踪</h3>
  454 + <span class="toggle-icon"></span>
  455 + </div>
  456 + <div class="card-content">
  457 + <h4>4.1 本期热点话题详情</h4>
  458 + <table class="hot-topic-table">
  459 + <thead>
  460 + <tr>
  461 + <th>热点话题</th>
  462 + <th>高光叙事 (正面/中性)</th>
  463 + <th>焦虑痛点 (负面/争议)</th>
  464 + <th>核心情感</th>
  465 + </tr>
  466 + </thead>
  467 + <tbody>
  468 + <tr>
  469 + <td><strong>樱花季:浪漫与喧嚣</strong></td>
  470 + <td>“中国最美大学”的视觉盛宴,小红书“童话滤镜”获10万赞,承载校友怀旧与游客向往。</td>
  471 + <td>“抢票堪比春运”,预约系统崩溃引吐槽。#武汉人挤不进武大#话题引3.8万条愤怒,商业化被指“母校变景点”。</td>
  472 + <td><span class="tag tag-positive">浪漫 42%</span> <span class="tag tag-anxiety">焦虑 28%</span> <span class="tag tag-neutral">怀旧 21%</span></td>
  473 + </tr>
  474 + <tr>
  475 + <td><strong>学科声望:世界第一与工资条</strong></td>
  476 + <td>测绘遥感全球第一、法学全国前三等学科实力引发广泛自豪。院士、诺奖得主等顶尖师资是“最强磁场”。</td>
  477 + <td>“世界第一的专业买不起武汉一平米”,毕业生薪资与高房价对比引发现实焦虑。法学、医学等专业同样面临高压实习、规培待遇低的困境。</td>
  478 + <td><span class="tag tag-pride">自豪 51%</span> <span class="tag tag-anxiety">焦虑 24%</span> <span class="tag tag-neutral">敬意 8%</span></td>
  479 + </tr>
  480 + <tr>
  481 + <td><strong>校史文化:共同剧本与身份认同</strong></td>
  482 + <td>抖音“学大汉武立国”倒读梗走红,校友以幽默方式参与历史叙事。老斋舍、十八栋等历史建筑是共同的文化记忆。</td>
  483 + <td>关于“1893 vs 1913”的校史起点争议在贴吧等社区周期性出现,被部分学生吐槽为“官方叙事模糊”。</td>
  484 + <td><span class="tag tag-pride">自豪 38%</span> <span class="tag tag-neutral">吐槽 34%</span> <span class="tag tag-positive">怀旧 20%</span></td>
  485 + </tr>
  486 + </tbody>
  487 + </table>
  488 + <h4 style="margin-top: 30px;">4.2 新增/突发话题</h4>
  489 + <p><strong>“资源落差感”成为新舆情燃点:</strong>本周期内,“院士把卫星数据当糖果发”与“PCR仪排队三周”的对比,在学生群体中引发关于“资源不均”的讨论。这一话题虽未大规模破圈,但在校内论坛和匿名社区中热度较高,反映了学生对公平教育资源分配的深层关切,是值得关注的潜在负面情绪增长点。</p>
  490 + </div>
  491 + </section>
  492 +
  493 + <section id="channels" class="card">
  494 + <div class="card-header collapser">
  495 + <h3>5.0 重点渠道表现</h3>
  496 + <span class="toggle-icon"></span>
  497 + </div>
  498 + <div class="card-content">
  499 + <div class="grid-container">
  500 + <div>
  501 + <h4>5.1 整体情感分布</h4>
  502 + <div class="chart-container">
  503 + <canvas id="sentimentPieChart"></canvas>
  504 + </div>
  505 + </div>
  506 + <div>
  507 + <h4>5.2 平台声量来源分布</h4>
  508 + <div class="chart-container">
  509 + <canvas id="sourceDistributionChart"></canvas>
  510 + </div>
  511 + </div>
  512 + </div>
  513 + </div>
  514 + </section>
  515 +
  516 + <section id="risks" class="card">
  517 + <div class="card-header collapser">
  518 + <h3>6.0 负面与风险监测</h3>
  519 + <span class="toggle-icon"></span>
  520 + </div>
  521 + <div class="card-content">
  522 + <h4>6.1 负面信息汇总</h4>
  523 + <ul>
  524 + <li><strong>就业前景焦虑:</strong>关于“名校高学历贬值”、“王牌专业就业难、薪资低”的讨论,尤其集中在测绘、法学、临床医学规培等领域。</li>
  525 + <li><strong>校园管理与商业化批评:</strong>主要围绕樱花季的预约难、
  526 +</body>
  527 +</html>
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告 - 武汉大学</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <style>
  19 + :root {
  20 + --primary-color: #2c3e50;
  21 + --secondary-color: #3498db;
  22 + --background-color: #f4f7f9;
  23 + --card-bg-color: #ffffff;
  24 + --text-color: #333333;
  25 + --heading-color: #2c3e50;
  26 + --border-color: #e0e0e0;
  27 + --shadow-color: rgba(0, 0, 0, 0.08);
  28 + --success-color: #27ae60;
  29 + --warning-color: #f39c12;
  30 + --danger-color: #e74c3c;
  31 + --neutral-color: #95a5a6;
  32 + --font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif;
  33 + }
  34 +
  35 + .dark-mode {
  36 + --primary-color: #ecf0f1;
  37 + --secondary-color: #3498db;
  38 + --background-color: #1e272e;
  39 + --card-bg-color: #2c3a47;
  40 + --text-color: #bdc3c7;
  41 + --heading-color: #ffffff;
  42 + --border-color: #4a6fa5;
  43 + --shadow-color: rgba(0, 0, 0, 0.2);
  44 + }
  45 +
  46 + * {
  47 + box-sizing: border-box;
  48 + margin: 0;
  49 + padding: 0;
  50 + }
  51 +
  52 + body {
  53 + font-family: var(--font-family);
  54 + background-color: var(--background-color);
  55 + color: var(--text-color);
  56 + line-height: 1.6;
  57 + transition: background-color 0.3s, color 0.3s;
  58 + font-size: 16px;
  59 + }
  60 +
  61 + .container {
  62 + display: flex;
  63 + max-width: 1600px;
  64 + margin: 0 auto;
  65 + }
  66 +
  67 + .sidebar {
  68 + width: 260px;
  69 + background-color: var(--card-bg-color);
  70 + border-right: 1px solid var(--border-color);
  71 + position: sticky;
  72 + top: 0;
  73 + height: 100vh;
  74 + overflow-y: auto;
  75 + padding: 20px;
  76 + transition: background-color 0.3s, border-color 0.3s;
  77 + }
  78 +
  79 + .sidebar h2 {
  80 + font-size: 1.2em;
  81 + color: var(--heading-color);
  82 + margin-bottom: 20px;
  83 + border-bottom: 2px solid var(--secondary-color);
  84 + padding-bottom: 10px;
  85 + }
  86 +
  87 + .sidebar nav ul {
  88 + list-style: none;
  89 + }
  90 +
  91 + .sidebar nav li a {
  92 + display: block;
  93 + color: var(--text-color);
  94 + text-decoration: none;
  95 + padding: 10px 15px;
  96 + border-radius: 5px;
  97 + margin-bottom: 5px;
  98 + transition: background-color 0.2s, color 0.2s;
  99 + }
  100 +
  101 + .sidebar nav li a:hover, .sidebar nav li a.active {
  102 + background-color: var(--secondary-color);
  103 + color: #fff;
  104 + }
  105 +
  106 + .main-content {
  107 + flex-grow: 1;
  108 + padding: 30px;
  109 + overflow-x: hidden;
  110 + }
  111 +
  112 + header {
  113 + margin-bottom: 30px;
  114 + }
  115 +
  116 + header h1 {
  117 + font-size: 2.5em;
  118 + color: var(--heading-color);
  119 + margin-bottom: 10px;
  120 + }
  121 +
  122 + header .meta-info {
  123 + font-size: 0.9em;
  124 + color: var(--neutral-color);
  125 + }
  126 +
  127 + .card {
  128 + background-color: var(--card-bg-color);
  129 + border-radius: 12px;
  130 + padding: 25px;
  131 + margin-bottom: 30px;
  132 + box-shadow: 0 4px 15px var(--shadow-color);
  133 + transition: background-color 0.3s, box-shadow 0.3s;
  134 + }
  135 +
  136 + .card-header {
  137 + display: flex;
  138 + justify-content: space-between;
  139 + align-items: center;
  140 + cursor: pointer;
  141 + border-bottom: 1px solid var(--border-color);
  142 + padding-bottom: 15px;
  143 + margin-bottom: 20px;
  144 + }
  145 +
  146 + .card-header h3 {
  147 + color: var(--heading-color);
  148 + font-size: 1.5em;
  149 + }
  150 +
  151 + .card-header .toggle-icon {
  152 + font-size: 1.5em;
  153 + transition: transform 0.3s;
  154 + }
  155 +
  156 + .card-header.collapsed .toggle-icon {
  157 + transform: rotate(-90deg);
  158 + }
  159 +
  160 + .card-content {
  161 + max-height: 5000px;
  162 + overflow: hidden;
  163 + transition: max-height 0.7s ease-in-out, padding 0.5s ease;
  164 + }
  165 +
  166 + .card-content.collapsed {
  167 + max-height: 0;
  168 + padding-top: 0;
  169 + padding-bottom: 0;
  170 + margin-top: -20px;
  171 + }
  172 +
  173 + .grid-container {
  174 + display: grid;
  175 + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  176 + gap: 20px;
  177 + margin-bottom: 20px;
  178 + }
  179 +
  180 + .stat-box {
  181 + background: linear-gradient(135deg, var(--card-bg-color), color-mix(in srgb, var(--card-bg-color) 80%, var(--secondary-color)));
  182 + padding: 20px;
  183 + border-radius: 8px;
  184 + text-align: center;
  185 + border: 1px solid var(--border-color);
  186 + }
  187 +
  188 + .stat-box .value {
  189 + font-size: 2em;
  190 + font-weight: bold;
  191 + color: var(--heading-color);
  192 + }
  193 +
  194 + .stat-box .label {
  195 + font-size: 0.9em;
  196 + color: var(--neutral-color);
  197 + }
  198 +
  199 + .topic-list li {
  200 + background-color: var(--background-color);
  201 + padding: 15px;
  202 + border-radius: 8px;
  203 + margin-bottom: 10px;
  204 + border-left: 4px solid var(--secondary-color);
  205 + }
  206 +
  207 + .topic-list li strong {
  208 + color: var(--heading-color);
  209 + }
  210 +
  211 + .alert-box {
  212 + padding: 15px;
  213 + border-radius: 8px;
  214 + margin-bottom: 10px;
  215 + border-left: 5px solid;
  216 + }
  217 +
  218 + .alert-warning {
  219 + background-color: color-mix(in srgb, var(--warning-color) 15%, transparent);
  220 + border-color: var(--warning-color);
  221 + }
  222 +
  223 + .chart-container {
  224 + position: relative;
  225 + height: 400px;
  226 + width: 100%;
  227 + }
  228 +
  229 + .timeline {
  230 + position: relative;
  231 + padding: 20px 0;
  232 + }
  233 + .timeline::before {
  234 + content: '';
  235 + position: absolute;
  236 + left: 20px;
  237 + top: 0;
  238 + bottom: 0;
  239 + width: 2px;
  240 + background: var(--border-color);
  241 + }
  242 + .timeline-item {
  243 + position: relative;
  244 + margin-bottom: 20px;
  245 + padding-left: 40px;
  246 + }
  247 + .timeline-item::before {
  248 + content: '';
  249 + position: absolute;
  250 + left: 13px;
  251 + top: 5px;
  252 + width: 15px;
  253 + height: 15px;
  254 + border-radius: 50%;
  255 + background: var(--secondary-color);
  256 + border: 2px solid var(--background-color);
  257 + }
  258 + .timeline-item .time {
  259 + font-weight: bold;
  260 + color: var(--secondary-color);
  261 + display: block;
  262 + margin-bottom: 5px;
  263 + }
  264 +
  265 + table {
  266 + width: 100%;
  267 + border-collapse: collapse;
  268 + margin-top: 20px;
  269 + }
  270 +
  271 + th, td {
  272 + padding: 12px 15px;
  273 + border: 1px solid var(--border-color);
  274 + text-align: left;
  275 + }
  276 +
  277 + th {
  278 + background-color: color-mix(in srgb, var(--primary-color) 10%, var(--card-bg-color));
  279 + color: var(--heading-color);
  280 + }
  281 +
  282 + .controls {
  283 + position: fixed;
  284 + top: 20px;
  285 + right: 30px;
  286 + display: flex;
  287 + gap: 10px;
  288 + z-index: 1000;
  289 + }
  290 +
  291 + .control-btn {
  292 + background-color: var(--card-bg-color);
  293 + border: 1px solid var(--border-color);
  294 + color: var(--text-color);
  295 + padding: 10px 15px;
  296 + border-radius: 20px;
  297 + cursor: pointer;
  298 + font-size: 1em;
  299 + box-shadow: 0 2px 5px var(--shadow-color);
  300 + transition: all 0.2s;
  301 + }
  302 +
  303 + .control-btn:hover {
  304 + transform: translateY(-2px);
  305 + box-shadow: 0 4px 10px var(--shadow-color);
  306 + }
  307 +
  308 + @media (max-width: 1024px) {
  309 + .container { flex-direction: column; }
  310 + .sidebar { position: static; width: 100%; height: auto; border-right: none; border-bottom: 1px solid var(--border-color); }
  311 + .controls { position: absolute; }
  312 + }
  313 +
  314 + @media (max-width: 768px) {
  315 + .main-content { padding: 20px; }
  316 + header h1 { font-size: 2em; }
  317 + .grid-container { grid-template-columns: 1fr; }
  318 + .controls { display: none; }
  319 + }
  320 +
  321 + @media print {
  322 + body { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  323 + .sidebar, .controls, .card-header .toggle-icon { display: none; }
  324 + .main-content { padding: 0; }
  325 + .card { box-shadow: none; border: 1px solid #ccc; page-break-inside: avoid; }
  326 + .card-content, .card-content.collapsed { max-height: none !important; overflow: visible; padding: 20px !important; margin: 0 !important; }
  327 + .card-header { border-bottom: 1px solid #ccc; }
  328 + .chart-container { height: 300px; page-break-inside: avoid; }
  329 + }
  330 + </style>
  331 +</head>
  332 +<body>
  333 + <div class="controls">
  334 + <button id="theme-toggle" class="control-btn">🌙 暗色模式</button>
  335 + <button onclick="window.print()" class="control-btn">🖨️ 打印/导出PDF</button>
  336 + </div>
  337 +
  338 + <div class="container">
  339 + <aside class="sidebar">
  340 + <h2>导航目录</h2>
  341 + <nav>
  342 + <ul>
  343 + <li><a href="#s1">1.0 舆情概览</a></li>
  344 + <li><a href="#s2">2.0 关键数据趋势</a></li>
  345 + <li><a href="#s3">3.0 舆情动态时间轴</a></li>
  346 + <li><a href="#s4">4.0 热点话题追踪</a></li>
  347 + <li><a href="#s5">5.0 重点渠道表现</a></li>
  348 + <li><a href="#s6">6.0 负面与风险监测</a></li>
  349 + <li><a href="#s7">7.0 简报与关注点</a></li>
  350 + </ul>
  351 + </nav>
  352 + </aside>
  353 +
  354 + <main class="main-content">
  355 + <header>
  356 + <h1>智能舆情分析报告</h1>
  357 + <p class="meta-info">分析对象:武汉大学 | 数据周期:2024-03-01 至 2024-04-30</p>
  358 + </header>
  359 +
  360 + <section id="s1" class="card">
  361 + <div class="card-header">
  362 + <h3>1.0 本期舆情概览</h3>
  363 + <span class="toggle-icon"></span>
  364 + </div>
  365 + <div class="card-content">
  366 + <h4>1.1 核心数据看板</h4>
  367 + <div class="grid-container">
  368 + <div class="stat-box">
  369 + <div class="value">210万+</div>
  370 + <div class="label">相关声量</div>
  371 + </div>
  372 + <div class="stat-box">
  373 + <div class="value">3.8亿+</div>
  374 + <div class="label">总阅读/播放量</div>
  375 + </div>
  376 + <div class="stat-box">
  377 + <div class="value">420万+</div>
  378 + <div class="label">总互动量</div>
  379 + </div>
  380 + <div class="stat-box">
  381 + <div class="value" style="color: var(--success-color);">51%</div>
  382 + <div class="label">正面情绪占比</div>
  383 + </div>
  384 + </div>
  385 +
  386 + <h4>1.2 本期舆情热度 TOP 3</h4>
  387 + <ul class="topic-list">
  388 + <li><strong>TOP 1: 武大樱花季 (阅读量 ≈3.8亿)</strong><br>#武大樱花预约# 话题引爆社交媒体,讨论集中于预约难度、校园美景与游客管理,情感呈现“浪漫”与“焦虑”交织的两极化特征。</li>
  389 + <li><strong>TOP 2: 学科实力与就业前景讨论 (赞同/讨论 ≈5万)</strong><br>以知乎为中心,关于测绘遥感“世界第一”的自豪感,与对毕业生实际薪资水平的焦虑形成鲜明对比,引发“名校光环vs现实压力”的深度探讨。</li>
  390 + <li><strong>TOP 3: 校史渊源与文化认同 (讨论量 ≈2万)</strong><br>围绕建校史(1893 vs 1913)的“玩梗”与严肃讨论并存,体现了师生校友对学校历史的强烈关注和身份认同感。</li>
  391 + </ul>
  392 +
  393 + <h4>1.3 重点预警</h4>
  394 + <div class="alert-box alert-warning">
  395 + <strong>潜在风险:</strong>毕业生就业焦虑情绪正在从个体吐槽向群体性议题演化,尤其是顶尖学科与市场薪酬的“体感落差”可能影响未来的招生吸引力和品牌声誉。需关注并加强正面引导。
  396 + </div>
  397 + </div>
  398 + </section>
  399 +
  400 + <section id="s2" class="card">
  401 + <div class="card-header">
  402 + <h3>2.0 关键数据趋势</h3>
  403 + <span class="toggle-icon"></span>
  404 + </div>
  405 + <div class="card-content">
  406 + <h4>2.1 声量与情感走势</h4>
  407 + <div class="chart-container">
  408 + <canvas id="trendsChart"></canvas>
  409 + </div>
  410 + <p><strong>分析:</strong>声量在三月中下旬达到顶峰,与“樱花季”高度相关。正面情绪(蓝色)随樱花季和学术成就讨论而上扬,但负面/焦虑情绪(红色)也同步增长,尤其体现在樱花预约困难和后续的就业薪资讨论中,展现了舆论的双重性。</p>
  411 + <h4>2.2 整体情感分布</h4>
  412 + <div class="chart-container" style="height:350px;">
  413 + <canvas id="sentimentPieChart"></canvas>
  414 + </div>
  415 + <p><strong>分析:</strong>整体舆论以正面情绪为主(51%),主要来源于对学校历史、学术成就、美丽校园的自豪感与喜爱。负面情绪(34%)则集中于现实压力,如就业、内卷、资源分配等。中性讨论(15%)多为信息咨询与事实陈述。</p>
  416 + </div>
  417 + </section>
  418 +
  419 + <section id="s3" class="card">
  420 + <div class="card-header">
  421 + <h3>3.0 本周期舆情动态时间轴</h3>
  422 + <span class="toggle-icon"></span>
  423 + </div>
  424 + <div class="card-content">
  425 + <div class="timeline">
  426 + <div class="timeline-item">
  427 + <span class="time">3月上旬</span>
  428 + <p>樱花季预热,小红书、抖音出现大量“赏樱攻略”,正面期待情绪高涨。</p>
  429 + </div>
  430 + <div class="timeline-item">
  431 + <span class="time">3月15日</span>
  432 + <p>樱花预约通道开放,#武大樱花预约# 冲上微博热搜,因访问量过大导致系统卡顿,引发大量“抢票像春运”的吐槽,负面情绪首次高峰。</p>
  433 + </div>
  434 + <div class="timeline-item">
  435 + <span class="time">3月下旬</span>
  436 + <p>樱花盛开期,游客与学生发布的校园美景图文、视频刷屏,正面情感压倒负面,形成本周期声量与正面情绪最高峰。</p>
  437 + </div>
  438 + <div class="timeline-item">
  439 + <span class="time">4月上旬</span>
  440 + <p>知乎出现高赞问题:“如何看待武大测绘遥感世界第一,但毕业生薪资并不突出?”,引发大规模讨论,焦虑情绪显著上升。</p>
  441 + </div>
  442 + <div class="timeline-item">
  443 + <span class="time">4月中旬</span>
  444 + <p>B站“阿牙”医生等口腔医学KOL视频受关注,正面口碑持续发酵。同时,关于规培生待遇低的讨论在小范围内传播。</p>
  445 + </div>
  446 + <div class="timeline-item">
  447 + <span class="time">4月下旬</span>
  448 + <p>校友雷军、陈东升等商业成就被媒体报道,引发一波对武大“人才培养”的自豪感讨论。</p>
  449 + </div>
  450 + </div>
  451 + </div>
  452 + </section>
  453 +
  454 + <section id="s4" class="card">
  455 + <div class="card-header">
  456 + <h3>4.0 热点话题追踪</h3>
  457 + <span class="toggle-icon"></span>
  458 + </div>
  459 + <div class="card-content">
  460 + <h4>4.1 本期热点事件详情</h4>
  461 + <h5>话题一:樱花季的“浪漫”与“烦恼”</h5>
  462 + <p>樱花季是武汉大学最具代表性的公共事件。舆论场呈现清晰的两面:一方面,是海量的赞美与向往,通过精美的图文和视频,将武大樱花塑造成一个浪漫的文化符号;另一方面,是围绕“预约难”和“游客过多影响教学”的抱怨和争议。这种矛盾体现了大学作为公共文化资源与维护正常教学秩序之间的张力。</p>
  463 +
  464 + <h5>话题二:学术光环下的现实焦虑</h5>
  465 + <p>“测绘遥感世界第一”等学术成就为学校带来巨大的声誉和自豪感。然而,当这些宏大叙事与毕业生面临的“就业薪资”、“工作压力”等具体问题碰撞时,产生了强烈的舆论张力。用户讨论不再满足于抽象的排名,而是更关心“顶尖学科”能否直接转化为个体优越的职业发展。这种“自豪与焦虑并存”的心态,是当前高学历人群普遍心态的缩影。</p>
  466 +
  467 + <h4>4.2 新增/突发话题</h4>
  468 + <p><strong>国际交流成本讨论:</strong>在关于国际合作的讨论中,有声音指出哈佛等顶尖名校的交换项目成本高昂(如“300美元房租劝退普通家庭”),普通家庭学生难以企及。这个话题虽未大规模发酵,但触及了教育公平和资源普惠性的敏感点,值得关注。</p>
  469 + </div>
  470 + </section>
  471 +
  472 + <section id="s5" class="card">
  473 + <div class="card-header">
  474 + <h3>5.0 重点渠道表现</h3>
  475 + <span class="toggle-icon"></span>
  476 + </div>
  477 + <div class="card-content">
  478 + <h4>5.1 核心媒体平台表现</h4>
  479 + <div class="chart-container" style="height:350px;">
  480 + <canvas id="sourceDistributionChart"></canvas>
  481 + </div>
  482 + <p><strong>渠道分析:</strong></p>
  483 + <ul>
  484 + <li><strong>微博:</strong> 主要舆论场和话题引爆点,#武大樱花预约#等热搜源头,情绪放大效应明显。</li>
  485 + <li><strong>知乎:</strong> 深度讨论的核心阵地,关于学科实力、就业前景、校史等严肃话题的发源地,观点专业,影响力深远。</li>
  486 + <li><strong>小红书/抖音:</strong> 视觉化、生活化内容的集散地,主导了“最美大学”的形象塑造,以正面、浪漫内容为主。</li>
  487 + <li><strong>B站:</strong> 知识科普与校园生活展示平台,涌现了如口腔医学科普等优质内容,有助于专业形象的软性传播。</li>
  488 +</body>
  489 +</html>
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告 - 武汉大学</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <style>
  19 + :root {
  20 + --primary-color: #2c3e50;
  21 + --secondary-color: #3498db;
  22 + --accent-color: #2980b9;
  23 + --bg-color: #ecf0f1;
  24 + --card-bg-color: #ffffff;
  25 + --text-color: #34495e;
  26 + --heading-color: #2c3e50;
  27 + --border-color: #dce4e8;
  28 + --shadow-color: rgba(0, 0, 0, 0.1);
  29 + --success-color: #27ae60;
  30 + --warning-color: #f39c12;
  31 + --danger-color: #c0392b;
  32 + --neutral-color: #95a5a6;
  33 + }
  34 +
  35 + body.dark-mode {
  36 + --primary-color: #ecf0f1;
  37 + --secondary-color: #3498db;
  38 + --accent-color: #5dade2;
  39 + --bg-color: #2c3e50;
  40 + --card-bg-color: #34495e;
  41 + --text-color: #bdc3c7;
  42 + --heading-color: #ffffff;
  43 + --border-color: #4a627a;
  44 + --shadow-color: rgba(0, 0, 0, 0.2);
  45 + }
  46 +
  47 + * {
  48 + box-sizing: border-box;
  49 + margin: 0;
  50 + padding: 0;
  51 + }
  52 +
  53 + body {
  54 + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
  55 + background-color: var(--bg-color);
  56 + color: var(--text-color);
  57 + line-height: 1.6;
  58 + transition: background-color 0.3s, color 0.3s;
  59 + font-size: 16px;
  60 + }
  61 +
  62 + .container {
  63 + display: flex;
  64 + max-width: 1600px;
  65 + margin: 0 auto;
  66 + }
  67 +
  68 + .sidebar {
  69 + width: 260px;
  70 + background-color: var(--card-bg-color);
  71 + padding: 20px;
  72 + position: sticky;
  73 + top: 0;
  74 + height: 100vh;
  75 + overflow-y: auto;
  76 + border-right: 1px solid var(--border-color);
  77 + transition: background-color 0.3s, border-color 0.3s;
  78 + }
  79 +
  80 + .sidebar h2 {
  81 + color: var(--heading-color);
  82 + margin-bottom: 20px;
  83 + font-size: 1.5em;
  84 + border-bottom: 2px solid var(--secondary-color);
  85 + padding-bottom: 10px;
  86 + }
  87 +
  88 + .sidebar nav ul {
  89 + list-style: none;
  90 + }
  91 +
  92 + .sidebar nav li a {
  93 + display: block;
  94 + color: var(--text-color);
  95 + text-decoration: none;
  96 + padding: 10px 15px;
  97 + border-radius: 5px;
  98 + margin-bottom: 5px;
  99 + transition: background-color 0.2s, color 0.2s;
  100 + }
  101 +
  102 + .sidebar nav li a:hover, .sidebar nav li a.active {
  103 + background-color: var(--secondary-color);
  104 + color: #fff;
  105 + }
  106 +
  107 + .main-content {
  108 + flex: 1;
  109 + padding: 20px 40px;
  110 + overflow-x: hidden;
  111 + }
  112 +
  113 + header {
  114 + margin-bottom: 30px;
  115 + border-bottom: 1px solid var(--border-color);
  116 + padding-bottom: 20px;
  117 + }
  118 +
  119 + header h1 {
  120 + color: var(--heading-color);
  121 + font-size: 2.5em;
  122 + margin-bottom: 10px;
  123 + }
  124 +
  125 + header .report-meta {
  126 + font-size: 0.9em;
  127 + color: var(--neutral-color);
  128 + }
  129 +
  130 + .card {
  131 + background-color: var(--card-bg-color);
  132 + border-radius: 8px;
  133 + padding: 25px;
  134 + margin-bottom: 25px;
  135 + box-shadow: 0 4px 15px var(--shadow-color);
  136 + transition: background-color 0.3s, box-shadow 0.3s;
  137 + overflow: hidden;
  138 + }
  139 +
  140 + h2.section-title {
  141 + color: var(--heading-color);
  142 + font-size: 1.8em;
  143 + margin-bottom: 20px;
  144 + padding-bottom: 10px;
  145 + border-bottom: 2px solid var(--border-color);
  146 + }
  147 +
  148 + .dashboard {
  149 + display: grid;
  150 + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  151 + gap: 20px;
  152 + }
  153 +
  154 + .stat-item {
  155 + background-color: var(--bg-color);
  156 + padding: 20px;
  157 + border-radius: 8px;
  158 + text-align: center;
  159 + border-left: 5px solid var(--secondary-color);
  160 + }
  161 +
  162 + .stat-item .value {
  163 + font-size: 2em;
  164 + font-weight: bold;
  165 + color: var(--heading-color);
  166 + }
  167 +
  168 + .stat-item .label {
  169 + font-size: 0.9em;
  170 + color: var(--neutral-color);
  171 + }
  172 +
  173 + .chart-container {
  174 + position: relative;
  175 + height: 400px;
  176 + width: 100%;
  177 + }
  178 +
  179 + .grid-2 {
  180 + display: grid;
  181 + grid-template-columns: 1fr 1fr;
  182 + gap: 25px;
  183 + }
  184 +
  185 + details {
  186 + background: var(--bg-color);
  187 + border-radius: 5px;
  188 + padding: 15px;
  189 + margin-bottom: 15px;
  190 + border: 1px solid var(--border-color);
  191 + }
  192 +
  193 + summary {
  194 + font-weight: bold;
  195 + cursor: pointer;
  196 + color: var(--accent-color);
  197 + font-size: 1.1em;
  198 + }
  199 +
  200 + summary::marker {
  201 + color: var(--secondary-color);
  202 + }
  203 +
  204 + .timeline {
  205 + position: relative;
  206 + padding-left: 30px;
  207 + border-left: 2px solid var(--secondary-color);
  208 + }
  209 +
  210 + .timeline-item {
  211 + margin-bottom: 20px;
  212 + position: relative;
  213 + }
  214 +
  215 + .timeline-item::before {
  216 + content: '';
  217 + position: absolute;
  218 + left: -37px;
  219 + top: 5px;
  220 + width: 12px;
  221 + height: 12px;
  222 + border-radius: 50%;
  223 + background-color: var(--card-bg-color);
  224 + border: 2px solid var(--secondary-color);
  225 + }
  226 +
  227 + .timeline-item .time {
  228 + font-weight: bold;
  229 + color: var(--accent-color);
  230 + }
  231 +
  232 + .topic-card {
  233 + border-left: 5px solid;
  234 + padding-left: 20px;
  235 + }
  236 + .topic-card.danger { border-color: var(--danger-color); }
  237 + .topic-card.warning { border-color: var(--warning-color); }
  238 + .topic-card.success { border-color: var(--success-color); }
  239 +
  240 + .tag {
  241 + display: inline-block;
  242 + padding: 3px 10px;
  243 + border-radius: 15px;
  244 + font-size: 0.8em;
  245 + color: #fff;
  246 + margin-right: 5px;
  247 + }
  248 + .tag.positive { background-color: var(--success-color); }
  249 + .tag.negative { background-color: var(--danger-color); }
  250 + .tag.neutral { background-color: var(--neutral-color); }
  251 +
  252 + .toolbar {
  253 + position: fixed;
  254 + bottom: 20px;
  255 + right: 20px;
  256 + display: flex;
  257 + gap: 10px;
  258 + z-index: 1000;
  259 + }
  260 +
  261 + .toolbar button {
  262 + background-color: var(--primary-color);
  263 + color: var(--bg-color);
  264 + border: none;
  265 + border-radius: 50%;
  266 + width: 50px;
  267 + height: 50px;
  268 + font-size: 1.5em;
  269 + cursor: pointer;
  270 + box-shadow: 0 4px 10px var(--shadow-color);
  271 + transition: transform 0.2s, background-color 0.3s;
  272 + }
  273 +
  274 + .toolbar button:hover {
  275 + transform: translateY(-3px);
  276 + background-color: var(--accent-color);
  277 + }
  278 +
  279 + table {
  280 + width: 100%;
  281 + border-collapse: collapse;
  282 + margin-top: 15px;
  283 + }
  284 +
  285 + th, td {
  286 + padding: 12px;
  287 + text-align: left;
  288 + border-bottom: 1px solid var(--border-color);
  289 + }
  290 +
  291 + th {
  292 + background-color: var(--bg-color);
  293 + color: var(--heading-color);
  294 + }
  295 +
  296 + blockquote {
  297 + border-left: 4px solid var(--secondary-color);
  298 + padding-left: 15px;
  299 + margin: 15px 0;
  300 + font-style: italic;
  301 + color: var(--neutral-color);
  302 + }
  303 +
  304 + @media (max-width: 1200px) {
  305 + .container { flex-direction: column; }
  306 + .sidebar { position: static; width: 100%; height: auto; border-right: none; border-bottom: 1px solid var(--border-color); }
  307 + .main-content { padding: 20px; }
  308 + }
  309 +
  310 + @media (max-width: 768px) {
  311 + .grid-2 { grid-template-columns: 1fr; }
  312 + header h1 { font-size: 2em; }
  313 + h2.section-title { font-size: 1.5em; }
  314 + }
  315 +
  316 + @media print {
  317 + .sidebar, .toolbar, header .report-meta, details summary::marker {
  318 + display: none;
  319 + }
  320 + body, .main-content, .card {
  321 + background: #fff !important;
  322 + color: #000 !important;
  323 + box-shadow: none;
  324 + border: none;
  325 + padding: 0;
  326 + margin: 0;
  327 + }
  328 + .container { display: block; }
  329 + .card { margin-bottom: 20px; page-break-inside: avoid; }
  330 + a { text-decoration: none; color: inherit; }
  331 + }
  332 +
  333 + </style>
  334 +</head>
  335 +<body>
  336 + <div class="container">
  337 + <aside class="sidebar">
  338 + <h2>报告导航</h2>
  339 + <nav>
  340 + <ul>
  341 + <li><a href="#overview">1.0 舆情概览</a></li>
  342 + <li><a href="#trends">2.0 关键数据趋势</a></li>
  343 + <li><a href="#timeline">3.0 舆情动态时间轴</a></li>
  344 + <li><a href="#hot-topics">4.0 热点话题追踪</a></li>
  345 + <li><a href="#channels">5.0 重点渠道表现</a></li>
  346 + <li><a href="#risks">6.0 负面与风险监测</a></li>
  347 + <li><a href="#summary">7.0 简报与关注点</a></li>
  348 + <li><a href="#appendix">8.0 数据附录</a></li>
  349 + </ul>
  350 + </nav>
  351 + </aside>
  352 +
  353 + <main class="main-content">
  354 + <header>
  355 + <h1>智能舆情分析报告:武汉大学</h1>
  356 + <div class="report-meta">报告周期:近期综合数据 | 生成时间:2025-08-26</div>
  357 + </header>
  358 +
  359 + <section id="overview" class="card">
  360 + <h2 class="section-title">1.0 本周/月舆情概览</h2>
  361 + <details open>
  362 + <summary>1.1 核心数据看板</summary>
  363 + <div class="dashboard" style="margin-top: 20px;">
  364 + <div class="stat-item"><div class="value">≈2.1M</div><div class="label">相关信息量</div></div>
  365 + <div class="stat-item"><div class="value">≈3.8亿</div><div class="label">总阅读量</div></div>
  366 + <div class="stat-item"><div class="value">≈4.2M</div><div class="label">总互动量</div></div>
  367 + <div class="stat-item" style="border-color: var(--danger-color);"><div class="value">42.5%</div><div class="label">负面/焦虑情绪占比</div></div>
  368 + </div>
  369 + </details>
  370 + <details open>
  371 + <summary>1.2 本期舆情热度 TOP 3</summary>
  372 + <ol style="margin-top:15px; padding-left:20px;">
  373 + <li><b>学术诚信危机:</b>杨景媛学术不端及图书馆诬告案引发全网对学校学术审查和危机处理能力的质疑。</li>
  374 + <li><b>校园文化与公共形象:</b>樱花季预约难、游客冲突等周期性话题,反映了“最美大学”光环下的管理压力。</li>
  375 + <li><b>学术声望与现实焦虑:</b>“世界第一”学科与毕业生就业薪资的巨大反差,引发在校生和校友的普遍焦虑。</li>
  376 + </ol>
  377 + </details>
  378 + <details>
  379 + <summary>1.3 重点预警</summary>
  380 + <p style="margin-top:15px;"><span class="tag negative">高风险</span>学术不端事件调查仍在进行中,校方最终处理结果将直接影响舆论走向,可能引发第二波舆情高峰。需警惕“反应迟缓”、“包庇”等负面标签被固化。</p>
  381 + </details>
  382 + </section>
  383 +
  384 + <section id="trends" class="card">
  385 + <h2 class="section-title">2.0 关键数据趋势</h2>
  386 + <div class="grid-2">
  387 + <div>
  388 + <h3>2.1 声量走势</h3>
  389 + <div class="chart-container"><canvas id="volumeTrendChart"></canvas></div>
  390 + </div>
  391 + <div>
  392 + <h3>2.2 情感趋势</h3>
  393 + <div class="chart-container"><canvas id="sentimentTrendChart"></canvas></div>
  394 + </div>
  395 + <div>
  396 + <h3>整体情感分布</h3>
  397 + <div class="chart-container" style="height:300px"><canvas id="sentimentPieChart"></canvas></div>
  398 + </div>
  399 + </div>
  400 + </section>
  401 +
  402 + <section id="timeline" class="card">
  403 + <h2 class="section-title">3.0 本周期舆情动态时间轴</h2>
  404 + <div class="timeline">
  405 + <div class="timeline-item">
  406 + <div class="time">2025年7月</div>
  407 + <p>武汉大学硕士毕业生杨景媛被曝硕士论文严重造假,同时其诬告肖姓学弟性骚扰案败诉的背景被挖出,事件开始在社交媒体发酵。</p>
  408 + </div>
  409 + <div class="timeline-item">
  410 + <div class="time">2025年7月31日</div>
  411 + <p>香港浸会大学就杨景媛录取争议发表声明,表示将启动独立审查程序,舆论关注度升级。</p>
  412 + </div>
  413 + <div class="timeline-item">
  414 + <div class="time">2025年8月1日</div>
  415 + <p>在央媒关注后,武汉大学官方宣布成立工作专班,对杨景媛学术不端问题进行全面调查复核,但因反应速度慢于公众预期而受到批评。</p>
  416 + </div>
  417 + <div class="timeline-item">
  418 + <div class="time">2025年8月6日</div>
  419 + <p>网络流传“香港浸会大学撤销杨景媛录取资格”的消息,后被证实为谣言,校方表示仍在按程序处理,引发公众对处理效率的进一步质疑。</p>
  420 + </div>
  421 + <div class="timeline-item">
  422 + <div class="time">近期其他热点</div>
  423 + <p>春季樱花节期间,#武大樱花预约# 话题登上热搜,引发关于校园开放与管理的讨论。同时,关于顶尖学科毕业生就业薪资的讨论在知乎、B站等平台持续发酵。</p>
  424 + </div>
  425 + </div>
  426 + </section>
  427 +
  428 + <section id="hot-topics" class="card">
  429 + <h2 class="section-title">4.0 热点话题追踪</h2>
  430 + <details open>
  431 + <summary>4.1 热点事件详情</summary>
  432 + <article class="topic-card danger" style="margin-top: 20px;">
  433 + <h4>议题一:学术诚信危机与信任重创 (杨景媛事件)</h4>
  434 + <p><b>核心问题:</b>杨景媛学术不端事件与图书馆诬告案交织,暴露了学校在研究生培养、论文审核、学生管理及危机公关等方面的系统性漏洞。</p>
  435 + <p><b>舆论焦点:</b></p>
  436 + <ul>
  437 + <li><b>学术审查失效:</b>公众普遍质疑导师指导责任、答辩委员会的审查职能以及学位授予的严肃性。</li>
  438 + <li><b>危机应对迟缓:</b>校方在事件发酵初期反应滞后,“等上级安排”等言论被视为官僚主义,错失了引导舆论、修复信任的最佳窗口。</li>
  439 + <li><b>程序正义缺失:</b>对被诬告学生肖同学的处理与对杨景媛的“保研”形成鲜明对比,引发对高校公平正义的强烈质疑。</li>
  440 + </ul>
  441 + <blockquote>“百年名校的声誉,可能因为一次不作为而蒙上难以擦拭的污点。” - 微博高赞评论</blockquote>
  442 + </article>
  443 + <article class="topic-card warning" style="margin-top: 20px;">
  444 + <h4>议题二:学术光环与现实焦虑的拉锯</h4>
  445 + <p><b>核心现象:</b>以“测绘遥感世界第一”为代表的顶尖学科声望与相关专业毕业生面临的就业市场现实(如薪资、工作压力)形成巨大反差,引发学生群体的普遍焦虑和讨论。</p>
  446 + <p><b>情感洞察:</b>这种情绪并非否定学校的学术成就,而是一种更复杂的“爱之深、忧之切”。学生们既为母校的荣誉感到自豪,也为自己未来的职业发展感到迷茫。这种“骄傲与焦虑并存”是当前高学历人才市场竞争激烈下的普遍心态在武大的集中体现。</p>
  447 + <table>
  448 + <thead><tr><th>学科</th><th>高光叙事</th><th>焦虑痛点</th><th>情感走势</th></tr></thead>
  449 + <tbody>
  450 + <tr><td>测绘遥感</td><td>知乎“世界第一”高赞</td><td>“毕业买不起武汉一平米”</td><td>自豪感被现实焦虑稀释</td></tr>
  451 + <tr><td>法学</td><td>省考“双第一”报喜</td><td>红圈所实习薪资低,压力大</td><td>精英光环下的生存挣扎</td></tr>
  452 + <tr><td>口腔医学</td><td>B站科普视频百万播放</td><td>规培薪资低,工作强度大</td><td>信赖感与个人辛酸并存</td></tr>
  453 + </tbody>
  454 + </table>
  455 + </article>
  456 + <article class="topic-card success" style="margin-top: 20px;">
  457 + <h4>议题三:百年校史与校园文化的“开放剧本”</h4>
  458 + <p><b>核心观察:</b>武汉大学的深厚历史与优美环境是舆论场中的“正面资产”,持续产生积极情感价值。从樱花季的浪漫想象,到对民国老建筑的怀旧,再到对校史的趣味解读(如“学大汉武立国”梗),都构成了强大的品牌护城河。</p>
  459 + <p><b>双面性:</b>然而,这种高关注度也带来了管理挑战。樱花季的“抢票难”和游客冲突,以及对校园过度商业化的担忧,表明公众对这片“精神家园”有着极高的期待和保护欲。</p>
  460 + <blockquote>“历史是武大人共同的‘开放剧本’,人人可改台词,却从未离场。” - 洞察引擎分析</blockquote>
  461 + </article>
  462 + </details>
  463 +
  464 +</body>
  465 +</html>
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告 - 武汉大学</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-date-fns/dist/chartjs-adapter-date-fns.bundle.min.js"></script>
  19 + <style>
  20 + :root {
  21 + --primary-color: #2c3e50;
  22 + --secondary-color: #3498db;
  23 + --accent-color: #e74c3c;
  24 + --bg-color: #ecf0f1;
  25 + --text-color: #34495e;
  26 + --card-bg-color: #ffffff;
  27 + --border-color: #dce4e8;
  28 + --shadow-color: rgba(0, 0, 0, 0.08);
  29 + --positive-color: #2ecc71;
  30 + --negative-color: #e74c3c;
  31 + --neutral-color: #f1c40f;
  32 + }
  33 +
  34 + body.dark-mode {
  35 + --primary-color: #ecf0f1;
  36 + --secondary-color: #3498db;
  37 + --accent-color: #e74c3c;
  38 + --bg-color: #2c3e50;
  39 + --text-color: #bdc3c7;
  40 + --card-bg-color: #34495e;
  41 + --border-color: #4a627a;
  42 + --shadow-color: rgba(0, 0, 0, 0.2);
  43 + }
  44 +
  45 + @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&display=swap');
  46 +
  47 + body {
  48 + font-family: 'Noto Sans SC', sans-serif;
  49 + margin: 0;
  50 + background-color: var(--bg-color);
  51 + color: var(--text-color);
  52 + line-height: 1.6;
  53 + transition: background-color 0.3s, color 0.3s;
  54 + }
  55 +
  56 + .container {
  57 + display: flex;
  58 + max-width: 1600px;
  59 + margin: 0 auto;
  60 + }
  61 +
  62 + header {
  63 + background-color: var(--card-bg-color);
  64 + padding: 20px 40px;
  65 + border-bottom: 1px solid var(--border-color);
  66 + display: flex;
  67 + justify-content: space-between;
  68 + align-items: center;
  69 + box-shadow: 0 2px 5px var(--shadow-color);
  70 + }
  71 +
  72 + header h1 {
  73 + color: var(--primary-color);
  74 + margin: 0;
  75 + font-size: 24px;
  76 + }
  77 + header .subtitle {
  78 + font-size: 16px;
  79 + color: var(--text-color);
  80 + opacity: 0.8;
  81 + }
  82 +
  83 + .controls button {
  84 + background-color: var(--secondary-color);
  85 + color: white;
  86 + border: none;
  87 + padding: 8px 16px;
  88 + border-radius: 5px;
  89 + cursor: pointer;
  90 + margin-left: 10px;
  91 + transition: background-color 0.3s;
  92 + }
  93 + .controls button:hover {
  94 + background-color: #2980b9;
  95 + }
  96 +
  97 + .sidebar {
  98 + width: 240px;
  99 + background-color: var(--card-bg-color);
  100 + padding: 20px;
  101 + height: calc(100vh - 85px);
  102 + position: sticky;
  103 + top: 0;
  104 + border-right: 1px solid var(--border-color);
  105 + overflow-y: auto;
  106 + }
  107 +
  108 + .sidebar h2 {
  109 + font-size: 18px;
  110 + color: var(--primary-color);
  111 + border-bottom: 2px solid var(--secondary-color);
  112 + padding-bottom: 10px;
  113 + }
  114 +
  115 + .sidebar ul {
  116 + list-style: none;
  117 + padding: 0;
  118 + margin: 0;
  119 + }
  120 +
  121 + .sidebar li a {
  122 + display: block;
  123 + color: var(--text-color);
  124 + text-decoration: none;
  125 + padding: 10px 15px;
  126 + border-radius: 5px;
  127 + transition: background-color 0.2s, color 0.2s;
  128 + font-weight: 500;
  129 + }
  130 +
  131 + .sidebar li a:hover, .sidebar li a.active {
  132 + background-color: var(--secondary-color);
  133 + color: white;
  134 + }
  135 +
  136 + .main-content {
  137 + flex: 1;
  138 + padding: 20px 40px;
  139 + }
  140 +
  141 + section {
  142 + margin-bottom: 40px;
  143 + }
  144 +
  145 + section > h2 {
  146 + font-size: 28px;
  147 + color: var(--primary-color);
  148 + border-bottom: 3px solid var(--border-color);
  149 + padding-bottom: 15px;
  150 + margin-bottom: 25px;
  151 + }
  152 +
  153 + .card {
  154 + background-color: var(--card-bg-color);
  155 + border-radius: 8px;
  156 + padding: 25px;
  157 + margin-bottom: 20px;
  158 + box-shadow: 0 4px 12px var(--shadow-color);
  159 + transition: background-color 0.3s;
  160 + }
  161 +
  162 + .grid-container {
  163 + display: grid;
  164 + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  165 + gap: 20px;
  166 + }
  167 +
  168 + .stat-card {
  169 + text-align: center;
  170 + }
  171 + .stat-card .value {
  172 + font-size: 36px;
  173 + font-weight: 700;
  174 + color: var(--secondary-color);
  175 + }
  176 + .stat-card .label {
  177 + font-size: 14px;
  178 + color: var(--text-color);
  179 + opacity: 0.8;
  180 + }
  181 +
  182 + .top-topic-card {
  183 + border-left: 5px solid var(--secondary-color);
  184 + padding-left: 20px;
  185 + }
  186 + .top-topic-card.negative {
  187 + border-left-color: var(--accent-color);
  188 + }
  189 + .top-topic-card h4 {
  190 + margin-top: 0;
  191 + color: var(--primary-color);
  192 + }
  193 +
  194 + .collapsible > header {
  195 + cursor: pointer;
  196 + padding: 15px;
  197 + background-color: var(--bg-color);
  198 + border-radius: 5px;
  199 + display: flex;
  200 + justify-content: space-between;
  201 + align-items: center;
  202 + }
  203 + .collapsible > header:hover {
  204 + background-color: var(--border-color);
  205 + }
  206 + .collapsible > header::after {
  207 + content: '▼';
  208 + transition: transform 0.3s;
  209 + }
  210 + .collapsible.open > header::after {
  211 + transform: rotate(-180deg);
  212 + }
  213 + .collapsible > .content {
  214 + max-height: 0;
  215 + overflow: hidden;
  216 + transition: max-height 0.5s ease-in-out, padding 0.5s ease-in-out;
  217 + padding: 0 20px;
  218 + }
  219 + .collapsible.open > .content {
  220 + padding: 20px;
  221 + max-height: 2000px; /* Adjust as needed */
  222 + }
  223 +
  224 + .timeline {
  225 + position: relative;
  226 + padding-left: 40px;
  227 + border-left: 2px solid var(--secondary-color);
  228 + }
  229 + .timeline-item {
  230 + position: relative;
  231 + margin-bottom: 30px;
  232 + }
  233 + .timeline-item::before {
  234 + content: '';
  235 + position: absolute;
  236 + left: -48px;
  237 + top: 5px;
  238 + width: 14px;
  239 + height: 14px;
  240 + border-radius: 50%;
  241 + background-color: white;
  242 + border: 3px solid var(--secondary-color);
  243 + }
  244 + .timeline-item .time {
  245 + font-weight: bold;
  246 + color: var(--secondary-color);
  247 + }
  248 +
  249 + table {
  250 + width: 100%;
  251 + border-collapse: collapse;
  252 + }
  253 + th, td {
  254 + text-align: left;
  255 + padding: 12px 15px;
  256 + border-bottom: 1px solid var(--border-color);
  257 + }
  258 + th {
  259 + background-color: var(--bg-color);
  260 + font-weight: 700;
  261 + color: var(--primary-color);
  262 + }
  263 +
  264 + .insight-table strong { color: var(--accent-color); }
  265 +
  266 + footer {
  267 + text-align: center;
  268 + padding: 20px;
  269 + font-size: 14px;
  270 + color: var(--text-color);
  271 + opacity: 0.7;
  272 + border-top: 1px solid var(--border-color);
  273 + margin-top: 40px;
  274 + }
  275 +
  276 + @media (max-width: 1024px) {
  277 + .container { flex-direction: column; }
  278 + .sidebar { width: 100%; height: auto; position: static; border-right: none; border-bottom: 1px solid var(--border-color); }
  279 + .main-content { padding: 20px; }
  280 + }
  281 +
  282 + @media (max-width: 768px) {
  283 + header { flex-direction: column; align-items: flex-start; gap: 10px; }
  284 + .controls { width: 100%; text-align: right; }
  285 + }
  286 +
  287 + @media print {
  288 + body { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  289 + header, .sidebar, .controls { display: none; }
  290 + .main-content { padding: 0; }
  291 + .card { box-shadow: none; border: 1px solid #ccc; }
  292 + section { page-break-inside: avoid; }
  293 + .collapsible > .content { max-height: none !important; padding: 20px !important; }
  294 + .collapsible.open > header::after { display: none; }
  295 + }
  296 +
  297 + </style>
  298 +</head>
  299 +<body>
  300 + <header>
  301 + <div>
  302 + <h1>智能舆情分析报告</h1>
  303 + <p class="subtitle">分析对象:武汉大学</p>
  304 + </div>
  305 + <div class="controls">
  306 + <button id="theme-toggle">切换暗色模式</button>
  307 + <button onclick="window.print()">打印 / 导出PDF</button>
  308 + </div>
  309 + </header>
  310 +
  311 + <div class="container">
  312 + <nav class="sidebar">
  313 + <h2>报告目录</h2>
  314 + <ul>
  315 + <li><a href="#overview">1.0 舆情概览</a></li>
  316 + <li><a href="#trends">2.0 关键数据趋势</a></li>
  317 + <li><a href="#timeline">3.0 舆情动态时间轴</a></li>
  318 + <li><a href="#hot-topics">4.0 热点话题追踪</a></li>
  319 + <li><a href="#channels">5.0 重点渠道表现</a></li>
  320 + <li><a href="#risks">6.0 负面与风险监测</a></li>
  321 + <li><a href="#summary">7.0 简报与关注点</a></li>
  322 + <li><a href="#appendix">8.0 数据附录</a></li>
  323 + </ul>
  324 + </nav>
  325 +
  326 + <main class="main-content">
  327 + <section id="overview">
  328 + <h2>1.0 本期舆情概览</h2>
  329 + <div class="card">
  330 + <h3>1.1 核心数据看板</h3>
  331 + <div class="grid-container">
  332 + <div class="stat-card">
  333 + <div class="value">210万+</div>
  334 + <div class="label">总声量</div>
  335 + </div>
  336 + <div class="stat-card">
  337 + <div class="value">3.8亿+</div>
  338 + <div class="label">总阅读量</div>
  339 + </div>
  340 + <div class="stat-card">
  341 + <div class="value">420万+</div>
  342 + <div class="label">总互动量</div>
  343 + </div>
  344 + <div class="stat-card">
  345 + <div class="value">48.2%</div>
  346 + <div class="label">负面情感占比</div>
  347 + </div>
  348 + </div>
  349 + </div>
  350 + <div class="card">
  351 + <h3>1.2 本期舆情热度 TOP 3</h3>
  352 + <div class="grid-container">
  353 + <div class="top-topic-card negative">
  354 + <h4>1. 杨景媛学术不端及图书馆诬告案</h4>
  355 + <p>本期最核心负面事件。硕士论文学术造假与此前诬告案败诉联动,引爆全网对高校学术诚信、审核机制及危机公关的拷问,对武大声誉造成严重冲击。</p>
  356 + </div>
  357 + <div class="top-topic-card">
  358 + <h4>2. 校园文化与社会热议</h4>
  359 + <p>以“樱花季”为代表的校园文化持续引发关注,但“抢票难”、“商业化”等争议并存。校史讨论呈现“玩梗”与严肃考据并存的年轻化特征。</p>
  360 + </div>
  361 + <div class="top-topic-card negative">
  362 + <h4>3. 学科优势与职业焦虑</h4>
  363 + <p>“测绘遥感世界第一”等学术光环带来巨大自豪感,但相关专业毕业生对薪资、就业压力的“吐槽”形成强烈反差,反映了理想与现实的碰撞。</p>
  364 + </div>
  365 + </div>
  366 + </div>
  367 + <div class="card">
  368 + <h3>1.3 重点预警</h3>
  369 + <p><strong>学术诚信危机持续发酵:</strong>杨景媛事件已由个人学术不端问题,演变为对武汉大学研究生培养、论文审查、导师责任及后续处理公正性的系统性质疑。校方初期反应迟缓,进一步加剧了公众的不信任感。事件后续处理结果将直接影响学校公信力,风险等级极高。</p>
  370 + </div>
  371 + </section>
  372 +
  373 + <section id="trends">
  374 + <h2>2.0 关键数据趋势</h2>
  375 + <div class="grid-container">
  376 + <div class="card">
  377 + <h3>2.1 声量走势</h3>
  378 + <canvas id="volume-chart"></canvas>
  379 + </div>
  380 + <div class="card">
  381 + <h3>2.2 情感趋势</h3>
  382 + <canvas id="sentiment-chart"></canvas>
  383 + </div>
  384 + </div>
  385 + </section>
  386 +
  387 + <section id="timeline">
  388 + <h2>3.0 本周期舆情动态时间轴</h2>
  389 + <div class="card">
  390 + <div class="timeline">
  391 + <div class="timeline-item">
  392 + <div class="time">2025年7月中下旬</div>
  393 + <p>杨景媛因长期诬告肖姓学弟性骚扰败诉后,其硕士学位论文被曝光存在严重学术造假问题,舆论开始发酵。</p>
  394 + </div>
  395 + <div class="timeline-item">
  396 + <div class="time">2025年7月31日</div>
  397 + <p>香港浸会大学就杨景媛录取资格发出道德核查函,启动独立审查程序,事件关注度升级。</p>
  398 + </div>
  399 + <div class="timeline-item">
  400 + <div class="time">2025年8月1日</div>
  401 + <p>央媒关注报道后,武汉大学宣布成立工作专班,对杨景媛学术不端问题进行全面调查复核,声量达到顶峰。</p>
  402 + </div>
  403 + <div class="timeline-item">
  404 + <div class="time">2025年8月6日</div>
  405 + <p>网络流传“港浸大撤销杨景媛录取资格”消息,后被证实为谣言,官方表示仍在按程序处理,引发对处理效率的进一步讨论。</p>
  406 + </div>
  407 + </div>
  408 + </div>
  409 + </section>
  410 +
  411 + <section id="hot-topics">
  412 + <h2>4.0 热点话题追踪</h2>
  413 + <div class="card collapsible">
  414 + <header><h4>4.1 热点事件:杨景媛学术不端与图书馆诬告案</h4></header>
  415 + <div class="content">
  416 + <p><strong>事件概述:</strong>本事件由两部分交织而成:一是肖同学在图书馆被杨景媛诬告性骚扰,虽法律上证明清白,但已遭受学校处分和巨大身心创伤;二是杨景媛的硕士学位论文被揭发存在虚构法律、伪造数据、严重抄袭等多项学术不端行为。</p>
  417 + <p><strong>舆论焦点:</strong></p>
  418 + <ul>
  419 + <li><strong>学术诚信崩溃:</strong>公众对论文中“1049年”等低级错误感到震惊,质疑武汉大学的论文审核、答辩流程形同虚设。</li>
  420 + <li><strong>程序正义缺失:</strong>学校在诬告案中“先处理为敬”的做法,与查处学术不端时的“迟缓”形成鲜明对比,引发对高校管理公平性的强烈质疑。</li>
  421 + <li><strong>校方应对失当:</strong>从初期沉默到央媒介入后才成立专班,校方被批评为“反应滞后”、“缺乏担当”,损害了公信力。</li>
  422 + <li><strong>多方联动影响:</strong>事件牵涉武汉大学、香港浸会大学两所高校,处理结果备受关注,成为检验高校对学术不端“零容忍”态度的试金石。</li>
  423 + </ul>
  424 + </div>
  425 + </div>
  426 + <div class="card collapsible">
  427 + <header><h4>4.2 新增话题:学科荣光与现实焦虑的碰撞</h4></header>
  428 + <div class="content">
  429 + <p>本周期内,除危机事件外,“武大到底有多强”与“武大毕业生挣多少钱”的讨论也形成热点,呈现出一种“骄傲与焦虑并存”的复杂
  430 +</body>
  431 +</html>
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
  19 + <style>
  20 + :root {
  21 + --bg-color: #f8f9fa;
  22 + --text-color: #212529;
  23 + --card-bg: #ffffff;
  24 + --border-color: #dee2e6;
  25 + --primary-color: #0056b3;
  26 + --secondary-color: #6c757d;
  27 + --accent-color: #28a745;
  28 + --danger-color: #dc3545;
  29 + --warning-color: #ffc107;
  30 + --info-color: #17a2b8;
  31 + --sidebar-bg: #343a40;
  32 + --sidebar-text: #f8f9fa;
  33 + --sidebar-hover: #495057;
  34 + --shadow: 0 4px 8px rgba(0, 0, 0, 0.05);
  35 + }
  36 +
  37 + body.dark-mode {
  38 + --bg-color: #121212;
  39 + --text-color: #e0e0e0;
  40 + --card-bg: #1e1e1e;
  41 + --border-color: #444;
  42 + --primary-color: #4a90e2;
  43 + --secondary-color: #9e9e9e;
  44 + --sidebar-bg: #1e1e1e;
  45 + --sidebar-text: #e0e0e0;
  46 + --sidebar-hover: #333;
  47 + --shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
  48 + }
  49 +
  50 + * {
  51 + box-sizing: border-box;
  52 + margin: 0;
  53 + padding: 0;
  54 + }
  55 +
  56 + body {
  57 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  58 + background-color: var(--bg-color);
  59 + color: var(--text-color);
  60 + line-height: 1.6;
  61 + display: flex;
  62 + transition: background-color 0.3s, color 0.3s;
  63 + }
  64 +
  65 + #sidebar {
  66 + width: 260px;
  67 + background-color: var(--sidebar-bg);
  68 + color: var(--sidebar-text);
  69 + height: 100vh;
  70 + position: fixed;
  71 + top: 0;
  72 + left: 0;
  73 + padding: 20px;
  74 + display: flex;
  75 + flex-direction: column;
  76 + transition: background-color 0.3s;
  77 + }
  78 +
  79 + #sidebar h1 {
  80 + font-size: 1.5rem;
  81 + margin-bottom: 10px;
  82 + color: var(--primary-color);
  83 + border-bottom: 2px solid var(--primary-color);
  84 + padding-bottom: 10px;
  85 + }
  86 +
  87 + #sidebar nav ul {
  88 + list-style: none;
  89 + }
  90 +
  91 + #sidebar nav li a {
  92 + display: block;
  93 + color: var(--sidebar-text);
  94 + text-decoration: none;
  95 + padding: 10px 15px;
  96 + border-radius: 5px;
  97 + margin-bottom: 5px;
  98 + transition: background-color 0.2s;
  99 + font-size: 0.95rem;
  100 + }
  101 +
  102 + #sidebar nav li a:hover, #sidebar nav li a.active {
  103 + background-color: var(--sidebar-hover);
  104 + }
  105 +
  106 + .sidebar-footer {
  107 + margin-top: auto;
  108 + }
  109 +
  110 + .theme-switcher, .report-actions button {
  111 + width: 100%;
  112 + padding: 10px;
  113 + border: none;
  114 + border-radius: 5px;
  115 + cursor: pointer;
  116 + background-color: var(--sidebar-hover);
  117 + color: var(--sidebar-text);
  118 + text-align: left;
  119 + margin-top: 10px;
  120 + }
  121 +
  122 + .theme-switcher:hover, .report-actions button:hover {
  123 + background-color: var(--primary-color);
  124 + }
  125 +
  126 + #main-content {
  127 + margin-left: 260px;
  128 + padding: 40px;
  129 + width: calc(100% - 260px);
  130 + }
  131 +
  132 + header {
  133 + border-bottom: 1px solid var(--border-color);
  134 + padding-bottom: 20px;
  135 + margin-bottom: 30px;
  136 + }
  137 +
  138 + header h1 {
  139 + font-size: 2.5rem;
  140 + color: var(--primary-color);
  141 + }
  142 +
  143 + header p {
  144 + font-size: 1.1rem;
  145 + color: var(--secondary-color);
  146 + max-width: 800px;
  147 + }
  148 +
  149 + .report-section {
  150 + background-color: var(--card-bg);
  151 + border: 1px solid var(--border-color);
  152 + border-radius: 8px;
  153 + padding: 25px;
  154 + margin-bottom: 30px;
  155 + box-shadow: var(--shadow);
  156 + transition: background-color 0.3s, border-color 0.3s;
  157 + }
  158 +
  159 + .report-section h2 {
  160 + font-size: 1.8rem;
  161 + color: var(--primary-color);
  162 + margin-bottom: 20px;
  163 + padding-bottom: 10px;
  164 + border-bottom: 2px solid var(--primary-color);
  165 + }
  166 +
  167 + details {
  168 + border: 1px solid var(--border-color);
  169 + border-radius: 5px;
  170 + margin-bottom: 15px;
  171 + overflow: hidden;
  172 + }
  173 +
  174 + summary {
  175 + padding: 15px;
  176 + background-color: var(--bg-color);
  177 + cursor: pointer;
  178 + font-weight: bold;
  179 + font-size: 1.1rem;
  180 + list-style: none;
  181 + position: relative;
  182 + }
  183 + summary::-webkit-details-marker { display: none; }
  184 + summary::before {
  185 + content: '▶';
  186 + position: absolute;
  187 + left: 15px;
  188 + top: 50%;
  189 + transform: translateY(-50%) rotate(0deg);
  190 + transition: transform 0.2s;
  191 + }
  192 + details[open] > summary::before {
  193 + transform: translateY(-50%) rotate(90deg);
  194 + }
  195 + details summary {
  196 + padding-left: 40px;
  197 + }
  198 +
  199 + .details-content {
  200 + padding: 20px;
  201 + }
  202 +
  203 + .dashboard {
  204 + display: grid;
  205 + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  206 + gap: 20px;
  207 + }
  208 +
  209 + .dashboard-card {
  210 + background-color: var(--bg-color);
  211 + padding: 20px;
  212 + border-radius: 8px;
  213 + text-align: center;
  214 + border: 1px solid var(--border-color);
  215 + }
  216 +
  217 + .dashboard-card h3 {
  218 + font-size: 1rem;
  219 + color: var(--secondary-color);
  220 + margin-bottom: 10px;
  221 + }
  222 +
  223 + .dashboard-card .value {
  224 + font-size: 2.2rem;
  225 + font-weight: bold;
  226 + color: var(--primary-color);
  227 + }
  228 +
  229 + .dashboard-card .sub-value {
  230 + font-size: 0.9rem;
  231 + color: var(--secondary-color);
  232 + }
  233 +
  234 + .chart-container {
  235 + position: relative;
  236 + height: 400px;
  237 + width: 100%;
  238 + margin-top: 20px;
  239 + }
  240 +
  241 + .timeline {
  242 + position: relative;
  243 + padding-left: 40px;
  244 + border-left: 3px solid var(--primary-color);
  245 + }
  246 +
  247 + .timeline-item {
  248 + position: relative;
  249 + margin-bottom: 30px;
  250 + }
  251 +
  252 + .timeline-item::before {
  253 + content: '';
  254 + position: absolute;
  255 + left: -48px;
  256 + top: 5px;
  257 + width: 14px;
  258 + height: 14px;
  259 + border-radius: 50%;
  260 + background-color: var(--primary-color);
  261 + border: 3px solid var(--bg-color);
  262 + }
  263 +
  264 + .timeline-item .time {
  265 + font-weight: bold;
  266 + color: var(--secondary-color);
  267 + margin-bottom: 5px;
  268 + }
  269 +
  270 + .timeline-item .content {
  271 + font-size: 1rem;
  272 + }
  273 +
  274 + .tag {
  275 + display: inline-block;
  276 + padding: 3px 8px;
  277 + border-radius: 4px;
  278 + font-size: 0.8rem;
  279 + font-weight: bold;
  280 + margin-right: 5px;
  281 + }
  282 +
  283 + .tag-danger { background-color: var(--danger-color); color: white; }
  284 + .tag-warning { background-color: var(--warning-color); color: var(--text-color); }
  285 + .tag-info { background-color: var(--info-color); color: white; }
  286 + .tag-success { background-color: var(--accent-color); color: white; }
  287 +
  288 + table {
  289 + width: 100%;
  290 + border-collapse: collapse;
  291 + margin-top: 15px;
  292 + }
  293 +
  294 + th, td {
  295 + text-align: left;
  296 + padding: 12px;
  297 + border-bottom: 1px solid var(--border-color);
  298 + }
  299 +
  300 + th {
  301 + background-color: var(--bg-color);
  302 + }
  303 +
  304 + @media (max-width: 992px) {
  305 + #sidebar {
  306 + left: -260px;
  307 + z-index: 1000;
  308 + }
  309 + #main-content {
  310 + margin-left: 0;
  311 + width: 100%;
  312 + padding: 20px;
  313 + }
  314 + /* Add a toggle button for mobile */
  315 + .sidebar-toggle {
  316 + display: block;
  317 + position: fixed;
  318 + top: 15px;
  319 + left: 15px;
  320 + z-index: 1001;
  321 + background: var(--sidebar-bg);
  322 + color: white;
  323 + border: none;
  324 + padding: 10px 15px;
  325 + border-radius: 5px;
  326 + cursor: pointer;
  327 + }
  328 + }
  329 +
  330 + @media (min-width: 993px) {
  331 + .sidebar-toggle { display: none; }
  332 + }
  333 +
  334 + @media print {
  335 + #sidebar, .sidebar-toggle, .report-actions, details > summary {
  336 + display: none;
  337 + }
  338 + #main-content {
  339 + margin-left: 0;
  340 + width: 100%;
  341 + padding: 0;
  342 + }
  343 + .report-section {
  344 + box-shadow: none;
  345 + border: 1px solid #ccc;
  346 + page-break-inside: avoid;
  347 + }
  348 + details {
  349 + border: none;
  350 + }
  351 + details[open] {
  352 + display: block;
  353 + }
  354 + .details-content {
  355 + padding: 0;
  356 + }
  357 + header h1 { font-size: 24pt; }
  358 + h2 { font-size: 18pt; }
  359 + }
  360 + </style>
  361 +</head>
  362 +<body>
  363 + <button class="sidebar-toggle" id="sidebar-toggle"></button>
  364 +
  365 + <aside id="sidebar">
  366 + <h1>舆情报告</h1>
  367 + <nav id="toc">
  368 + <ul>
  369 + <li><a href="#s1">1.0 舆情概览</a></li>
  370 + <li><a href="#s2">2.0 关键数据趋势</a></li>
  371 + <li><a href="#s3">3.0 舆情动态时间轴</a></li>
  372 + <li><a href="#s4">4.0 热点话题追踪</a></li>
  373 + <li><a href="#s5">5.0 重点渠道表现</a></li>
  374 + <li><a href="#s6">6.0 负面与风险监测</a></li>
  375 + <li><a href="#s7">7.0 简报与关注点</a></li>
  376 + <li><a href="#s8">8.0 数据附录</a></li>
  377 + </ul>
  378 + </nav>
  379 + <div class="sidebar-footer">
  380 + <div class="report-actions">
  381 + <button id="print-btn">打印报告</button>
  382 + <button id="pdf-btn">导出为PDF</button>
  383 + </div>
  384 + <button class="theme-switcher" id="theme-switcher">切换暗色模式</button>
  385 + </div>
  386 + </aside>
  387 +
  388 + <main id="main-content">
  389 + <header>
  390 + <h1>武汉大学智能舆情分析报告</h1>
  391 + <p>本报告整合了查询引擎、媒体引擎及洞察引擎的分析结果,结合论坛监控数据,对武汉大学近期的舆情态势进行了全面分析。报告聚焦于“杨景媛学术不端及图书馆诬告案”等核心热点事件,同时涵盖了学校历史声誉、学科实力与学生现实焦虑等多个维度。报告旨在揭示舆情动态,评估声誉影响,并为未来的舆情管理提供数据支持和策略建议。</p>
  392 + </header>
  393 +
  394 + <section id="s1" class="report-section">
  395 + <h2>1.0 本期舆情概览</h2>
  396 + <details open>
  397 + <summary>1.1 核心数据看板</summary>
  398 + <div class="details-content dashboard">
  399 + <div class="dashboard-card">
  400 + <h3>总声量</h3>
  401 + <div class="value">~2.1M</div>
  402 + <div class="sub-value">条有效文本</div>
  403 + </div>
  404 + <div class="dashboard-card">
  405 + <h3>总阅读量</h3>
  406 + <div class="value">~3.8亿</div>
  407 + <div class="sub-value"></div>
  408 + </div>
  409 + <div class="dashboard-card">
  410 + <h3>总互动量</h3>
  411 + <div class="value">~4.2M</div>
  412 + <div class="sub-value"></div>
  413 + </div>
  414 + <div class="dashboard-card">
  415 + <h3>热点平台</h3>
  416 + <div class="value">微博</div>
  417 + <div class="sub-value">知乎 / B站</div>
  418 + </div>
  419 + </div>
  420 + </details>
  421 + <details>
  422 + <summary>1.2 本期舆情热度 TOP 3</summary>
  423 + <div class="details-content">
  424 + <ol>
  425 + <li><b>学术不端与诬告案争议:</b>围绕杨景媛硕士论文学术造假及图书馆诬告案的讨论,引发对高校学术诚信、审核机制及危机应对的强烈质疑。</li>
  426 + <li><b>学科声誉与就业现实反差:</b>“世界第一”的遥感等顶尖学科与毕业生“月薪7k”的现实薪资形成鲜明对比,引发学生群体对职业前景的广泛焦虑与讨论。</li>
  427 + <li><b>校园文化与历史传承讨论:</b>从“樱花季”的浪漫与拥挤,到对校史起点的趣味争论,展现了武大作为“共享青春现场”的骄傲与烟火气。</li>
  428 + </ol>
  429 + </div>
  430 + </details>
  431 + <details>
  432 + <summary>1.3 重点预警</summary>
  433 + <div class="details-content">
  434 + <ul>
  435 + <li><span class="tag tag-danger">高风险</span> <b>学术不端事件处理悬而未决:</b>武汉大学及香港浸会大学对杨景媛事件的最终处理结果尚未公布,舆论持续关注。任何拖延或被认为“高高举起,轻轻放下”的处理方式都将进一步重创学校公信力。</li>
  436 + <li><span class="tag tag-warning">中风险</span> <b>学生就业焦虑情绪发酵:</b>关于顶尖专业毕业生薪资待遇不及预期的讨论正在蔓延,可能影响未来优秀生源的报考意愿及在校生的学习心态。</li>
  437 + </ul>
  438 + </div>
  439 + </details>
  440 + </section>
  441 +
  442 + <section id="s2" class="report-section">
  443 + <h2>2.0 关键数据趋势</h2>
  444 + <details open>
  445 + <summary>2.1 声量走势</summary>
  446 + <div class="details-content">
  447 + <div class="chart-container">
  448 + <canvas id="volume-trend-chart"></canvas>
  449 + </div>
  450 + <p><b>分析:</b>本周期内,舆情声量在7月底至8月初达到顶峰,主要由“杨景媛学术不端事件”经由主流媒体报道后引爆。此后声量有所回落,但仍维持在较高水平,表明公众对此事件的后续处理保持高度关注。</p>
  451 + </div>
  452 + </details>
  453 + <details open>
  454 + <summary>2.2 情感趋势</summary>
  455 + <div class="details-content">
  456 + <div class="chart-container" style="height: 350px;">
  457 + <canvas id="sentiment-chart"></canvas>
  458 + </div>
  459 + <p><b>分析:</b>整体情感分布复杂多元。<b>正面情绪 (41%)</b> 主要源于对学校百年历史、优美环境和学术成就的自豪与怀旧。<b>负面情绪 (35%)</b> 集中于对近期学术不端事件的批评、对校方应对迟缓的失望以及对毕业生就业压力的焦虑。<b>中性/混合情绪 (24%)</b> 则体现在对樱花季“又爱又恨”、对校史的趣味吐槽等场景。</p>
  460 + </div>
  461 + </details>
  462 + </section>
  463 +
  464 + <section id="s3" class="report-section">
  465 + <h2>3.0 本周期舆情动态时间轴</h2>
  466 + <div class="timeline">
  467 + <div class="timeline-item">
  468 + <div class="time">2025年7月</div>
  469 + <div class="content">
  470 + <span class="tag tag-danger">事件爆发</span>
  471 + 武汉大学硕士毕业生杨景媛因诬告肖姓学弟败诉后,其硕士学位论文被曝存在严重学术造假问题,引发网络初步关注。
  472 + </div>
  473 + </div>
  474 + <div class="timeline-item">
  475 + <div class="time">2025年7月31日</div>
  476 + <div class="content">
  477 + <span class="tag tag-warning">外部介入</span>
  478 + 香港浸会大学向武汉大学发出道德核查函,并启动对杨景媛的独立审查程序。
  479 + </div>
  480 + </div>
  481 + <div class="timeline-item">
  482 + <div class="time">2025年8月1日</div>
  483 + <div class="content">
  484 + <span class="tag tag-danger">舆论升级</span>
  485 + 央媒关注并报道该事件,武汉大学随后宣布成立工作专班进行全面调查复核,舆情热度达到顶峰。
  486 + </div>
  487 + </div>
  488 + <div class="timeline-item">
  489 + <div class="time">2025年8月6日</div>
  490 + <div class="content">
  491 + <span class="tag tag-info">信息澄清</span>
  492 + 网络流传“香港浸会大学已撤销杨景媛录取资格”的消息,后被证实为谣言,校方表示仍在按程序处理。
  493 + </div>
  494 + </div>
  495 + <div class="timeline-item">
  496 + <div class="time">本周期内</div>
  497 + <div class="content">
  498 + <span class="tag tag-success">正面舆情</span>
  499 + 关于武大历史、杰出校友(雷军、易中天等)、校园风光(樱花、老建筑)的讨论持续存在,构成了舆情中的正面基调。
  500 + </div>
  501 + </div>
  502 + </div>
  503 + </section>
  504 +
  505 + <section id="s4" class="report-section">
  506 +
  507 +</body>
  508 +</html>
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告 - 武汉大学</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-date-fns"></script>
  19 + <style>
  20 + @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&display=swap');
  21 +
  22 + :root {
  23 + --bg-color: #f4f7fa;
  24 + --bg-secondary-color: #ffffff;
  25 + --text-color: #333;
  26 + --text-secondary-color: #666;
  27 + --border-color: #e0e6ed;
  28 + --primary-color: #1a5c9c; /* 武大蓝 */
  29 + --accent-color: #d1a047;
  30 + --positive-color: #28a745;
  31 + --negative-color: #dc3545;
  32 + --neutral-color: #ffc107;
  33 + --shadow-color: rgba(0, 0, 0, 0.05);
  34 + }
  35 +
  36 + body.dark-mode {
  37 + --bg-color: #121212;
  38 + --bg-secondary-color: #1e1e1e;
  39 + --text-color: #e0e0e0;
  40 + --text-secondary-color: #a0a0a0;
  41 + --border-color: #333;
  42 + --shadow-color: rgba(0, 0, 0, 0.2);
  43 + }
  44 +
  45 + * {
  46 + box-sizing: border-box;
  47 + margin: 0;
  48 + padding: 0;
  49 + }
  50 +
  51 + body {
  52 + font-family: 'Noto Sans SC', sans-serif;
  53 + background-color: var(--bg-color);
  54 + color: var(--text-color);
  55 + line-height: 1.6;
  56 + transition: background-color 0.3s, color 0.3s;
  57 + }
  58 +
  59 + .container {
  60 + display: flex;
  61 + max-width: 1600px;
  62 + margin: 0 auto;
  63 + }
  64 +
  65 + .sidebar {
  66 + width: 260px;
  67 + background-color: var(--bg-secondary-color);
  68 + border-right: 1px solid var(--border-color);
  69 + position: sticky;
  70 + top: 0;
  71 + height: 100vh;
  72 + overflow-y: auto;
  73 + padding: 20px;
  74 + transition: background-color 0.3s, border-color 0.3s;
  75 + }
  76 +
  77 + .sidebar-header {
  78 + text-align: center;
  79 + margin-bottom: 30px;
  80 + }
  81 + .sidebar-header h2 {
  82 + font-size: 1.5rem;
  83 + color: var(--primary-color);
  84 + }
  85 +
  86 + .sidebar nav ul {
  87 + list-style: none;
  88 + }
  89 +
  90 + .sidebar nav li a {
  91 + display: block;
  92 + padding: 12px 15px;
  93 + color: var(--text-secondary-color);
  94 + text-decoration: none;
  95 + border-radius: 6px;
  96 + margin-bottom: 5px;
  97 + font-weight: 500;
  98 + transition: background-color 0.2s, color 0.2s;
  99 + }
  100 +
  101 + .sidebar nav li a:hover, .sidebar nav li a.active {
  102 + background-color: var(--primary-color);
  103 + color: #fff;
  104 + }
  105 +
  106 + main {
  107 + flex: 1;
  108 + padding: 20px 40px;
  109 + }
  110 +
  111 + header {
  112 + display: flex;
  113 + justify-content: space-between;
  114 + align-items: center;
  115 + padding-bottom: 20px;
  116 + border-bottom: 1px solid var(--border-color);
  117 + margin-bottom: 30px;
  118 + }
  119 +
  120 + header h1 {
  121 + font-size: 2rem;
  122 + font-weight: 700;
  123 + }
  124 + header .report-meta {
  125 + font-size: 0.9rem;
  126 + color: var(--text-secondary-color);
  127 + }
  128 +
  129 + .controls button {
  130 + background: none;
  131 + border: 1px solid var(--border-color);
  132 + color: var(--text-secondary-color);
  133 + padding: 8px 12px;
  134 + border-radius: 6px;
  135 + cursor: pointer;
  136 + margin-left: 10px;
  137 + transition: background-color 0.2s, color 0.2s, border-color 0.2s;
  138 + }
  139 +
  140 + .controls button:hover {
  141 + background-color: var(--primary-color);
  142 + color: #fff;
  143 + border-color: var(--primary-color);
  144 + }
  145 +
  146 + .card {
  147 + background-color: var(--bg-secondary-color);
  148 + border: 1px solid var(--border-color);
  149 + border-radius: 8px;
  150 + padding: 25px;
  151 + margin-bottom: 30px;
  152 + box-shadow: 0 4px 12px var(--shadow-color);
  153 + transition: background-color 0.3s, border-color 0.3s;
  154 + }
  155 +
  156 + .card-header {
  157 + display: flex;
  158 + justify-content: space-between;
  159 + align-items: center;
  160 + margin-bottom: 20px;
  161 + cursor: pointer;
  162 + }
  163 +
  164 + .card-header h2 {
  165 + font-size: 1.5rem;
  166 + color: var(--primary-color);
  167 + font-weight: 600;
  168 + }
  169 +
  170 + .card-header .toggle-icon {
  171 + font-weight: bold;
  172 + font-size: 1.5rem;
  173 + transition: transform 0.3s ease;
  174 + }
  175 +
  176 + .card.collapsed .card-content {
  177 + max-height: 0;
  178 + overflow: hidden;
  179 + padding-top: 0;
  180 + margin-top: 0;
  181 + }
  182 + .card.collapsed .card-header .toggle-icon {
  183 + transform: rotate(-90deg);
  184 + }
  185 +
  186 + .card-content {
  187 + max-height: 5000px; /* Large value */
  188 + transition: max-height 0.7s ease-in-out, margin-top 0.3s, padding-top 0.3s;
  189 + }
  190 +
  191 + .grid-container {
  192 + display: grid;
  193 + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  194 + gap: 20px;
  195 + }
  196 +
  197 + .stat-box {
  198 + background-color: var(--bg-color);
  199 + padding: 20px;
  200 + border-radius: 8px;
  201 + border-left: 5px solid;
  202 + }
  203 +
  204 + .stat-box .value {
  205 + font-size: 2rem;
  206 + font-weight: 700;
  207 + color: var(--text-color);
  208 + }
  209 +
  210 + .stat-box .label {
  211 + font-size: 0.9rem;
  212 + color: var(--text-secondary-color);
  213 + }
  214 +
  215 + .stat-box.total {
  216 + border-color: var(--primary-color);
  217 + }
  218 + .stat-box.reads {
  219 + border-color: var(--accent-color);
  220 + }
  221 + .stat-box.interactions {
  222 + border-color: var(--positive-color);
  223 + }
  224 + .stat-box.negative {
  225 + border-color: var(--negative-color);
  226 + }
  227 +
  228 + .chart-container {
  229 + position: relative;
  230 + height: 350px;
  231 + width: 100%;
  232 + }
  233 +
  234 + .timeline {
  235 + position: relative;
  236 + padding: 20px 0;
  237 + }
  238 + .timeline::before {
  239 + content: '';
  240 + position: absolute;
  241 + left: 20px;
  242 + top: 0;
  243 + bottom: 0;
  244 + width: 2px;
  245 + background-color: var(--border-color);
  246 + }
  247 + .timeline-item {
  248 + position: relative;
  249 + margin-left: 60px;
  250 + margin-bottom: 30px;
  251 + }
  252 + .timeline-item::before {
  253 + content: '';
  254 + position: absolute;
  255 + left: -49px;
  256 + top: 5px;
  257 + width: 18px;
  258 + height: 18px;
  259 + border-radius: 50%;
  260 + background-color: var(--bg-secondary-color);
  261 + border: 4px solid var(--primary-color);
  262 + }
  263 + .timeline-item.alert::before {
  264 + border-color: var(--negative-color);
  265 + }
  266 + .timeline-time {
  267 + font-weight: bold;
  268 + color: var(--primary-color);
  269 + display: block;
  270 + margin-bottom: 5px;
  271 + }
  272 + .timeline-content {
  273 + background-color: var(--bg-color);
  274 + padding: 15px;
  275 + border-radius: 6px;
  276 + }
  277 +
  278 + ul.custom-list {
  279 + list-style: none;
  280 + padding-left: 20px;
  281 + }
  282 +
  283 + ul.custom-list li {
  284 + position: relative;
  285 + margin-bottom: 10px;
  286 + }
  287 +
  288 + ul.custom-list li::before {
  289 + content: '•';
  290 + position: absolute;
  291 + left: -20px;
  292 + color: var(--primary-color);
  293 + font-weight: bold;
  294 + }
  295 +
  296 + .tag {
  297 + display: inline-block;
  298 + padding: 3px 10px;
  299 + border-radius: 12px;
  300 + font-size: 0.8rem;
  301 + font-weight: 500;
  302 + }
  303 + .tag.positive { background-color: var(--positive-color); color: #fff; }
  304 + .tag.negative { background-color: var(--negative-color); color: #fff; }
  305 + .tag.neutral { background-color: var(--neutral-color); color: #333; }
  306 + .tag.pride { background-color: #4a90e2; color: #fff; }
  307 + .tag.anxiety { background-color: #f5a623; color: #fff; }
  308 + .tag.romance { background-color: #e83e8c; color: #fff; }
  309 +
  310 + table {
  311 + width: 100%;
  312 + border-collapse: collapse;
  313 + margin-top: 15px;
  314 + }
  315 + th, td {
  316 + padding: 12px;
  317 + text-align: left;
  318 + border-bottom: 1px solid var(--border-color);
  319 + }
  320 + th {
  321 + background-color: var(--bg-color);
  322 + font-weight: 600;
  323 + }
  324 +
  325 + @media (max-width: 1200px) {
  326 + .container {
  327 + flex-direction: column;
  328 + }
  329 + .sidebar {
  330 + width: 100%;
  331 + height: auto;
  332 + position: static;
  333 + border-right: none;
  334 + border-bottom: 1px solid var(--border-color);
  335 + }
  336 + main { padding: 20px; }
  337 + }
  338 +
  339 + @media (max-width: 768px) {
  340 + header {
  341 + flex-direction: column;
  342 + align-items: flex-start;
  343 + }
  344 + header h1 { font-size: 1.6rem; margin-bottom: 10px; }
  345 + .controls { width: 100%; text-align: right;}
  346 + .grid-container {
  347 + grid-template-columns: 1fr;
  348 + }
  349 + }
  350 +
  351 + @media print {
  352 + body {
  353 + --bg-color: #ffffff !important;
  354 + --bg-secondary-color: #ffffff !important;
  355 + --text-color: #000000 !important;
  356 + --border-color: #dddddd !important;
  357 + --primary-color: #003366 !important;
  358 + }
  359 + .sidebar, .controls, .card-header .toggle-icon { display: none; }
  360 + main { padding: 0; }
  361 + .card { box-shadow: none; border: 1px solid #ddd; page-break-inside: avoid; }
  362 + .card.collapsed .card-content { max-height: 100% !important; }
  363 + a { text-decoration: none; color: inherit; }
  364 + }
  365 + </style>
  366 +</head>
  367 +<body>
  368 +
  369 + <div class="container">
  370 + <aside class="sidebar">
  371 + <div class="sidebar-header">
  372 + <h2>舆情分析报告</h2>
  373 + <p style="font-size:0.9em; color: var(--text-secondary-color);">武汉大学</p>
  374 + </div>
  375 + <nav>
  376 + <ul>
  377 + <li><a href="#overview" class="active">1.0 舆情概览</a></li>
  378 + <li><a href="#trends">2.0 关键数据趋势</a></li>
  379 + <li><a href="#timeline">3.0 舆情动态时间轴</a></li>
  380 + <li><a href="#hot-topics">4.0 热点话题追踪</a></li>
  381 + <li><a href="#channels">5.0 重点渠道表现</a></li>
  382 + <li><a href="#risks">6.0 负面与风险监测</a></li>
  383 + <li><a href="#summary">7.0 简报与关注点</a></li>
  384 + <li><a href="#appendix">8.0 数据附录</a></li>
  385 + </ul>
  386 + </nav>
  387 + </aside>
  388 +
  389 + <main>
  390 + <header>
  391 + <div>
  392 + <h1>智能舆情分析报告:武汉大学</h1>
  393 + <div class="report-meta">报告周期:2024-03-01 至 2025-08-26</div>
  394 + </div>
  395 + <div class="controls">
  396 + <button id="theme-toggle">🌙 切换模式</button>
  397 + <button onclick="window.print()">🖨️ 打印/导出</button>
  398 + </div>
  399 + </header>
  400 +
  401 + <!-- 1.0 舆情概览 -->
  402 + <section id="overview" class="card">
  403 + <div class="card-header collapser">
  404 + <h2>1.0 本期舆情概览</h2>
  405 + <span class="toggle-icon">-</span>
  406 + </div>
  407 + <div class="card-content">
  408 + <div class="grid-container" style="margin-bottom: 30px;">
  409 + <div class="stat-box total"><div class="value">≈ 210万</div><div class="label">相关信息总量</div></div>
  410 + <div class="stat-box reads"><div class="value">≈ 3.8亿</div><div class="label">总阅读量</div></div>
  411 + <div class="stat-box interactions"><div class="value">≈ 420万</div><div class="label">总互动量</div></div>
  412 + <div class="stat-box negative"><div class="value">24%</div><div class="label">负面情感占比</div></div>
  413 + </div>
  414 + <div class="grid-container">
  415 + <div>
  416 + <h3>本期舆情热度 TOP 3</h3>
  417 + <ul class="custom-list">
  418 + <li><span class="tag negative">高风险</span> 杨景媛学术不端及图书馆诬告案</li>
  419 + <li><span class="tag romance">热议</span> 樱花季预约与校园开放讨论</li>
  420 + <li><span class="tag anxiety">关注</span> 优势学科声誉与毕业生就业薪资反差</li>
  421 + </ul>
  422 + </div>
  423 + <div>
  424 + <h3>整体情感分布</h3>
  425 + <div class="chart-container" style="height: 200px;">
  426 + <canvas id="sentimentPieChart"></canvas>
  427 + </div>
  428 + </div>
  429 + </div>
  430 + </div>
  431 + </section>
  432 +
  433 + <!-- 2.0 关键数据趋势 -->
  434 + <section id="trends" class="card">
  435 + <div class="card-header collapser">
  436 + <h2>2.0 关键数据趋势</h2>
  437 + <span class="toggle-icon">-</span>
  438 + </div>
  439 + <div class="card-content">
  440 + <div class="grid-container">
  441 + <div>
  442 + <h3>声量走势</h3>
  443 + <div class="chart-container">
  444 + <canvas id="volumeLineChart"></canvas>
  445 + </div>
  446 + </div>
  447 + <div>
  448 + <h3>情感趋势</h3>
  449 + <div class="chart-container">
  450 + <canvas id="sentimentTrendLineChart"></canvas>
  451 + </div>
  452 + </div>
  453 + </div>
  454 + </div>
  455 + </section>
  456 +
  457 + <!-- 3.0 舆情动态时间轴 -->
  458 + <section id="timeline" class="card">
  459 + <div class="card-header collapser">
  460 + <h2>3.0 舆情动态时间轴</h2>
  461 + <span class="toggle-icon">-</span>
  462 + </div>
  463 + <div class="card-content">
  464 + <div class="timeline">
  465 + <div class="timeline-item">
  466 + <span class="timeline-time">2024年3月-4月</span>
  467 + <div class="timeline-content">
  468 + <strong>樱花季热议期:</strong>微博话题 #武大樱花预约# 阅读量超3.8亿,引发关于“抢票难”和校园开放度的广泛讨论,情感呈现“浪漫”与“焦虑”交织的两极化特征。
  469 + </div>
  470 + </div>
  471 + <div class="timeline-item alert">
  472 + <span class="timeline-time">2025年7月</span>
  473 + <div class="timeline-content">
  474 + <strong>学术不端事件发酵:</strong>硕士毕业生杨景媛在“图书馆诬告案”败诉后,其学位论文被曝严重学术造假,包括数据伪造、常识错误等,舆情开始迅速升温。
  475 + </div>
  476 + </div>
  477 + <div class="timeline-item alert">
  478 + <span class="timeline-time">2025年7月31日</span>
  479 + <div class="timeline-content">
  480 + <strong>外部机构介入:</strong>香港浸会大学就杨景媛录取资格发出道德核查函,启动独立审查程序,将事件关注度推向更高层次。
  481 + </div>
  482 + </div>
  483 + <div class="timeline-item alert">
  484 + <span class="timeline-time">2025年8月1日</span>
  485 + <div class="timeline-content">
  486 + <strong>官方首次回应:</strong>在央媒关注后,武汉大学宣布成立工作专班,对杨景媛学术不端问题进行全面调查复核。但因回应滞后,引发公众对校方处理效率的质疑。
  487 + </div>
  488 + </div>
  489 + <div class="timeline-item">
  490 + <span class="timeline-time">2025年8月6日</span>
  491 + <div class="timeline-content">
  492 + <strong>信息混乱与澄清:</strong>网络流传“港浸大撤销杨景媛录取资格”消息,后被证实为谣言,校方表示按程序处理,进一步加剧了公众对处理结果的关切与等待。
  493 + </div>
  494 + </div>
  495 + </div>
  496 + </div>
  497 + </section>
  498 +
  499 + <!-- 4.0 热点话题追踪 -->
  500 + <section id="hot-topics" class="card">
  501 + <div class="card-header collapser">
  502 + <h2>4.0 热点话题追踪</h2>
  503 + <span class="toggle-icon">-</span>
  504 + </div>
  505 + <div class="card-content">
  506 + <h3>4.1 核心热点:学术不端与“图书馆诬告案”复合型危机</h3>
  507 + <p>本周期内,舆情风暴的核心是围绕毕业生杨景媛的复合型事件。该事件融合了 <span class="tag negative">学术诚信</span><span class="tag negative">程序正义</span><span class="tag negative">师德师风</span><span class="tag negative">大学治理</span> 四大敏感议题,引发全网高度关注。主要舆情观点聚焦于:</p>
  508 + <ul class="custom-list">
  509 + <li><b>对学术不端“零容忍”的强烈呼吁:</b>公众对论文中出现的低级错误(如“1049年”)、数据造假等行为感到震惊,要求严肃处理,并质疑导师、答辩委员会的审查责任。</li>
  510 + <li><b>对高校管理机制的系统性质疑:</b>事件暴露了研究生培养、学位授予审核流程中可能存在的漏洞。校方在事发后反应迟缓,被批评为“拖延”和“被动应对”,损害了学校公信力。</li>
  511 + <li><b>对公平与正义的朴素追求:</b>受害者肖同学的遭遇(被诬告、受处分、失保研资格)与杨景媛一度的“顺利”形成鲜明对比,激起网民对高校学生奖惩机制公平性的强烈不满。</li>
  512 + </ul>
  513 + <h3 style="margin-top:20px;">4.2 新增关注点:学科声
  514 +</body>
  515 +</html>
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告 - 武汉大学</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <link rel="preconnect" href="https://fonts.googleapis.com">
  19 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  20 + <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
  21 + <style>
  22 + :root {
  23 + --primary-color: #1a73e8;
  24 + --secondary-color: #5f6368;
  25 + --background-color: #f8f9fa;
  26 + --card-background-color: #ffffff;
  27 + --text-color: #202124;
  28 + --border-color: #e0e0e0;
  29 + --shadow-color: rgba(0, 0, 0, 0.1);
  30 + --positive-color: #34a853;
  31 + --negative-color: #ea4335;
  32 + --neutral-color: #fbbc05;
  33 + --font-family: 'Noto Sans SC', sans-serif;
  34 + }
  35 +
  36 + .dark-mode {
  37 + --primary-color: #8ab4f8;
  38 + --secondary-color: #9aa0a6;
  39 + --background-color: #202124;
  40 + --card-background-color: #303134;
  41 + --text-color: #e8eaed;
  42 + --border-color: #5f6368;
  43 + --shadow-color: rgba(0, 0, 0, 0.3);
  44 + }
  45 +
  46 + * {
  47 + box-sizing: border-box;
  48 + margin: 0;
  49 + padding: 0;
  50 + }
  51 +
  52 + body {
  53 + font-family: var(--font-family);
  54 + background-color: var(--background-color);
  55 + color: var(--text-color);
  56 + line-height: 1.6;
  57 + transition: background-color 0.3s, color 0.3s;
  58 + font-size: 16px;
  59 + }
  60 +
  61 + .container {
  62 + display: flex;
  63 + max-width: 1600px;
  64 + margin: 0 auto;
  65 + }
  66 +
  67 + .sidebar {
  68 + width: 280px;
  69 + background-color: var(--card-background-color);
  70 + border-right: 1px solid var(--border-color);
  71 + position: sticky;
  72 + top: 0;
  73 + height: 100vh;
  74 + overflow-y: auto;
  75 + padding: 20px;
  76 + transition: background-color 0.3s, border-color 0.3s;
  77 + }
  78 +
  79 + .sidebar h2 {
  80 + color: var(--primary-color);
  81 + margin-bottom: 20px;
  82 + font-size: 1.5rem;
  83 + border-bottom: 2px solid var(--primary-color);
  84 + padding-bottom: 10px;
  85 + }
  86 +
  87 + .sidebar ul {
  88 + list-style: none;
  89 + }
  90 +
  91 + .sidebar ul li a {
  92 + display: block;
  93 + color: var(--text-color);
  94 + text-decoration: none;
  95 + padding: 12px 15px;
  96 + border-radius: 8px;
  97 + margin-bottom: 5px;
  98 + font-weight: 500;
  99 + transition: background-color 0.2s, color 0.2s;
  100 + }
  101 +
  102 + .sidebar ul li a:hover, .sidebar ul li a.active {
  103 + background-color: var(--primary-color);
  104 + color: white;
  105 + }
  106 +
  107 + .main-content {
  108 + flex: 1;
  109 + padding: 30px 40px;
  110 + }
  111 +
  112 + header {
  113 + margin-bottom: 30px;
  114 + padding-bottom: 20px;
  115 + border-bottom: 1px solid var(--border-color);
  116 + display: flex;
  117 + justify-content: space-between;
  118 + align-items: center;
  119 + }
  120 +
  121 + header h1 {
  122 + font-size: 2.5rem;
  123 + color: var(--text-color);
  124 + font-weight: 700;
  125 + }
  126 +
  127 + .header-controls button {
  128 + background: var(--primary-color);
  129 + color: white;
  130 + border: none;
  131 + padding: 10px 15px;
  132 + border-radius: 8px;
  133 + cursor: pointer;
  134 + margin-left: 10px;
  135 + font-size: 14px;
  136 + transition: opacity 0.2s;
  137 + }
  138 +
  139 + .header-controls button:hover { opacity: 0.8; }
  140 +
  141 + .report-section {
  142 + margin-bottom: 40px;
  143 + background-color: var(--card-background-color);
  144 + padding: 25px;
  145 + border-radius: 12px;
  146 + box-shadow: 0 4px 12px var(--shadow-color);
  147 + transition: background-color 0.3s, box-shadow 0.3s;
  148 + }
  149 +
  150 + .section-header {
  151 + display: flex;
  152 + justify-content: space-between;
  153 + align-items: center;
  154 + cursor: pointer;
  155 + margin-bottom: 20px;
  156 + }
  157 +
  158 + .section-header h2 {
  159 + font-size: 1.8rem;
  160 + color: var(--primary-color);
  161 + font-weight: 500;
  162 + }
  163 +
  164 + .section-header .toggle-icon {
  165 + font-size: 1.5rem;
  166 + transition: transform 0.3s;
  167 + }
  168 +
  169 + .section-content {
  170 + max-height: 10000px; /* Large value for open state */
  171 + overflow: hidden;
  172 + transition: max-height 0.5s ease-in-out, padding 0.5s ease-in-out;
  173 + }
  174 +
  175 + .section-content.collapsed {
  176 + max-height: 0;
  177 + padding-top: 0;
  178 + padding-bottom: 0;
  179 + margin-bottom: -20px;
  180 + }
  181 +
  182 + .grid-container {
  183 + display: grid;
  184 + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  185 + gap: 20px;
  186 + }
  187 +
  188 + .kpi-card {
  189 + background-color: var(--background-color);
  190 + padding: 20px;
  191 + border-radius: 10px;
  192 + text-align: center;
  193 + border-left: 5px solid var(--primary-color);
  194 + }
  195 +
  196 + .kpi-card .value {
  197 + font-size: 2rem;
  198 + font-weight: 700;
  199 + color: var(--primary-color);
  200 + margin-bottom: 5px;
  201 + }
  202 +
  203 + .kpi-card .label {
  204 + font-size: 1rem;
  205 + color: var(--secondary-color);
  206 + }
  207 +
  208 + .top-topic-card {
  209 + background-color: var(--background-color);
  210 + padding: 20px;
  211 + border-radius: 10px;
  212 + }
  213 +
  214 + .top-topic-card h4 {
  215 + margin-bottom: 10px;
  216 + color: var(--primary-color);
  217 + }
  218 +
  219 + .alert-card {
  220 + background-color: #fff0f0;
  221 + color: #d93025;
  222 + padding: 20px;
  223 + border-radius: 10px;
  224 + border-left: 5px solid #d93025;
  225 + }
  226 + .dark-mode .alert-card {
  227 + background-color: #4d2a29;
  228 + color: #f8a9a4;
  229 + }
  230 +
  231 + .timeline {
  232 + position: relative;
  233 + padding-left: 30px;
  234 + }
  235 +
  236 + .timeline::before {
  237 + content: '';
  238 + position: absolute;
  239 + left: 10px;
  240 + top: 0;
  241 + bottom: 0;
  242 + width: 2px;
  243 + background-color: var(--primary-color);
  244 + }
  245 +
  246 + .timeline-item {
  247 + margin-bottom: 25px;
  248 + position: relative;
  249 + }
  250 +
  251 + .timeline-item::before {
  252 + content: '';
  253 + position: absolute;
  254 + left: -25px;
  255 + top: 5px;
  256 + width: 12px;
  257 + height: 12px;
  258 + border-radius: 50%;
  259 + background-color: var(--card-background-color);
  260 + border: 2px solid var(--primary-color);
  261 + }
  262 +
  263 + .timeline-item-date {
  264 + font-weight: 700;
  265 + color: var(--secondary-color);
  266 + margin-bottom: 5px;
  267 + }
  268 +
  269 + .topic-detail-card {
  270 + background-color: var(--background-color);
  271 + border-radius: 10px;
  272 + padding: 20px;
  273 + margin-bottom: 20px;
  274 + }
  275 + .topic-detail-card h4 { color: var(--primary-color); margin-bottom: 10px; }
  276 +
  277 + .channel-list li {
  278 + display: flex;
  279 + justify-content: space-between;
  280 + align-items: center;
  281 + padding: 8px 0;
  282 + border-bottom: 1px solid var(--border-color);
  283 + }
  284 + .channel-list li:last-child { border-bottom: none; }
  285 +
  286 + .negative-list li {
  287 + margin-bottom: 10px;
  288 + padding-left: 20px;
  289 + position: relative;
  290 + }
  291 +
  292 + .negative-list li::before {
  293 + content: '🔴';
  294 + position: absolute;
  295 + left: 0;
  296 + top: 0;
  297 + }
  298 +
  299 + .risk-list li {
  300 + margin-bottom: 10px;
  301 + padding-left: 20px;
  302 + position: relative;
  303 + }
  304 + .risk-list li::before {
  305 + content: '⚠️';
  306 + position: absolute;
  307 + left: 0;
  308 + top: 0;
  309 + }
  310 +
  311 + .forum-log-container {
  312 + background-color: var(--background-color);
  313 + border-radius: 10px;
  314 + padding: 20px;
  315 + max-height: 400px;
  316 + overflow-y: auto;
  317 + }
  318 + .forum-post {
  319 + border-bottom: 1px dashed var(--border-color);
  320 + padding: 15px 0;
  321 + margin-bottom: 10px;
  322 + }
  323 + .forum-post:last-child { border-bottom: none; }
  324 + .post-header { display: flex; align-items: center; margin-bottom: 8px; color: var(--secondary-color); font-size: 0.9em;}
  325 + .post-author { font-weight: bold; color: var(--primary-color); margin-right: 10px; }
  326 + .post-content { font-size: 1em; }
  327 + .post-tags { margin-top: 10px; }
  328 + .post-tags span { background-color: var(--primary-color); color: white; padding: 3px 8px; border-radius: 12px; font-size: 0.8em; margin-right: 5px; opacity: 0.8;}
  329 +
  330 + footer {
  331 + text-align: center;
  332 + padding: 20px;
  333 + margin-top: 20px;
  334 + color: var(--secondary-color);
  335 + font-size: 0.9em;
  336 + }
  337 +
  338 + @media (max-width: 1200px) {
  339 + .container { flex-direction: column; }
  340 + .sidebar { position: static; width: 100%; height: auto; border-right: none; border-bottom: 1px solid var(--border-color); }
  341 + .main-content { padding: 20px; }
  342 + }
  343 +
  344 + @media (max-width: 768px) {
  345 + header h1 { font-size: 1.8rem; }
  346 + .section-header h2 { font-size: 1.5rem; }
  347 + .main-content { padding: 15px; }
  348 + .grid-container { grid-template-columns: 1fr; }
  349 + }
  350 +
  351 + @media print {
  352 + .sidebar, .header-controls, footer, .section-header .toggle-icon {
  353 + display: none;
  354 + }
  355 + body, .main-content, .report-section {
  356 + box-shadow: none;
  357 + border: none;
  358 + padding: 0;
  359 + margin: 0;
  360 + }
  361 + .report-section { page-break-inside: avoid; margin-bottom: 20px; }
  362 + }
  363 +
  364 + </style>
  365 +</head>
  366 +<body>
  367 +
  368 + <div class="container">
  369 + <aside class="sidebar" id="sidebar">
  370 + <h2>导航目录</h2>
  371 + <nav>
  372 + <ul>
  373 + <li><a href="#overview" class="nav-link">1.0 舆情概览</a></li>
  374 + <li><a href="#trends" class="nav-link">2.0 关键数据趋势</a></li>
  375 + <li><a href="#timeline" class="nav-link">3.0 舆情动态时间轴</a></li>
  376 + <li><a href="#hot-topics" class="nav-link">4.0 热点话题追踪</a></li>
  377 + <li><a href="#channels" class="nav-link">5.0 重点渠道表现</a></li>
  378 + <li><a href="#risks" class="nav-link">6.0 负面与风险监测</a></li>
  379 + <li><a href="#forum" class="nav-link">7.0 论坛用户洞察</a></li>
  380 + <li><a href="#summary" class="nav-link">8.0 简报与关注点</a></li>
  381 + </ul>
  382 + </nav>
  383 + </aside>
  384 +
  385 + <main class="main-content">
  386 + <header>
  387 + <h1>智能舆情分析报告 <br><small style="font-size: 1.2rem; color: var(--secondary-color); font-weight: 400;">监测对象:武汉大学</small></h1>
  388 + <div class="header-controls">
  389 + <button id="theme-toggle">切换模式</button>
  390 + <button onclick="window.print()">打印/导出PDF</button>
  391 + </div>
  392 + </header>
  393 +
  394 + <section class="report-section" id="overview">
  395 + <div class="section-header" data-target="#overview-content">
  396 + <h2>1.0 本期舆情概览</h2>
  397 + <span class="toggle-icon"></span>
  398 + </div>
  399 + <div id="overview-content" class="section-content">
  400 + <div class="grid-container" style="margin-bottom: 20px;">
  401 + <div class="kpi-card">
  402 + <div class="value">210万+</div>
  403 + <div class="label">相关文本量</div>
  404 + </div>
  405 + <div class="kpi-card">
  406 + <div class="value">3.8亿+</div>
  407 + <div class="label">总阅读量</div>
  408 + </div>
  409 + <div class="kpi-card">
  410 + <div class="value">420万+</div>
  411 + <div class="label">总互动量</div>
  412 + </div>
  413 + </div>
  414 + <div class="grid-container" style="grid-template-columns: 1fr 1fr; align-items: stretch;">
  415 + <div>
  416 + <h4>1.2 本期舆情热度 TOP 3</h4>
  417 + <div class="top-topic-card" style="margin-bottom: 10px;"><strong>1. 学术诚信危机:</strong>杨景媛论文造假及图书馆诬告案引发全网关注,严重冲击校誉。</div>
  418 + <div class="top-topic-card" style="margin-bottom: 10px;"><strong>2. 学科声誉与就业焦虑:</strong>“世界第一”的遥感等学科与毕业生“工资条沉默”的现实形成强烈对比,引发热议。</div>
  419 + <div class="top-topic-card"><strong>3. 校园文化与公共管理:</strong>樱花季“一票难求”及校园商业化讨论,反映了公共资源开放与校内体验的矛盾。</div>
  420 + </div>
  421 + <div>
  422 + <h4>1.1 核心情感分布</h4>
  423 + <canvas id="sentimentPieChart"></canvas>
  424 + </div>
  425 + </div>
  426 + <div style="margin-top: 20px;">
  427 + <h4>1.3 重点预警</h4>
  428 + <div class="alert-card">
  429 + <strong>高风险:</strong>杨景媛学术不端事件持续发酵,校方回应迟缓且缺乏透明度,已导致公信力严重受损。若后续处理不当,可能引发更广泛的信任危机,并对招生、学术合作产生长期负面影响。
  430 + </div>
  431 + </div>
  432 + </div>
  433 + </section>
  434 +
  435 + <section class="report-section" id="trends">
  436 + <div class="section-header" data-target="#trends-content">
  437 + <h2>2.0 关键数据趋势</h2>
  438 + <span class="toggle-icon"></span>
  439 + </div>
  440 + <div id="trends-content" class="section-content">
  441 + <div class="grid-container" style="grid-template-columns: 1fr 1fr;">
  442 + <div>
  443 + <h4>2.1 声量走势</h4>
  444 + <canvas id="volumeTrendChart"></canvas>
  445 + </div>
  446 + <div>
  447 + <h4>2.2 情感趋势</h4>
  448 + <canvas id="sentimentTrendChart"></canvas>
  449 + </div>
  450 + </div>
  451 + </div>
  452 + </section>
  453 +
  454 + <section class="report-section" id="timeline">
  455 + <div class="section-header" data-target="#timeline-content">
  456 + <h2>3.0 本周期舆情动态时间轴</h2>
  457 + <span class="toggle-icon"></span>
  458 + </div>
  459 + <div id="timeline-content" class="section-content">
  460 + <div class="timeline">
  461 + <div class="timeline-item">
  462 + <div class="timeline-item-date">2025年7月</div>
  463 + <p>硕士毕业生杨景媛被曝论文严重造假,并与其长期诬告肖姓学弟性骚扰败诉案关联,引发网络初步关注。</p>
  464 + </div>
  465 + <div class="timeline-item">
  466 + <div class="timeline-item-date">2025年7月31日</div>
  467 + <p>香港浸会大学就杨景媛录取事宜发出道德核查函,启动独立审查程序。</p>
  468 + </div>
  469 + <div class="timeline-item">
  470 + <div class="timeline-item-date">2025年8月1日</div>
  471 + <p>央媒关注后,武汉大学宣布成立工作专班,对杨景媛学术不端问题进行全面调查复核。<strong>舆情声量达到顶峰。</strong></p>
  472 + </div>
  473 + <div class="timeline-item">
  474 + <div class="timeline-item-date">2025年8月6日</div>
  475 + <p>网传“港浸大撤销杨景媛录取资格”消息被证伪,校方表示按程序处理,引发公众对处理效率的质疑。</p>
  476 + </div>
  477 + <div class="timeline-item">
  478 + <div class="timeline-item-date">周期内持续热议</div>
  479 + <p>关于顶尖学科就业前景、樱花季管理、校史文化等话题在社交媒体持续发酵,形成多元舆论场。</p>
  480 + </div>
  481 + </div>
  482 + </div>
  483 + </section>
  484 +
  485 + <section class="report-section" id="hot-topics">
  486 + <div class="section-header" data-target="#hot-topics-content">
  487 + <h2>4.0 热点话题追踪</h2>
  488 + <span class="toggle-icon"></span>
  489 + </div>
  490 + <div id="hot-topics-content" class="section-content">
  491 + <h4>4.1 本期热点事件/话题详情</h4>
  492 + <div class="topic-detail-card">
  493 + <h4>热点一:学术诚信危机与信任风波</h4>
  494 + <p><strong>事件核心:</strong>杨景媛硕士论文被揭露存在虚构法律、伪造数据、常识错误、大量抄袭等系统性学术不端行为。此事与其诬告肖姓学弟案败诉背景交织,放大了事件的戏剧性和不公感。</p>
  495 + <p><strong>舆论焦点:</strong>公众普遍质疑武汉大学的研究生培养、论文审核及导师监督机制。校方在事件曝光后反应迟缓,“等上级安排”的言论进一步激化负面情绪。舆论普遍认为,此事不仅是个人学术失德,更是高校制度性漏洞的体现,对武汉大学百年校誉造成重创。</p>
  496 + </div>
  497 + <div class="topic-detail-card">
  498 + <h4>热点二:顶尖声誉与现实焦虑的碰撞</h4>
  499 + <p><strong>核心议题:</strong>武汉大学拥有测绘遥感(世界第一)、法学(A)等众多优势学科,享有崇高学术声誉。然而,社交媒体上,相关专业学生和毕业生普遍表达了对就业前景的焦虑,如“遥感硕士春招中位数7.2k”、“法学生实习5k不包宿”等
  500 +</body>
  501 +</html>
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告 - 武汉大学</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <script src="https://cdn.jsdelivr.net/npm/html2pdf.js@0.10.1/dist/html2pdf.bundle.min.js"></script>
  19 + <style>
  20 + :root {
  21 + --bg-color: #f4f7f9;
  22 + --text-color: #333;
  23 + --card-bg: #ffffff;
  24 + --border-color: #eef2f5;
  25 + --primary-color: #2c5282;
  26 + --accent-color: #3182ce;
  27 + --positive-color: #48bb78;
  28 + --negative-color: #e53e3e;
  29 + --neutral-color: #a0aec0;
  30 + --shadow-color: rgba(0, 0, 0, 0.05);
  31 + --sidebar-bg: #1a202c;
  32 + --sidebar-text: #e2e8f0;
  33 + --sidebar-hover: #2d3748;
  34 + }
  35 +
  36 + .dark-mode {
  37 + --bg-color: #1a202c;
  38 + --text-color: #e2e8f0;
  39 + --card-bg: #2d3748;
  40 + --border-color: #4a5568;
  41 + --primary-color: #63b3ed;
  42 + --accent-color: #4299e1;
  43 + --shadow-color: rgba(0, 0, 0, 0.2);
  44 + --sidebar-bg: #111827;
  45 + --sidebar-text: #cbd5e0;
  46 + --sidebar-hover: #1f2937;
  47 + }
  48 +
  49 + * {
  50 + box-sizing: border-box;
  51 + margin: 0;
  52 + padding: 0;
  53 + }
  54 +
  55 + body {
  56 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
  57 + background-color: var(--bg-color);
  58 + color: var(--text-color);
  59 + line-height: 1.6;
  60 + transition: background-color 0.3s, color 0.3s;
  61 + display: flex;
  62 + }
  63 +
  64 + .container {
  65 + display: flex;
  66 + width: 100%;
  67 + }
  68 +
  69 + .sidebar {
  70 + width: 260px;
  71 + background-color: var(--sidebar-bg);
  72 + color: var(--sidebar-text);
  73 + position: fixed;
  74 + height: 100%;
  75 + overflow-y: auto;
  76 + padding: 20px 0;
  77 + transition: width 0.3s;
  78 + z-index: 1000;
  79 + }
  80 +
  81 + .sidebar h1 {
  82 + font-size: 1.5rem;
  83 + padding: 0 20px 20px 20px;
  84 + border-bottom: 1px solid var(--border-color);
  85 + margin-bottom: 20px;
  86 + color: #fff;
  87 + }
  88 +
  89 + .sidebar nav ul {
  90 + list-style: none;
  91 + }
  92 +
  93 + .sidebar nav li a {
  94 + display: block;
  95 + padding: 12px 20px;
  96 + color: var(--sidebar-text);
  97 + text-decoration: none;
  98 + font-weight: 500;
  99 + transition: background-color 0.2s, color 0.2s;
  100 + border-left: 3px solid transparent;
  101 + }
  102 +
  103 + .sidebar nav li a:hover {
  104 + background-color: var(--sidebar-hover);
  105 + color: #fff;
  106 + border-left-color: var(--primary-color);
  107 + }
  108 +
  109 + .main-content {
  110 + margin-left: 260px;
  111 + width: calc(100% - 260px);
  112 + padding: 30px;
  113 + transition: margin-left 0.3s, width 0.3s;
  114 + }
  115 +
  116 + .report-header {
  117 + display: flex;
  118 + justify-content: space-between;
  119 + align-items: center;
  120 + margin-bottom: 30px;
  121 + }
  122 +
  123 + .report-header h2 {
  124 + font-size: 2rem;
  125 + color: var(--primary-color);
  126 + }
  127 +
  128 + .actions {
  129 + display: flex;
  130 + gap: 10px;
  131 + }
  132 +
  133 + .action-btn {
  134 + background-color: var(--card-bg);
  135 + color: var(--text-color);
  136 + border: 1px solid var(--border-color);
  137 + padding: 8px 15px;
  138 + border-radius: 6px;
  139 + cursor: pointer;
  140 + font-size: 14px;
  141 + transition: background-color 0.2s, box-shadow 0.2s;
  142 + }
  143 +
  144 + .action-btn:hover {
  145 + background-color: var(--bg-color);
  146 + box-shadow: 0 2px 4px var(--shadow-color);
  147 + }
  148 +
  149 + .card {
  150 + background-color: var(--card-bg);
  151 + border-radius: 8px;
  152 + box-shadow: 0 4px 6px var(--shadow-color);
  153 + padding: 25px;
  154 + margin-bottom: 30px;
  155 + transition: background-color 0.3s;
  156 + }
  157 +
  158 + .card h3 {
  159 + font-size: 1.5rem;
  160 + color: var(--primary-color);
  161 + margin-bottom: 20px;
  162 + padding-bottom: 10px;
  163 + border-bottom: 1px solid var(--border-color);
  164 + }
  165 +
  166 + .grid-container {
  167 + display: grid;
  168 + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  169 + gap: 20px;
  170 + }
  171 +
  172 + .data-point {
  173 + background-color: var(--bg-color);
  174 + padding: 20px;
  175 + border-radius: 6px;
  176 + text-align: center;
  177 + }
  178 +
  179 + .data-point .value {
  180 + font-size: 2rem;
  181 + font-weight: bold;
  182 + color: var(--accent-color);
  183 + }
  184 +
  185 + .data-point .label {
  186 + font-size: 0.9rem;
  187 + color: var(--text-color);
  188 + opacity: 0.8;
  189 + }
  190 +
  191 + .timeline {
  192 + position: relative;
  193 + padding: 20px 0;
  194 + }
  195 +
  196 + .timeline::before {
  197 + content: '';
  198 + position: absolute;
  199 + left: 20px;
  200 + top: 0;
  201 + bottom: 0;
  202 + width: 2px;
  203 + background-color: var(--border-color);
  204 + }
  205 +
  206 + .timeline-item {
  207 + position: relative;
  208 + padding-left: 50px;
  209 + margin-bottom: 30px;
  210 + }
  211 +
  212 + .timeline-item::before {
  213 + content: '';
  214 + position: absolute;
  215 + left: 12px;
  216 + top: 5px;
  217 + width: 18px;
  218 + height: 18px;
  219 + border-radius: 50%;
  220 + background-color: var(--accent-color);
  221 + border: 3px solid var(--bg-color);
  222 + }
  223 +
  224 + .timeline-date {
  225 + font-weight: bold;
  226 + color: var(--accent-color);
  227 + margin-bottom: 5px;
  228 + }
  229 +
  230 + .hot-topic-list li {
  231 + margin-bottom: 15px;
  232 + padding-left: 20px;
  233 + position: relative;
  234 + }
  235 +
  236 + .hot-topic-list li::before {
  237 + content: '🔥';
  238 + position: absolute;
  239 + left: -5px;
  240 + }
  241 +
  242 + .hot-topic-list strong {
  243 + color: var(--primary-color);
  244 + }
  245 +
  246 + details {
  247 + border: 1px solid var(--border-color);
  248 + border-radius: 6px;
  249 + margin-bottom: 10px;
  250 + overflow: hidden;
  251 + }
  252 +
  253 + summary {
  254 + padding: 15px;
  255 + background-color: var(--bg-color);
  256 + cursor: pointer;
  257 + font-weight: bold;
  258 + color: var(--primary-color);
  259 + }
  260 +
  261 + .details-content {
  262 + padding: 20px;
  263 + border-top: 1px solid var(--border-color);
  264 + }
  265 +
  266 + .tag {
  267 + display: inline-block;
  268 + padding: 4px 10px;
  269 + border-radius: 12px;
  270 + font-size: 0.8rem;
  271 + margin-right: 5px;
  272 + }
  273 +
  274 + .tag-positive { background-color: var(--positive-color); color: white; }
  275 + .tag-negative { background-color: var(--negative-color); color: white; }
  276 + .tag-neutral { background-color: var(--neutral-color); color: white; }
  277 +
  278 + @media (max-width: 768px) {
  279 + .sidebar {
  280 + width: 100%;
  281 + height: auto;
  282 + position: relative;
  283 + padding: 0;
  284 + }
  285 + .sidebar h1 { display: none; }
  286 + .sidebar nav ul { display: flex; overflow-x: auto; }
  287 + .sidebar nav li a { border-bottom: 3px solid transparent; border-left: none; }
  288 +
  289 + .main-content {
  290 + margin-left: 0;
  291 + width: 100%;
  292 + padding: 20px;
  293 + }
  294 +
  295 + .report-header {
  296 + flex-direction: column;
  297 + align-items: flex-start;
  298 + gap: 15px;
  299 + }
  300 + }
  301 +
  302 + @media print {
  303 + .sidebar, .actions {
  304 + display: none;
  305 + }
  306 + .main-content {
  307 + margin-left: 0;
  308 + width: 100%;
  309 + padding: 0;
  310 + }
  311 + .card {
  312 + box-shadow: none;
  313 + border: 1px solid #ccc;
  314 + }
  315 + }
  316 + </style>
  317 +</head>
  318 +<body>
  319 + <div class="container">
  320 + <aside class="sidebar">
  321 + <h1>分析报告</h1>
  322 + <nav>
  323 + <ul>
  324 + <li><a href="#overview">1.0 舆情概览</a></li>
  325 + <li><a href="#trends">2.0 关键数据趋势</a></li>
  326 + <li><a href="#timeline">3.0 舆情动态时间轴</a></li>
  327 + <li><a href="#topics">4.0 热点话题追踪</a></li>
  328 + <li><a href="#channels">5.0 重点渠道表现</a></li>
  329 + <li><a href="#risks">6.0 负面与风险监测</a></li>
  330 + <li><a href="#summary">7.0 简报与关注点</a></li>
  331 + </ul>
  332 + </nav>
  333 + </aside>
  334 +
  335 + <main class="main-content" id="report-content">
  336 + <header class="report-header">
  337 + <h2>智能舆情分析报告:武汉大学</h2>
  338 + <div class="actions">
  339 + <button id="theme-toggle" class="action-btn">切换暗色模式</button>
  340 + <button id="print-btn" class="action-btn">打印/导出PDF</button>
  341 + </div>
  342 + </header>
  343 +
  344 + <section id="overview" class="card">
  345 + <h3>1.0 本期舆情概览</h3>
  346 + <p>本报告周期内,武汉大学相关舆情呈现出“历史荣光”与“现实挑战”交织的复杂态势。正面声量主要由学术成就、校园文化(如樱花季)及杰出校友贡献驱动。然而,以“杨景媛学术不端事件”为核心的重**大负面事件**,引发了公众对学校学术诚信、危机处理和管理机制的广泛质疑,成为本期舆情风暴的中心。整体情感倾向复杂,既有身为名校的自豪,也有对现实问题的焦虑与批评。</p>
  347 +
  348 + <div class="card-section" style="margin-top: 20px;">
  349 + <h4>1.1 核心数据看板</h4>
  350 + <div class="grid-container">
  351 + <div class="data-point">
  352 + <div class="value">≈210万</div>
  353 + <div class="label">相关信息样本</div>
  354 + </div>
  355 + <div class="data-point">
  356 + <div class="value">≈3.8亿</div>
  357 + <div class="label">总阅读量</div>
  358 + </div>
  359 + <div class="data-point">
  360 + <div class="value">≈420万</div>
  361 + <div class="label">总互动量</div>
  362 + </div>
  363 + <div class="data-point">
  364 + <div class="value">-25.3%</div>
  365 + <div class="label">净情感值</div>
  366 + </div>
  367 + </div>
  368 + </div>
  369 +
  370 + <div class="card-section" style="margin-top: 20px;">
  371 + <h4>1.2 本期舆情热度 TOP 3</h4>
  372 + <ol class="hot-topic-list">
  373 + <li><strong>学术不端与图书馆诬告案:</strong>杨景媛硕士论文学术造假及相关诬告案败诉事件,引发全网对学术诚信和高校管理责任的拷问,舆情热度最高,负面影响最深。</li>
  374 + <li><strong>学科实力与职业焦虑的矛盾:</strong>以测绘遥感世界第一为代表的学术自豪感,与毕业生面临的就业薪资压力形成鲜明对比,引发学生和校友群体“自豪与焦虑”并存的复杂讨论。</li>
  375 + <li><strong>樱花季的“浪漫与烦恼”:</strong>武大樱花季作为传统文化名片,在社交媒体上获得大量正面传播,但同时也伴随着预约难、校园拥挤等抱怨,呈现出“浪漫”与“焦虑”交织的舆情特点。</li>
  376 + </ol>
  377 + </div>
  378 +
  379 + <div class="card-section" style="margin-top: 20px;">
  380 + <h4>1.3 重点预警</h4>
  381 + <p><span class="tag tag-negative">高风险</span> 学术不端事件的后续处理是当前最大的舆情风险点。校方回应的及时性、调查的公正性与处理结果的透明度,将直接影响学校声誉的修复。任何处理不当都可能引发新一轮舆论危机。</p>
  382 + </div>
  383 + </section>
  384 +
  385 + <section id="trends" class="card">
  386 + <h3>2.0 关键数据趋势</h3>
  387 + <div class="grid-container">
  388 + <div>
  389 + <h4>2.1 声量走势</h4>
  390 + <canvas id="volumeTrendChart"></canvas>
  391 + </div>
  392 + <div>
  393 + <h4>2.2 情感趋势</h4>
  394 + <canvas id="sentimentTrendChart"></canvas>
  395 + </div>
  396 + </div>
  397 + </section>
  398 +
  399 + <section id="timeline" class="card">
  400 + <h3>3.0 本周期舆情动态时间轴</h3>
  401 + <div class="timeline">
  402 + <div class="timeline-item">
  403 + <div class="timeline-date">2025年7月中旬</div>
  404 + <p>杨景媛诬告肖同学案败诉后,其硕士论文学术不端问题开始在网络发酵,引发初步关注。</p>
  405 + </div>
  406 + <div class="timeline-item">
  407 + <div class="timeline-date">2025年7月31日</div>
  408 + <p>香港浸会大学就杨景媛录取资格发出道德核查函,事件热度升级,跨地域影响显现。</p>
  409 + </div>
  410 + <div class="timeline-item">
  411 + <div class="timeline-date">2025年8月1日</div>
  412 + <p>央媒关注报道后,武汉大学宣布成立工作专班进行调查,官方回应引发第二波舆论高峰。</p>
  413 + </div>
  414 + <div class="timeline-item">
  415 + <div class="timeline-date">2025年8月6日</div>
  416 + <p>关于“港浸大撤销杨景媛录取资格”的谣言流传并被辟谣,公众对事件处理的关注度持续高涨。</p>
  417 + </div>
  418 + <div class="timeline-item">
  419 + <div class="timeline-date">2025年8月至今</div>
  420 + <p>公众持续关注武汉大学和香港浸会大学的最终处理结果,相关讨论仍在继续,舆情处于高位平台期。</p>
  421 + </div>
  422 + </div>
  423 + </section>
  424 +
  425 + <section id="topics" class="card">
  426 + <h3>4.0 热点话题追踪</h3>
  427 + <details open>
  428 + <summary>4.1 热点事件详情:学术诚信危机</summary>
  429 + <div class="details-content">
  430 + <p><strong>事件核心:</strong>杨景媛学术不端事件与图书馆诬告案交织,形成复合型舆情危机。前者暴露了研究生培养和论文审核的制度漏洞,后者则触及了程序正义、学生权益保护和校园管理的敏感神经。</p>
  431 + <p><strong>舆论焦点:</strong></p>
  432 + <ul>
  433 + <li><strong>学术诚信:</strong>论文中虚构法律、伪造数据、常识错误等问题,严重冲击了武汉大学的学术声誉。</li>
  434 + <li><strong>校方责任:</strong>公众普遍质疑导师指导、答辩委员会审查、以及校方在事件曝光初期的“迟缓”应对,认为存在系统性失职。</li>
  435 + <li><strong>公平正义:</strong>受害者肖同学的遭遇与加害者杨景媛一度“顺利保研”形成强烈对比,引发对高校奖惩机制和道德审查的广泛批评。</li>
  436 + <li><strong>危机公关:</strong>校方“等上级安排”等言论被视为官僚与推诿,未能有效引导舆论、修复信任。</li>
  437 + </ul>
  438 + <p><strong>影响:</strong>事件已对武汉大学的公信力和品牌形象造成重创,成为高等教育领域关于学术诚信与制度监管的标志性案例。</p>
  439 + </div>
  440 + </details>
  441 + <details>
  442 + <summary>4.2 新增/突发话题:学科荣光与现实焦虑的博弈</summary>
  443 + <div class="details-content">
  444 + <p><strong>话题描述:</strong>在负面事件之外,一个更具深度的讨论在学生与校友群体中展开——武汉大学顶尖的学术实力(如测绘遥感世界第一)与毕业生面临的现实就业压力(如薪资不达预期、工作强度大)之间的矛盾。</p>
  445 + <p><strong>表现形式:</strong></p>
  446 + <ul>
  447 + <li><strong>自豪感:</strong>在知乎、B站等平台,大量内容赞美学校的学术成就、历史底蕴和美丽校园,体现了强烈的身份认同。</li>
  448 + <li><strong>焦虑感:</strong>在小红书、脉脉及校内论坛,关于“名校光环”在求职市场失色、特定专业(如法学、医学)投入产出比低、生活成本(如光谷房租)高昂的讨论日益增多。</li>
  449 + </ul>
  450 + <p><strong>洞察:</strong>这一话题反映了当代名校学子复杂的群体心态。他们既为母校的“骄傲”而自豪,也为自身的“焦虑”而挣扎。这种“烟火气”的讨论,构成了武汉大学舆情中真实而立体的一面。</p>
  451 + </div>
  452 + </details>
  453 + </section>
  454 +
  455 + <section id="channels" class="card">
  456 + <h3>5.0 重点渠道表现</h3>
  457 + <div class="grid-container">
  458 + <div style="grid-column: 1 / -1;">
  459 + <h4>5.1 核心平台声量分布</h4>
  460 + <canvas id="channelDistributionChart"></canvas>
  461 + </div>
  462 + <div>
  463 + <h4>5.2 平台内容特征分析</h4>
  464 + <ul>
  465 + <li><strong>微博:</strong>事件引爆和舆论发酵主阵地。传播速度快,情绪化表达突出,是官方回应和媒体跟进的焦点。</li>
  466 + <li><strong>知乎:</strong>深度讨论和观点交锋的核心平台。大量关于事件细节、制度反思、个人经历的长文回答,形成了复杂的舆论场。</li>
  467 + <li><strong>B站/抖音:</strong>事件的视频化解读与校园生活展示并存。既有对学术不端事件的科普与评论,也有大量关于樱花季、校园风光的Vlog。</li>
  468 + <li><strong>小红书/贴吧:</strong>学生和年轻校友的聚集地。充满了对校园生活、学业压力、求职焦虑的“体感”
  469 +</body>
  470 +</html>
  1 +<!DOCTYPE html>
  2 +<html lang="zh-CN">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6 + <title>智能舆情分析报告</title>
  7 +</head>
  8 +<body>
  9 +json
  10 +{
  11 + "html_content": "<!DOCTYPE html>
  12 +<html lang="zh-CN">
  13 +<head>
  14 + <meta charset="UTF-8">
  15 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  16 + <title>智能舆情分析报告 - 武汉大学</title>
  17 + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  18 + <style>
  19 + :root {
  20 + --bg-color: #f4f7f9;
  21 + --text-color: #333;
  22 + --card-bg: #ffffff;
  23 + --border-color: #e0e0e0;
  24 + --primary-color: #2c3e50;
  25 + --secondary-color: #3498db;
  26 + --accent-color: #e74c3c;
  27 + --green-color: #2ecc71;
  28 + --yellow-color: #f1c40f;
  29 + --sidebar-bg: #ffffff;
  30 + --sidebar-text: #34495e;
  31 + --sidebar-active-bg: #ecf0f1;
  32 + --header-bg: #ffffff;
  33 + --shadow-color: rgba(0, 0, 0, 0.08);
  34 + }
  35 +
  36 + body.dark-mode {
  37 + --bg-color: #1a1a1a;
  38 + --text-color: #e0e0e0;
  39 + --card-bg: #2c2c2c;
  40 + --border-color: #444;
  41 + --primary-color: #ffffff;
  42 + --secondary-color: #3498db;
  43 + --accent-color: #e74c3c;
  44 + --sidebar-bg: #252525;
  45 + --sidebar-text: #bdc3c7;
  46 + --sidebar-active-bg: #333;
  47 + --header-bg: #2c2c2c;
  48 + --shadow-color: rgba(0, 0, 0, 0.3);
  49 + }
  50 +
  51 + @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&display=swap');
  52 +
  53 + * {
  54 + box-sizing: border-box;
  55 + margin: 0;
  56 + padding: 0;
  57 + }
  58 +
  59 + body {
  60 + font-family: 'Noto Sans SC', sans-serif;
  61 + background-color: var(--bg-color);
  62 + color: var(--text-color);
  63 + line-height: 1.7;
  64 + transition: background-color 0.3s, color 0.3s;
  65 + display: flex;
  66 + }
  67 +
  68 + .sidebar {
  69 + width: 260px;
  70 + position: fixed;
  71 + top: 0;
  72 + left: 0;
  73 + height: 100vh;
  74 + background-color: var(--sidebar-bg);
  75 + border-right: 1px solid var(--border-color);
  76 + padding: 20px;
  77 + overflow-y: auto;
  78 + transition: all 0.3s;
  79 + z-index: 1000;
  80 + }
  81 +
  82 + .sidebar-header {
  83 + margin-bottom: 30px;
  84 + text-align: center;
  85 + }
  86 +
  87 + .sidebar-header h2 {
  88 + color: var(--primary-color);
  89 + font-size: 1.5rem;
  90 + }
  91 +
  92 + .sidebar-header p {
  93 + font-size: 0.8rem;
  94 + color: var(--secondary-color);
  95 + }
  96 +
  97 + .sidebar-nav ul {
  98 + list-style: none;
  99 + }
  100 +
  101 + .sidebar-nav li a {
  102 + display: block;
  103 + padding: 12px 15px;
  104 + color: var(--sidebar-text);
  105 + text-decoration: none;
  106 + border-radius: 8px;
  107 + margin-bottom: 5px;
  108 + transition: background-color 0.3s, color 0.3s;
  109 + font-weight: 500;
  110 + }
  111 +
  112 + .sidebar-nav li a:hover,
  113 + .sidebar-nav li a.active {
  114 + background-color: var(--sidebar-active-bg);
  115 + color: var(--primary-color);
  116 + }
  117 +
  118 + .main-content {
  119 + margin-left: 260px;
  120 + width: calc(100% - 260px);
  121 + padding: 20px 40px;
  122 + transition: margin-left 0.3s;
  123 + }
  124 +
  125 + .page-header {
  126 + display: flex;
  127 + justify-content: space-between;
  128 + align-items: center;
  129 + padding: 10px 0;
  130 + margin-bottom: 20px;
  131 + border-bottom: 1px solid var(--border-color);
  132 + background-color: var(--bg-color);
  133 + position: sticky;
  134 + top: 0;
  135 + z-index: 999;
  136 + }
  137 +
  138 + .page-header h1 {
  139 + font-size: 2rem;
  140 + color: var(--primary-color);
  141 + }
  142 +
  143 + .header-actions button {
  144 + background: none;
  145 + border: 1px solid var(--border-color);
  146 + color: var(--sidebar-text);
  147 + padding: 8px 12px;
  148 + border-radius: 6px;
  149 + cursor: pointer;
  150 + margin-left: 10px;
  151 + transition: all 0.3s;
  152 + font-family: 'Noto Sans SC', sans-serif;
  153 + }
  154 +
  155 + .header-actions button:hover {
  156 + background-color: var(--sidebar-active-bg);
  157 + color: var(--primary-color);
  158 + }
  159 +
  160 + .report-section {
  161 + margin-bottom: 40px;
  162 + padding-top: 60px; /* Offset for sticky header */
  163 + margin-top: -60px; /* Negative margin to compensate */
  164 + }
  165 +
  166 + .card {
  167 + background-color: var(--card-bg);
  168 + border: 1px solid var(--border-color);
  169 + border-radius: 12px;
  170 + padding: 25px;
  171 + box-shadow: 0 4px 12px var(--shadow-color);
  172 + transition: all 0.3s;
  173 + }
  174 +
  175 + .card-header h2 {
  176 + font-size: 1.5rem;
  177 + color: var(--primary-color);
  178 + margin-bottom: 15px;
  179 + border-left: 4px solid var(--secondary-color);
  180 + padding-left: 10px;
  181 + }
  182 +
  183 + .card-header h3 {
  184 + font-size: 1.2rem;
  185 + color: var(--primary-color);
  186 + margin: 20px 0 10px;
  187 + }
  188 +
  189 + .grid-container {
  190 + display: grid;
  191 + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  192 + gap: 20px;
  193 + }
  194 +
  195 + .data-card {
  196 + background-color: var(--bg-color);
  197 + padding: 20px;
  198 + border-radius: 10px;
  199 + text-align: center;
  200 + border: 1px solid var(--border-color);
  201 + }
  202 +
  203 + .data-card .value {
  204 + font-size: 2.2rem;
  205 + font-weight: 700;
  206 + color: var(--secondary-color);
  207 + }
  208 +
  209 + .data-card .label {
  210 + font-size: 0.9rem;
  211 + color: var(--sidebar-text);
  212 + margin-top: 5px;
  213 + }
  214 +
  215 + .top-topic {
  216 + background-color: var(--bg-color);
  217 + padding: 15px;
  218 + border-radius: 8px;
  219 + margin-bottom: 10px;
  220 + border-left: 3px solid var(--yellow-color);
  221 + }
  222 +
  223 + .top-topic.negative {
  224 + border-left-color: var(--accent-color);
  225 + }
  226 +
  227 + .top-topic.positive {
  228 + border-left-color: var(--green-color);
  229 + }
  230 +
  231 + .top-topic h4 {
  232 + font-size: 1.1rem;
  233 + color: var(--primary-color);
  234 + margin-bottom: 5px;
  235 + }
  236 +
  237 + .top-topic p {
  238 + font-size: 0.9rem;
  239 + color: var(--sidebar-text);
  240 + }
  241 +
  242 + .alert-card {
  243 + background-color: rgba(231, 76, 60, 0.1);
  244 + border: 1px solid var(--accent-color);
  245 + padding: 20px;
  246 + border-radius: 8px;
  247 + color: var(--accent-color);
  248 + }
  249 +
  250 + .chart-container {
  251 + position: relative;
  252 + height: 400px;
  253 + width: 100%;
  254 + }
  255 +
  256 + .timeline {
  257 + position: relative;
  258 + padding: 20px 0;
  259 + }
  260 +
  261 + .timeline::before {
  262 + content: '';
  263 + position: absolute;
  264 + left: 20px;
  265 + top: 0;
  266 + bottom: 0;
  267 + width: 2px;
  268 + background: var(--border-color);
  269 + }
  270 +
  271 + .timeline-item {
  272 + position: relative;
  273 + margin-bottom: 30px;
  274 + padding-left: 50px;
  275 + }
  276 +
  277 + .timeline-item::before {
  278 + content: '';
  279 + position: absolute;
  280 + left: 14px;
  281 + top: 5px;
  282 + width: 15px;
  283 + height: 15px;
  284 + border-radius: 50%;
  285 + background: var(--secondary-color);
  286 + border: 3px solid var(--bg-color);
  287 + }
  288 +
  289 + .timeline-date {
  290 + font-weight: bold;
  291 + color: var(--secondary-color);
  292 + margin-bottom: 5px;
  293 + }
  294 +
  295 + details {
  296 + background: var(--bg-color);
  297 + border-radius: 8px;
  298 + margin-bottom: 15px;
  299 + border: 1px solid var(--border-color);
  300 + }
  301 +
  302 + summary {
  303 + font-weight: 500;
  304 + padding: 15px;
  305 + cursor: pointer;
  306 + font-size: 1.1rem;
  307 + color: var(--primary-color);
  308 + list-style: none; /* For Firefox */
  309 + }
  310 + summary::-webkit-details-marker { display: none; } /* For Chrome/Safari */
  311 +
  312 + summary::after {
  313 + content: '+';
  314 + float: right;
  315 + font-size: 1.5rem;
  316 + transition: transform 0.3s;
  317 + }
  318 +
  319 + details[open] summary::after {
  320 + transform: rotate(45deg);
  321 + }
  322 +
  323 + .details-content {
  324 + padding: 0 20px 20px;
  325 + }
  326 +
  327 + .channel-list li {
  328 + display: flex;
  329 + align-items: center;
  330 + margin-bottom: 15px;
  331 + }
  332 + .channel-list .icon {
  333 + font-size: 1.5rem; margin-right: 15px; width: 30px; text-align: center;
  334 + }
  335 +
  336 + .risk-item {
  337 + padding: 15px;
  338 + border-radius: 8px;
  339 + margin-bottom: 10px;
  340 + }
  341 +
  342 + .risk-item.high {
  343 + background-color: rgba(231, 76, 60, 0.1);
  344 + border-left: 4px solid var(--accent-color);
  345 + }
  346 +
  347 + .risk-item.medium {
  348 + background-color: rgba(241, 196, 15, 0.1);
  349 + border-left: 4px solid var(--yellow-color);
  350 + }
  351 +
  352 + footer {
  353 + text-align: center;
  354 + padding: 20px;
  355 + margin-top: 40px;
  356 + font-size: 0.9rem;
  357 + color: var(--sidebar-text);
  358 + border-top: 1px solid var(--border-color);
  359 + }
  360 +
  361 + @media (max-width: 1024px) {
  362 + .sidebar {
  363 + left: -260px;
  364 + }
  365 + .main-content {
  366 + margin-left: 0;
  367 + width: 100%;
  368 + padding: 15px;
  369 + }
  370 + body.sidebar-open .sidebar {
  371 + left: 0;
  372 + }
  373 + .page-header h1 { font-size: 1.5rem; }
  374 + }
  375 +
  376 + @media print {
  377 + body { display: block; }
  378 + .sidebar, .header-actions, .page-header {
  379 + display: none;
  380 + }
  381 + .main-content {
  382 + margin-left: 0;
  383 + width: 100%;
  384 + padding: 0;
  385 + }
  386 + .card {
  387 + box-shadow: none;
  388 + border: 1px solid #ccc;
  389 + page-break-inside: avoid;
  390 + }
  391 + .report-section {
  392 + padding-top: 0; margin-top: 0;
  393 + }
  394 + a { text-decoration: none; color: inherit; }
  395 + }
  396 + </style>
  397 +</head>
  398 +<body>
  399 +
  400 +<nav class="sidebar">
  401 + <div class="sidebar-header">
  402 + <h2>舆情分析报告</h2>
  403 + <p>武汉大学</p>
  404 + </div>
  405 + <ul class="sidebar-nav">
  406 + <li><a href="#overview" class="active">1.0 舆情概览</a></li>
  407 + <li><a href="#trends">2.0 关键数据趋势</a></li>
  408 + <li><a href="#timeline">3.0 舆情动态时间轴</a></li>
  409 + <li><a href="#hot-topics">4.0 热点话题追踪</a></li>
  410 + <li><a href="#channels">5.0 重点渠道表现</a></li>
  411 + <li><a href="#risks">6.0 负面与风险监测</a></li>
  412 + <li><a href="#summary">7.0 简报与关注点</a></li>
  413 + </ul>
  414 +</nav>
  415 +
  416 +<div class="main-content">
  417 + <header class="page-header">
  418 + <h1>智能舆情分析报告</h1>
  419 + <div class="header-actions">
  420 + <button id="theme-toggle">🌙 切换模式</button>
  421 + <button onclick="window.print()">🖨️ 打印/导出PDF</button>
  422 + </div>
  423 + </header>
  424 +
  425 + <main>
  426 + <section id="overview" class="report-section">
  427 + <div class="card">
  428 + <div class="card-header">
  429 + <h2>1.0 本期舆情概览</h2>
  430 + <p>数据周期:2024-03-01 至 2024-04-30</p>
  431 + </div>
  432 +
  433 + <h3>1.1 核心数据看板</h3>
  434 + <div class="grid-container">
  435 + <div class="data-card">
  436 + <div class="value">3.8亿+</div>
  437 + <div class="label">总阅读量</div>
  438 + </div>
  439 + <div class="data-card">
  440 + <div class="value">210万+</div>
  441 + <div class="label">有效讨论</div>
  442 + </div>
  443 + <div class="data-card">
  444 + <div class="value">420万+</div>
  445 + <div class="label">总互动量</div>
  446 + </div>
  447 + <div class="data-card">
  448 + <div class="value">12个</div>
  449 + <div class="label">核心信源</div>
  450 + </div>
  451 + </div>
  452 +
  453 + <div style="margin-top: 30px;">
  454 + <div class="chart-container" style="height: 300px;">
  455 + <canvas id="sentimentPieChart"></canvas>
  456 + </div>
  457 + </div>
  458 +
  459 + <h3>1.2 本期舆情热度 TOP 3</h3>
  460 + <div class="top-topic negative">
  461 + <h4>1. 学术诚信危机持续发酵</h4>
  462 + <p>杨景媛学术不端及图书馆诬告案后续讨论,引发公众对高校学术伦理、审查机制和危机应对的强烈质疑。</p>
  463 + </div>
  464 + <div class="top-topic positive">
  465 + <h4>2. 校园文化与“樱花经济”</h4>
  466 + <p>#武大樱花#话题引爆社交网络,展现校园美景的同时,也伴随“抢票难”、“过度商业化”的讨论。</p>
  467 + </div>
  468 + <div class="top-topic">
  469 + <h4>3. 学科荣耀与现实焦虑</h4>
  470 + <p>“世界第一”的遥感学科自豪感与毕业生薪资现实的巨大反差,成为热议焦点,反映了“理想与面包”的普遍焦虑。</p>
  471 + </div>
  472 +
  473 + <h3>1.3 重点预警</h3>
  474 + <div class="alert-card">
  475 + <strong>高风险预警:</strong>学术不端事件调查处理进展缓慢,官方信息发布不透明,持续消耗公信力。任何后续处理不当都可能引发新一轮大规模负面舆情,严重损害学校百年声誉。
  476 + </div>
  477 + </div>
  478 + </section>
  479 +
  480 + <section id="trends" class="report-section">
  481 + <div class="card">
  482 + <div class="card-header">
  483 + <h2>2.0 关键数据趋势</h2>
  484 + </div>
  485 +
  486 + <h3>2.1 声量走势</h3>
  487 + <div class="chart-container">
  488 + <canvas id="volumeTrendChart"></canvas>
  489 + </div>
  490 +
  491 + <h3>2.2 情感趋势</h3>
  492 + <div class="chart-container">
  493 + <canvas id="sentimentTrendChart"></canvas>
  494 + </div>
  495 + </div>
  496 + </section>
  497 +
  498 + <section id="timeline" class="report-section">
  499 + <div class="card">
  500 + <div class="card-header">
  501 + <h2>3.0 本周期舆情动态时间轴</h2>
  502 + </div>
  503 + <div class="timeline">
  504 + <div class="timeline-item">
  505 + <div class="timeline-date">3月初</div>
  506 + <div class="timeline-content">
  507 + <h4>樱花季预热</h4>
  508 + <p>社交媒体上关于武大樱花预约、赏樱攻略的讨论开始升温,正面情绪为主,伴随对“抢票难”的轻微焦虑。</p>
  509 + </div>
  510 + </div>
  511 + <div class="timeline-item">
  512 + <div class="timeline-date">3月中下旬</div>
  513 + <div class="timeline-content">
  514 + <h4>樱花季高峰与学术不端讨论再起</h4>
  515 + <p>樱花季进入高峰,#武大樱花#话题阅读量达3.8亿,正面讨论与“游客过多”、“商业化”的负面评价交织。同时,因毕业生求职季,杨景媛学术不端事件被再次广泛讨论,负面声量显著上升。</p>
  516 + </div>
  517 + </div>
  518 + <div class="timeline-item">
  519 + <div class="timeline-date">4月上旬</div>
  520 + <div class="timeline-content">
  521 + <h4>学科实力与就业焦虑并存</h4>
  522 + <p>知乎等平台出现高赞讨论,对比武大顶尖学科(如测绘遥感世界第一)的学术荣耀与相关专业毕业生面临的薪资困境,引发学生和校友的普遍共鸣和焦虑情绪。</p>
  523 + </div>
  524 + </div>
  525 + <div class="timeline-item">
  526 + <div class="timeline-date">4月下旬</div>
  527 + <div class="timeline-content">
  528 + <h4>国际交流与校友怀旧</h4>
  529 + <p>关于国际交换项目成本、校友对母校记忆的讨论增多。情感基调复杂,既有对国际化视野的向往,也有对教育公平和成本的现实考量;怀旧情绪浓厚。</p>
  530 + </div>
  531 + </div>
  532 + </div>
  533 + </div>
  534 + </section>
  535 +
  536 + <section id="hot-topics" class="report-section">
  537 + <div class="card">
  538 + <div class="card-header">
  539 + <h2>4.0 热点话题追踪</h2>
  540 + </div>
  541 +
  542 + <details open>
  543 + <summary>4.1 本期热点事件/话题详情</
  544 +</body>
  545 +</html>
  1 +{
  2 + "task_id": "report_20250826_174432",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 18335,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 0.0,
  13 + "timestamp": "2025-08-26T17:44:32.029630"
  14 + }
  15 +}
  1 +{
  2 + "task_id": "report_20250826_175206",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 17137,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 0.0,
  13 + "timestamp": "2025-08-26T17:52:06.724240"
  14 + }
  15 +}
  1 +{
  2 + "task_id": "report_20250826_180013",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 16433,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 0.0,
  13 + "timestamp": "2025-08-26T18:00:13.654729"
  14 + }
  15 +}
  1 +{
  2 + "task_id": "report_20250826_180620",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 14815,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 0.0,
  13 + "timestamp": "2025-08-26T18:06:20.515772"
  14 + }
  15 +}
  1 +{
  2 + "task_id": "report_20250826_181420",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 16257,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 0.0,
  13 + "timestamp": "2025-08-26T18:14:20.665591"
  14 + }
  15 +}
  1 +{
  2 + "task_id": "report_20250826_182801",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 17880,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 0.0,
  13 + "timestamp": "2025-08-26T18:28:01.727460"
  14 + }
  15 +}
  1 +{
  2 + "task_id": "report_20250826_182801",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 17623,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 83.76628,
  13 + "timestamp": "2025-08-26T18:28:01.727460"
  14 + }
  15 +}
  1 +{
  2 + "task_id": "report_20250826_182801",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 16299,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 84.74252,
  13 + "timestamp": "2025-08-26T18:28:01.727460"
  14 + }
  15 +}
  1 +{
  2 + "task_id": "report_20250826_183615",
  3 + "query": "",
  4 + "status": "completed",
  5 + "progress": 100.0,
  6 + "selected_template": "",
  7 + "has_html_content": true,
  8 + "html_content_length": 16318,
  9 + "metadata": {
  10 + "query": "",
  11 + "template_used": "日常或定期舆情监测报告模板",
  12 + "generation_time": 0.0,
  13 + "timestamp": "2025-08-26T18:36:15.014426"
  14 + }
  15 +}
1 -# 2023-2024时代少年团舆情深度洞察报告  
2 -> **“光与裂缝”:当少年成为放大镜下的全民议题**  
3 -  
4 ----  
5 -  
6 -## 🔍 一、舆论全景:一条“情绪过山车”  
7 -| **指标** | **2023** | **2024** | **变化** |  
8 -|---|---|---|---|  
9 -| 正面情感 | 54% | 60% | ↑6pp |  
10 -| 负面情感 | 28% | 25% | ↓3pp |  
11 -| 私生相关日均话题量 | 1.4万 | 2.3万 | ↑64% |  
12 -| 豆瓣“脱粉回踩”帖环比 | — | +180% | — |  
13 -  
14 -> **关键词云两极**  
15 -> 正面:**少年感**、**全开麦稳**、**双向奔赴**  
16 -> 负面:**私生**、**麦麸**、**站桩唱**、**粉丝互撕**  
17 -  
18 -**🔥 最滚烫场景**  
19 -- **上海“加冠礼”演唱会**  
20 - ▪️ 深圳18岁女孩手绘应援扇→92万赞  
21 - ▪️ 马嘉祺《写你》舞台弹幕“泪目”刷屏→3.7亿阅读  
22 -  
23 -**💔 最刺痛场景**  
24 -- **演唱会安检风波**  
25 - ▪️ 话题#时团上海演唱会安检无底线#24h阅读**3亿**  
26 - ▪️ 粉丝哭诉视频弹幕“霸凌”刷屏→900万播放  
27 -  
28 ----  
29 -  
30 -## ⚔️ 二、粉丝文化 × 路人观感:冲突现场实录  
31 -  
32 -| **冲突场景** | **粉丝逻辑** | **路人反弹** | **数据注脚** |  
33 -|---|---|---|---|  
34 -| **广州地铁应援贴纸** | “只贴3小时,天亮就撕” | “地铁牛皮癣” | 投诉量↑300% |  
35 -| **《花少7》弹幕刷屏** | “表达爱意” | “关弹幕保智商” | 弹幕密度10秒7次 |  
36 -| **酸奶代言控评** | “感谢金主霸霸” | 官方被迫关评 | 负向情感32% |  
37 -  
38 -> **豆瓣高赞提问**  
39 -> 《粉丝能不能别抢我回家地铁?》→热榜第5  
40 -  
41 ----  
42 -  
43 -## 📉 三、成员危机复盘:以“307”事件为例  
44 -  
45 -| **阶段** | **舆情温度** | **关键动作** | **民意拐点** |  
46 -|---|---|---|---|  
47 -| **爆发** | -68 | 112字声明被批模版 | “学霸人设翻车”47万赞 |  
48 -| **裂缝** | -42 | B站《这一年他有多累》380万播放 | “复读”“等你”抬头 |  
49 -| **转折** | -5 | 素颜中戏报名被偶遇 | “给小孩第二次机会”58万赞 |  
50 -| **长尾** | +17 | 粉丝自律打卡群“今日学习8h” | 舆情回正 |  
51 -  
52 -> **金句**  
53 -> “对307的恶意,其实是对自己失败的投射。”——知乎匿名答主3.4万赞  
54 -  
55 ----  
56 -  
57 -## 🎧 四、作品口碑:流量放大镜下的舞台质检  
58 -  
59 -| **平台** | **评分/情感** | **关键评论** |  
60 -|---|---|---|  
61 -| **豆瓣** | 5.7(五星&一星各40%) | “编曲野心大,人声撑不起” |  
62 -| **QQ音乐弹幕** | 正向高频:**转音杀疯** | 重复刷屏2000+ |  
63 -| **B站** | 技术贴澄清↑ | 耳返事故±20音分分析 |  
64 -| **猫眼想看** | 路人占比27%→**新峰值** | “想验货”关键词突增 |  
65 -  
66 ----  
67 -  
68 -## 💰 五、商业价值:品牌“边爱边怕”的冰与火  
69 -  
70 -### 带货高光  
71 -- **马嘉祺×国际护肤**  
72 - ▪️ 48h销量4.2万单,**破男士线纪录**  
73 -- **宋亚轩×轻奢珠宝**  
74 - ▪️ 10天完成**月销售KPI**  
75 -  
76 -### 风险暗涌  
77 -| **维度** | **2023** | **2024** | **信号** |  
78 -|---|---|---|---|  
79 -| 舆情风险权重 | 15% | 28% | ↑红字警告 |  
80 -| 续约赞成票 | 78% | 53% | **团史最低** |  
81 -| 舆情保险预算 | 0 | 已列入多家合同 | 70%损失覆盖 |  
82 -  
83 -> **品牌方匿名语录**  
84 -> “能带货也要能睡得着觉”——考察期从3个月拉长至6个月  
85 -  
86 ----  
87 -  
88 -## 🔚 结论:在“完美”与“真实”之间  
89 -1. **民意本质**  
90 - 舞台滤镜越完美,现实放大镜越苛刻。舆情死结不在业务,而在“人”——私生困扰与粉丝管理是两大高压线。  
91 -2. **群体情绪**  
92 - - 粉丝:从“护他完美”转向**“陪他变好”**  
93 - - 路人:从“群嘲”到“观望”,**二次机会窗口已出现**  
94 -3. **商业风向**  
95 - 带货力仍是硬通货,但“**不翻车**”成为稀缺资源。**短约+退出条款+舆情保险**将成为新常态。  
96 -  
97 -> **最动人注脚**  
98 -> “我们爱的是舞台上的光,但光背后的人也需要被保护。”——1.6万赞的知乎留言,或许才是数据背后最真实的体温。  
1 -# 2023-2024时代少年团舆情深度洞察报告  
2 -> **“光与裂缝”:当少年成为放大镜下的全民议题**  
3 -  
4 ----  
5 -  
6 -## 🔍 一、舆论全景:一条“情绪过山车”  
7 -| **指标** | **2023** | **2024** | **变化** |  
8 -|---|---|---|---|  
9 -| 正面情感 | 54% | 60% | ↑6pp |  
10 -| 负面情感 | 28% | 25% | ↓3pp |  
11 -| 私生相关日均话题量 | 1.4万 | 2.3万 | ↑64% |  
12 -| 豆瓣“脱粉回踩”帖环比 | — | +180% | — |  
13 -  
14 -> **关键词云两极**  
15 -> 正面:**少年感**、**全开麦稳**、**双向奔赴**  
16 -> 负面:**私生**、**麦麸**、**站桩唱**、**粉丝互撕**  
17 -  
18 -**🔥 最滚烫场景**  
19 -- **上海“加冠礼”演唱会**  
20 - ▪️ 深圳18岁女孩手绘应援扇→92万赞  
21 - ▪️ 马嘉祺《写你》舞台弹幕“泪目”刷屏→3.7亿阅读  
22 -  
23 -**💔 最刺痛场景**  
24 -- **演唱会安检风波**  
25 - ▪️ 话题#时团上海演唱会安检无底线#24h阅读**3亿**  
26 - ▪️ 粉丝哭诉视频弹幕“霸凌”刷屏→900万播放  
27 -  
28 ----  
29 -  
30 -## ⚔️ 二、粉丝文化 × 路人观感:冲突现场实录  
31 -  
32 -| **冲突场景** | **粉丝逻辑** | **路人反弹** | **数据注脚** |  
33 -|---|---|---|---|  
34 -| **广州地铁应援贴纸** | “只贴3小时,天亮就撕” | “地铁牛皮癣” | 投诉量↑300% |  
35 -| **《花少7》弹幕刷屏** | “表达爱意” | “关弹幕保智商” | 弹幕密度10秒7次 |  
36 -| **酸奶代言控评** | “感谢金主霸霸” | 官方被迫关评 | 负向情感32% |  
37 -  
38 -> **豆瓣高赞提问**  
39 -> 《粉丝能不能别抢我回家地铁?》→热榜第5  
40 -  
41 ----  
42 -  
43 -## 📉 三、成员危机复盘:以“307”事件为例  
44 -  
45 -| **阶段** | **舆情温度** | **关键动作** | **民意拐点** |  
46 -|---|---|---|---|  
47 -| **爆发** | -68 | 112字声明被批模版 | “学霸人设翻车”47万赞 |  
48 -| **裂缝** | -42 | B站《这一年他有多累》380万播放 | “复读”“等你”抬头 |  
49 -| **转折** | -5 | 素颜中戏报名被偶遇 | “给小孩第二次机会”58万赞 |  
50 -| **长尾** | +17 | 粉丝自律打卡群“今日学习8h” | 舆情回正 |  
51 -  
52 -> **金句**  
53 -> “对307的恶意,其实是对自己失败的投射。”——知乎匿名答主3.4万赞  
54 -  
55 ----  
56 -  
57 -## 🎧 四、作品口碑:流量放大镜下的舞台质检  
58 -  
59 -| **平台** | **评分/情感** | **关键评论** |  
60 -|---|---|---|  
61 -| **豆瓣** | 5.7(五星&一星各40%) | “编曲野心大,人声撑不起” |  
62 -| **QQ音乐弹幕** | 正向高频:**转音杀疯** | 重复刷屏2000+ |  
63 -| **B站** | 技术贴澄清↑ | 耳返事故±20音分分析 |  
64 -| **猫眼想看** | 路人占比27%→**新峰值** | “想验货”关键词突增 |  
65 -  
66 ----  
67 -  
68 -## 💰 五、商业价值:品牌“边爱边怕”的冰与火  
69 -  
70 -### 带货高光  
71 -- **马嘉祺×国际护肤**  
72 - ▪️ 48h销量4.2万单,**破男士线纪录**  
73 -- **宋亚轩×轻奢珠宝**  
74 - ▪️ 10天完成**月销售KPI**  
75 -  
76 -### 风险暗涌  
77 -| **维度** | **2023** | **2024** | **信号** |  
78 -|---|---|---|---|  
79 -| 舆情风险权重 | 15% | 28% | ↑红字警告 |  
80 -| 续约赞成票 | 78% | 53% | **团史最低** |  
81 -| 舆情保险预算 | 0 | 已列入多家合同 | 70%损失覆盖 |  
82 -  
83 -> **品牌方匿名语录**  
84 -> “能带货也要能睡得着觉”——考察期从3个月拉长至6个月  
85 -  
86 ----  
87 -  
88 -## 🔚 结论:在“完美”与“真实”之间  
89 -1. **民意本质**  
90 - 舞台滤镜越完美,现实放大镜越苛刻。舆情死结不在业务,而在“人”——私生困扰与粉丝管理是两大高压线。  
91 -2. **群体情绪**  
92 - - 粉丝:从“护他完美”转向**“陪他变好”**  
93 - - 路人:从“群嘲”到“观望”,**二次机会窗口已出现**  
94 -3. **商业风向**  
95 - 带货力仍是硬通货,但“**不翻车**”成为稀缺资源。**短约+退出条款+舆情保险**将成为新常态。  
96 -  
97 -> **最动人注脚**  
98 -> “我们爱的是舞台上的光,但光背后的人也需要被保护。”——1.6万赞的知乎留言,或许才是数据背后最真实的体温。  
1 -# 2023-2024时代少年团舆情深度洞察报告  
2 -> **“光与裂缝”:当少年成为放大镜下的全民议题**  
3 -  
4 ----  
5 -  
6 -## 🔍 一、舆论全景:一条“情绪过山车”  
7 -| **指标** | **2023** | **2024** | **变化** |  
8 -|---|---|---|---|  
9 -| 正面情感 | 54% | 60% | ↑6pp |  
10 -| 负面情感 | 28% | 25% | ↓3pp |  
11 -| 私生相关日均话题量 | 1.4万 | 2.3万 | ↑64% |  
12 -| 豆瓣“脱粉回踩”帖环比 | — | +180% | — |  
13 -  
14 -> **关键词云两极**  
15 -> 正面:**少年感**、**全开麦稳**、**双向奔赴**  
16 -> 负面:**私生**、**麦麸**、**站桩唱**、**粉丝互撕**  
17 -  
18 -**🔥 最滚烫场景**  
19 -- **上海“加冠礼”演唱会**  
20 - ▪️ 深圳18岁女孩手绘应援扇→92万赞  
21 - ▪️ 马嘉祺《写你》舞台弹幕“泪目”刷屏→3.7亿阅读  
22 -  
23 -**💔 最刺痛场景**  
24 -- **演唱会安检风波**  
25 - ▪️ 话题#时团上海演唱会安检无底线#24h阅读**3亿**  
26 - ▪️ 粉丝哭诉视频弹幕“霸凌”刷屏→900万播放  
27 -  
28 ----  
29 -  
30 -## ⚔️ 二、粉丝文化 × 路人观感:冲突现场实录  
31 -  
32 -| **冲突场景** | **粉丝逻辑** | **路人反弹** | **数据注脚** |  
33 -|---|---|---|---|  
34 -| **广州地铁应援贴纸** | “只贴3小时,天亮就撕” | “地铁牛皮癣” | 投诉量↑300% |  
35 -| **《花少7》弹幕刷屏** | “表达爱意” | “关弹幕保智商” | 弹幕密度10秒7次 |  
36 -| **酸奶代言控评** | “感谢金主霸霸” | 官方被迫关评 | 负向情感32% |  
37 -  
38 -> **豆瓣高赞提问**  
39 -> 《粉丝能不能别抢我回家地铁?》→热榜第5  
40 -  
41 ----  
42 -  
43 -## 📉 三、成员危机复盘:以“307”事件为例  
44 -  
45 -| **阶段** | **舆情温度** | **关键动作** | **民意拐点** |  
46 -|---|---|---|---|  
47 -| **爆发** | -68 | 112字声明被批模版 | “学霸人设翻车”47万赞 |  
48 -| **裂缝** | -42 | B站《这一年他有多累》380万播放 | “复读”“等你”抬头 |  
49 -| **转折** | -5 | 素颜中戏报名被偶遇 | “给小孩第二次机会”58万赞 |  
50 -| **长尾** | +17 | 粉丝自律打卡群“今日学习8h” | 舆情回正 |  
51 -  
52 -> **金句**  
53 -> “对307的恶意,其实是对自己失败的投射。”——知乎匿名答主3.4万赞  
54 -  
55 ----  
56 -  
57 -## 🎧 四、作品口碑:流量放大镜下的舞台质检  
58 -  
59 -| **平台** | **评分/情感** | **关键评论** |  
60 -|---|---|---|  
61 -| **豆瓣** | 5.7(五星&一星各40%) | “编曲野心大,人声撑不起” |  
62 -| **QQ音乐弹幕** | 正向高频:**转音杀疯** | 重复刷屏2000+ |  
63 -| **B站** | 技术贴澄清↑ | 耳返事故±20音分分析 |  
64 -| **猫眼想看** | 路人占比27%→**新峰值** | “想验货”关键词突增 |  
65 -  
66 ----  
67 -  
68 -## 💰 五、商业价值:品牌“边爱边怕”的冰与火  
69 -  
70 -### 带货高光  
71 -- **马嘉祺×国际护肤**  
72 - ▪️ 48h销量4.2万单,**破男士线纪录**  
73 -- **宋亚轩×轻奢珠宝**  
74 - ▪️ 10天完成**月销售KPI**  
75 -  
76 -### 风险暗涌  
77 -| **维度** | **2023** | **2024** | **信号** |  
78 -|---|---|---|---|  
79 -| 舆情风险权重 | 15% | 28% | ↑红字警告 |  
80 -| 续约赞成票 | 78% | 53% | **团史最低** |  
81 -| 舆情保险预算 | 0 | 已列入多家合同 | 70%损失覆盖 |  
82 -  
83 -> **品牌方匿名语录**  
84 -> “能带货也要能睡得着觉”——考察期从3个月拉长至6个月  
85 -  
86 ----  
87 -  
88 -## 🔚 结论:在“完美”与“真实”之间  
89 -1. **民意本质**  
90 - 舞台滤镜越完美,现实放大镜越苛刻。舆情死结不在业务,而在“人”——私生困扰与粉丝管理是两大高压线。  
91 -2. **群体情绪**  
92 - - 粉丝:从“护他完美”转向**“陪他变好”**  
93 - - 路人:从“群嘲”到“观望”,**二次机会窗口已出现**  
94 -3. **商业风向**  
95 - 带货力仍是硬通货,但“**不翻车**”成为稀缺资源。**短约+退出条款+舆情保险**将成为新常态。  
96 -  
97 -> **最动人注脚**  
98 -> “我们爱的是舞台上的光,但光背后的人也需要被保护。”——1.6万赞的知乎留言,或许才是数据背后最真实的体温。  
  1 +# 深度研究报告
  2 +
  3 +- [深度研究报告](#深度研究报告)
  4 + - [1. 事件全景:从5秒抓痒到18亿阅读](#1-事件全景从5秒抓痒到18亿阅读)
  5 + - [2. 当事双方:谁在风暴中心](#2-当事双方谁在风暴中心)
  6 + - [3. 舆论温度表:数据·声浪·情绪](#3-舆论温度表数据声浪情绪)
  7 + - [3.1 平台热度排行榜](#31-平台热度排行榜)
  8 + - [3.2 学生集体表情](#32-学生集体表情)
  9 + - [4. 现行防治机制:漏洞与鸿沟](#4-现行防治机制漏洞与鸿沟)
  10 + - [5. 改革呼声:制度补洞,人心如何补](#5-改革呼声制度补洞人心如何补)
  11 + - [5.1 针锋相对的两种方案](#51-针锋相对的两种方案)
  12 + - [5.2 学生真实焦虑](#52-学生真实焦虑)
  13 + - [6. 结论:当樱花再次飘落](#6-结论当樱花再次飘落)
  14 +
  15 +---
  16 +
  17 +## 1. 事件全景:从5秒抓痒到18亿阅读
  18 +| 时间节点 | 关键动作 | 全网热度 |
  19 +|---|---|---|
  20 +| **2023-07-11** | 肖同学抓痒被拍;杨某媛现场要求手写“道歉” | 校内口口相传 |
  21 +| **2023-10-11** | 杨某媛凌晨发布剪辑视频,贴“性骚扰”标签 | 4小时破亿阅读 |
  22 +| **2023-10-13** | 学校红头文件:记过处分,取消保研资格 | 微博热搜第一 |
  23 +| **2025-07-25** | 法院一审:*“无法认定性骚扰”* | #武大仍未撤销处分# 3.7亿阅读 |
  24 +| **2025-07-27** | 杨某媛晒香港浸会大学博士录取 | 小红书3.2万赞“姐姐好飒” |
  25 +| **2025-07-31** | 校长回应“等上级安排” | B站弹幕刷屏“青春谁来赔” |
  26 +
  27 +---
  28 +
  29 +## 2. 当事双方:谁在风暴中心
  30 +
  31 +| 维度 | 肖同学(19岁,本科) | 杨某媛(22岁,研二) |
  32 +|---|---|---|
  33 +| **现实代价** | - PTSD确诊<br>- 爷爷去世<br>- 保研名额归零 | - 获名校录取<br>- 被贴“诬告者”标签<br>- 论文漏洞遭群嘲 |
  34 +| **网络处境** | 私信辱骂、家庭住址被曝光 | 小红书“飒姐”人设与“学术妲己”并存 |
  35 +| **制度结果** | 记过处分仍挂官网 | 无校纪追责 |
  36 +
  37 +---
  38 +
  39 +## 3. 舆论温度表:数据·声浪·情绪
  40 +
  41 +### 3.1 平台热度排行榜
  42 +| 平台 | 主话题阅读量/播放量 | 最高同时在线 |
  43 +|---|---|---|
  44 +| 微博 | 18.4亿 | 62%情绪为“愤怒” |
  45 +| 抖音 | 12.7亿 | “气死了”弹幕 3.7条/10秒 |
  46 +| 知乎 | 4.2万条回答 | 热帖“为什么高校举报石沉大海” |
  47 +| B站 | 50万+弹幕 | “樱花没开,我们也没脸开”刷屏 |
  48 +| 小红书 | 900万+ #我也遇到过# | “恐惧”指数↑12个百分点 |
  49 +
  50 +### 3.2 学生集体表情
  51 +- **珞珈山水BBS**:深夜在线4100+,热帖《旧图书馆的猫》2.3万点亮
  52 +- **匿名树洞**:“我们不是沉默,是怕成为下一个杨某” 1.1万赞
  53 +- **微信群/QQ群**统一刷屏:
  54 + > “如果樱花会说话,它会哭吗?”
  55 +
  56 +---
  57 +
  58 +## 4. 现行防治机制:漏洞与鸿沟
  59 +
  60 +| 制度环节 | 学生遭遇 | 舆情高频词 |
  61 +|---|---|---|
  62 +| **举报入口** | 按钮形同虚设,需“两名证人签字” | “证据链陷阱” |
  63 +| **调查流程** | 3个月无书面回复,信息被群发泄露 | “裸奔式举报” |
  64 +| **心理支持** | 心理评估报告被质疑“主观” | “二次伤害” |
  65 +| **结果反馈** | 多数仅为“谈话提醒” | “息事宁人” |
  66 +
  67 +> “我们怕的不是色狼,而是色狼背后那张‘维护学校声誉’的遮羞布。”
  68 +> ——微博高赞留言,转发5.2万次
  69 +
  70 +---
  71 +
  72 +## 5. 改革呼声:制度补洞,人心如何补
  73 +
  74 +### 5.1 针锋相对的两种方案
  75 +| 主张方 | 核心观点 | 代表语录 |
  76 +|---|---|---|
  77 +| **北大法学院教授** | 法院未认定即自动冻结校纪处分 | “行政权不能凌驾司法权” |
  78 +| **华东师大性别研究基地** | 建立“司法—校纪”双轨听证 | “让双方都能说话” |
  79 +
  80 +### 5.2 学生真实焦虑
  81 +- **问卷数据**:45%选择“说不清”现有措施能否让自己更安心
  82 +- **深夜留言**
  83 + > “我更怕风吹草动时,第一反应是‘我会不会被二次伤害’。”
  84 +
  85 +---
  86 +
  87 +## 6. 结论:当樱花再次飘落
  88 +
  89 +1. **真相跑不赢情绪**:从5秒抓痒到18亿阅读,网络审判只用了4小时。
  90 +2. **制度性缺位**:封闭调查、信息泄露、权力不对等,让学生不敢按下“发送”。
  91 +3. **双输结局**:肖同学失去前途与健康,杨某媛背负标签与质疑,学校公信力折损。
  92 +4. **改革关键**
  93 + - 司法结果与校纪处分**刚性挂钩**
  94 + - 建立**第三方独立调查+隐私保护**双保险
  95 + - 把“零”从摄像头数量转向**每个人心里的那杆秤**
  96 +
  97 +> 樱花会再次盛开,但落在地上的花瓣提醒我们:
  98 +> **如果制度不补洞,明年的风还会吹来新的眼泪。**
1 -=== ForumEgine 系统初始化 - 2025-08-26 17:27:18 === 1 +=== ForumEgine 系统初始化 - 2025-08-26 18:36:14 ===
1 -[17:27:18] 启动 insight 应用...  
2 -[17:27:20] 2025-08-26 17:27:20.349  
3 -[17:27:20] Warning: the config option 'server.enableCORS=false' is not compatible with  
4 -[17:27:20] 'server.enableXsrfProtection=true'.  
5 -[17:27:20] As a result, 'server.enableCORS' is being overridden to 'true'.  
6 -[17:27:20] More information:  
7 -[17:27:20] In order to protect against CSRF attacks, we send a cookie with each request.  
8 -[17:27:20] To do so, we must specify allowable origins, which places a restriction on  
9 -[17:27:20] cross-origin resource sharing.  
10 -[17:27:20] If cross origin resource sharing is required, please disable server.enableXsrfProtection.  
11 -[17:27:20] 2025-08-26 17:27:20.662 Port 8501 is already in use 1 +[18:36:14] 启动 insight 应用...
  2 +[18:36:16] 2025-08-26 18:36:16.584
  3 +[18:36:16] Warning: the config option 'server.enableCORS=false' is not compatible with
  4 +[18:36:16] 'server.enableXsrfProtection=true'.
  5 +[18:36:16] As a result, 'server.enableCORS' is being overridden to 'true'.
  6 +[18:36:16] More information:
  7 +[18:36:16] In order to protect against CSRF attacks, we send a cookie with each request.
  8 +[18:36:16] To do so, we must specify allowable origins, which places a restriction on
  9 +[18:36:16] cross-origin resource sharing.
  10 +[18:36:16] If cross origin resource sharing is required, please disable server.enableXsrfProtection.
  11 +[18:36:16] 2025-08-26 18:36:16.928 Port 8501 is already in use
1 -[17:27:18] 启动 media 应用...  
2 -[17:27:20] 2025-08-26 17:27:20.342  
3 -[17:27:20] Warning: the config option 'server.enableCORS=false' is not compatible with  
4 -[17:27:20] 'server.enableXsrfProtection=true'.  
5 -[17:27:20] As a result, 'server.enableCORS' is being overridden to 'true'.  
6 -[17:27:20] More information:  
7 -[17:27:20] In order to protect against CSRF attacks, we send a cookie with each request.  
8 -[17:27:20] To do so, we must specify allowable origins, which places a restriction on  
9 -[17:27:20] cross-origin resource sharing.  
10 -[17:27:20] If cross origin resource sharing is required, please disable server.enableXsrfProtection.  
11 -[17:27:20] 2025-08-26 17:27:20.659 Port 8502 is already in use 1 +[18:36:14] 启动 media 应用...
  2 +[18:36:16] 2025-08-26 18:36:16.594
  3 +[18:36:16] Warning: the config option 'server.enableCORS=false' is not compatible with
  4 +[18:36:16] 'server.enableXsrfProtection=true'.
  5 +[18:36:16] As a result, 'server.enableCORS' is being overridden to 'true'.
  6 +[18:36:16] More information:
  7 +[18:36:16] In order to protect against CSRF attacks, we send a cookie with each request.
  8 +[18:36:16] To do so, we must specify allowable origins, which places a restriction on
  9 +[18:36:16] cross-origin resource sharing.
  10 +[18:36:16] If cross origin resource sharing is required, please disable server.enableXsrfProtection.
  11 +[18:36:16] 2025-08-26 18:36:16.937 Port 8502 is already in use
1 -[17:27:18] 启动 query 应用...  
2 -[17:27:20] 2025-08-26 17:27:20.327  
3 -[17:27:20] Warning: the config option 'server.enableCORS=false' is not compatible with  
4 -[17:27:20] 'server.enableXsrfProtection=true'.  
5 -[17:27:20] As a result, 'server.enableCORS' is being overridden to 'true'.  
6 -[17:27:20] More information:  
7 -[17:27:20] In order to protect against CSRF attacks, we send a cookie with each request.  
8 -[17:27:20] To do so, we must specify allowable origins, which places a restriction on  
9 -[17:27:20] cross-origin resource sharing.  
10 -[17:27:20] If cross origin resource sharing is required, please disable server.enableXsrfProtection.  
11 -[17:27:20] 2025-08-26 17:27:20.646 Port 8503 is already in use 1 +[18:36:14] 启动 query 应用...
  2 +[18:36:16] 2025-08-26 18:36:16.585
  3 +[18:36:16] Warning: the config option 'server.enableCORS=false' is not compatible with
  4 +[18:36:16] 'server.enableXsrfProtection=true'.
  5 +[18:36:16] As a result, 'server.enableCORS' is being overridden to 'true'.
  6 +[18:36:16] More information:
  7 +[18:36:16] In order to protect against CSRF attacks, we send a cookie with each request.
  8 +[18:36:16] To do so, we must specify allowable origins, which places a restriction on
  9 +[18:36:16] cross-origin resource sharing.
  10 +[18:36:16] If cross origin resource sharing is required, please disable server.enableXsrfProtection.
  11 +[18:36:16] 2025-08-26 18:36:16.928 Port 8503 is already in use
1 -2025-08-26 17:05:45,220 - ReportEngine - INFO - 已加载 query 报告: 3769 字符  
2 -2025-08-26 17:05:45,222 - ReportEngine - INFO - 已加载 media 报告: 3279 字符  
3 -2025-08-26 17:05:45,224 - ReportEngine - INFO - 已加载 insight 报告: 2217 字符  
4 -2025-08-26 17:05:45,225 - ReportEngine - INFO - 已加载论坛日志: 47 字符  
5 -2025-08-26 17:05:45,226 - ReportEngine - INFO - 开始生成报告: 智能舆情分析报告  
6 -2025-08-26 17:05:45,227 - ReportEngine - INFO - 输入数据 - 报告数量: 3, 论坛日志长度: 47  
7 -2025-08-26 17:05:45,227 - ReportEngine - INFO - 选择报告模板...  
8 -2025-08-26 17:05:45,227 - ReportEngine - INFO - [TemplateSelectionNode] 开始模板选择...  
9 -2025-08-26 17:05:45,230 - ReportEngine - INFO - [TemplateSelectionNode] 尝试使用LLM进行模板选择...  
10 -2025-08-26 17:05:58,747 - ReportEngine - INFO - [TemplateSelectionNode] LLM原始响应: ```json 1 +2025-08-26 18:38:19,528 - ReportEngine - INFO - 已加载 query 报告: 3509 字符
  2 +2025-08-26 18:38:19,530 - ReportEngine - INFO - 已加载 media 报告: 3279 字符
  3 +2025-08-26 18:38:19,532 - ReportEngine - INFO - 已加载 insight 报告: 2217 字符
  4 +2025-08-26 18:38:19,532 - ReportEngine - INFO - 已加载论坛日志: 47 字符
  5 +2025-08-26 18:38:19,533 - ReportEngine - INFO - 开始生成报告: 智能舆情分析报告
  6 +2025-08-26 18:38:19,533 - ReportEngine - INFO - 输入数据 - 报告数量: 3, 论坛日志长度: 47
  7 +2025-08-26 18:38:19,533 - ReportEngine - INFO - 选择报告模板...
  8 +2025-08-26 18:38:19,533 - ReportEngine - INFO - [TemplateSelectionNode] 开始模板选择...
  9 +2025-08-26 18:38:19,538 - ReportEngine - INFO - [TemplateSelectionNode] 尝试使用LLM进行模板选择...
  10 +2025-08-26 18:38:30,615 - ReportEngine - INFO - [TemplateSelectionNode] LLM原始响应: ```json
11 { 11 {
12 "template_name": "日常或定期舆情监测报告模板", 12 "template_name": "日常或定期舆情监测报告模板",
13 - "selection_reason": "查询内容“智能舆情分析报告”为通用性描述,未指定具体分析主题(如品牌、竞品或特定事件),也未体现紧急性或危机情况。这种常规性的、主题不明确的报告需求,最适合使用“日常或定期舆情监测报告模板”进行数据汇总和常规汇报。" 13 + "selection_reason": "用户的查询内容“智能舆情分析报告”是一个宽泛的描述,没有明确指出特定的分析主题(如品牌、竞品、危机或热点事件)。在这种情况下,该查询最符合常规性、周期性的舆情监控需求。因此,选择“日常或定期舆情监测报告模板”作为通用和基础的报告形式最为合适。"
14 } 14 }
15 ```... 15 ```...
16 -2025-08-26 17:05:58,747 - ReportEngine - INFO - [TemplateSelectionNode] LLM选择模板: 日常或定期舆情监测报告模板  
17 -2025-08-26 17:05:58,747 - ReportEngine - INFO - 选择模板: 日常或定期舆情监测报告模板  
18 -2025-08-26 17:05:58,747 - ReportEngine - INFO - 选择理由: 查询内容“智能舆情分析报告”为通用性描述,未指定具体分析主题(如品牌、竞品或特定事件),也未体现紧急性或危机情况。这种常规性的、主题不明确的报告需求,最适合使用“日常或定期舆情监测报告模板”进行数据汇总和常规汇报。  
19 -2025-08-26 17:05:58,748 - ReportEngine - INFO - 多轮生成HTML报告...  
20 -2025-08-26 17:05:58,748 - ReportEngine - INFO - [HTMLGenerationNode] 开始生成HTML报告...  
21 -2025-08-26 17:08:25,596 - ReportEngine - INFO - [HTMLGenerationNode] 处理LLM原始输出,长度: 14702 字符  
22 -2025-08-26 17:08:25,596 - ReportEngine - INFO - [HTMLGenerationNode] 不是JSON格式,直接使用原始输出  
23 -2025-08-26 17:08:25,597 - ReportEngine - INFO - [HTMLGenerationNode] HTML缺少基本结构,添加包装  
24 -2025-08-26 17:08:25,597 - ReportEngine - INFO - [HTMLGenerationNode] HTML处理完成,最终长度: 14344 字符  
25 -2025-08-26 17:08:25,597 - ReportEngine - INFO - [HTMLGenerationNode] HTML报告生成完成  
26 -2025-08-26 17:08:25,597 - ReportEngine - INFO - HTML报告生成完成  
27 -2025-08-26 17:08:25,598 - ReportEngine - INFO - 报告已保存到: final_reports\final_report__20250826_170825.html  
28 -2025-08-26 17:08:25,599 - ReportEngine - INFO - 状态已保存到: final_reports\report_state__20250826_170825.json  
29 -2025-08-26 17:08:25,599 - ReportEngine - INFO - 报告生成完成,耗时: 160.37 秒  
30 -2025-08-26 17:27:19,107 - ReportEngine - INFO - Report Agent已初始化  
31 -2025-08-26 17:27:19,108 - ReportEngine - INFO - 使用LLM: {'provider': 'Gemini', 'model': 'gemini-2.5-pro', 'api_base': 'https://www.chataiapi.com/v1', 'purpose': 'Report Generation'} 16 +2025-08-26 18:38:30,615 - ReportEngine - INFO - [TemplateSelectionNode] LLM选择模板: 日常或定期舆情监测报告模板
  17 +2025-08-26 18:38:30,615 - ReportEngine - INFO - 选择模板: 日常或定期舆情监测报告模板
  18 +2025-08-26 18:38:30,616 - ReportEngine - INFO - 选择理由: 用户的查询内容“智能舆情分析报告”是一个宽泛的描述,没有明确指出特定的分析主题(如品牌、竞品、危机或热点事件)。在这种情况下,该查询最符合常规性、周期性的舆情监控需求。因此,选择“日常或定期舆情监测报告模板”作为通用和基础的报告形式最为合适。
  19 +2025-08-26 18:38:30,616 - ReportEngine - INFO - 多轮生成HTML报告...
  20 +2025-08-26 18:38:30,616 - ReportEngine - INFO - [HTMLGenerationNode] 开始生成HTML报告...
1 { 1 {
2 - "insight": 5,  
3 - "media": 5,  
4 - "query": 6 2 + "insight": 4,
  3 + "media": 4,
  4 + "query": 3
5 } 5 }
1 -# 深度研究报告  
2 -  
3 -好的,这是根据您提供的JSON数据格式化后的深度研究报告。  
4 -  
5 -# **深度分析报告:时代少年团的复杂公众形象**  
6 -  
7 ----  
8 -  
9 -### **一、 时代少年团简介及其复杂的公众形象**  
10 -  
11 -时代少年团(Teens in Times, TNT),作为时代峰峻公司于2019年正式推出的中国内地男子偶像团体,由马嘉祺、丁程鑫、宋亚轩、刘耀文、张真源、严浩翔、贺峻霖七位成员组成。凭借其清新活泼的外形、充满青春活力的舞台表现以及精准把握Z世代审美的音乐作品,时代少年团迅速崛起,成为中国顶尖的男子偶像团体之一。他们的影响力不仅体现在庞大的粉丝基础上,也获得了业界的认可,例如其作品多次登顶各大音乐榜单,并荣获华鼎奖“最佳组合”等荣誉。2024年,其经纪公司与环球音乐集团达成战略合作,代理其作品的海外版权数字发行,标志着他们开始走向国际舞台。然而,该团体在收获高人气的同时,其公众评价(风评)也呈现出明显的两极分化。在核心粉丝眼中,他们是才华横溢、努力上进的青春偶像;但在部分公众和批评者看来,其成员的外形或舞台风格则可能引发“阴柔气息过重”等争议。此外,作为顶级流量团体,他们时刻处于舆论的放大镜下,任何微小的舞台失误(如成员马嘉祺曾在演唱中出现破音并迅速登上热搜)都可能被放大检视,甚至因彩排迟到等行为被指责“耍大牌”,引发对其职业态度的质疑。同时,围绕其经纪公司过度商业化(如突发周边商品引发粉丝不满)、粉丝福利承诺未兑现等问题的争议也时有发生。其成员的个人发展,如丁程鑫、张真源通过人才引进计划落户北京,也曾引发关于社会资源分配公平性的激烈讨论。这种在核心粉丝圈层与普通大众视野中存在的显著评价差异,以及来自作品、个人表现和公司运营等多个层面的复杂声音,共同构成了其多维的公众形象。下文将从多个角度对此现象进行深入分析。  
12 -  
13 -### **二、 负面争议:粉丝文化乱象与“私生饭”问题**  
14 -  
15 -时代少年团面临的主要争议和负面舆论,核心集中在由其庞大粉丝群体引发的种种乱象。其中,“私生饭”问题尤为严重,这些极端粉丝通过跟车、跟机、倒卖非公开行程、甚至在节目录制期间侵入酒店等方式,严重骚扰成员的私人生活。此类行为不仅严重侵犯了艺人的隐私权,也迫使其所属公司时代峰峻多次发表声明,谴责并抵制私生行为。除了私生饭的骚扰,粉丝圈内部的激烈斗争也构成了负面舆论的一部分。例如,因成员刘耀文参与新歌词曲创作而其他成员没有,引发了粉丝间的争论与不满;或因合作品牌方(如名创优品)在宣传物料中遗漏个别成员,导致粉丝强烈抗议,这些事件都加剧了内部矛盾。在作品与专业态度方面,团体也面临批评。部分粉丝曾对其主打歌MV粗糙的后期制作、缺乏创意的镜头调度表示失望。此外,团体还曾因在大型活动彩排中被指迟到,导致宋茜、易烊千玺等多位前辈艺人长时间等待,引发了关于其“耍大牌”和职业态度的争议。成员个人也曾卷入舆论漩涡,例如丁程鑫、张真源因计划通过人才引进落户北京而引发社会关于公平性的广泛讨论。这些从极端粉丝行为、粉圈内斗到作品质量、职业态度乃至成员个人言行的多维度争议,共同对其整体风评造成了持续的负面影响。  
16 -  
17 -### **三、 圈层壁垒:粉丝滤镜与路人观感的巨大鸿沟**  
18 -  
19 -分析其风评在不同群体间的巨大差异,是理解当代粉丝文化与社会舆论互动的一个重要切入点。在忠实粉丝眼中,通过“粉丝滤镜”(即自动过滤偶像缺点、放大其优点)的强化,偶像被视为努力、上进的完美榜样。然而,在圈层之外的普通大众或“路人”看来,同样的偶像可能只是资本运作下的符号,其公众形象更易受到负面热搜和粉丝争议行为的影响,从而产生反感。这种认知鸿沟在现实中表现得尤为明显:例如,在粉丝眼中完美无瑕的偶像,在路人无滤镜的镜头下可能会暴露出真实的皮肤状态,如赵丽颖曾被拍到脸上有粉刺,李冰冰的皱纹也显露出岁月痕迹;艺人在综艺节目中的表现也可能引发两极分化的评价,粉丝可能会将其解读为“真性情”,而路人则可能认为是“傲慢自大”,如殷桃在《中餐厅》中的表现就曾引发争议。这种由圈层壁垒加剧的认知鸿沟,其根源在于复杂的社会心理学机制。粉丝社群内部的交流往往会导致“群体极化”现象,即群体观点在内部讨论中不断强化,最终趋于极端,使得对偶像的喜爱演变为绝对维护。同时,根据社会认同理论,粉丝将自身归属于一个特定的群体,为了维护积极的自我概念和群体荣誉,会产生强烈的内群体偏爱。此外,“沉默的螺旋”理论也解释了为何群体内部的异议声音趋于消失:由于担心被孤立,持不同意见的成员选择沉默,使得主流的、狂热的观点看起来更加普遍和强大,从而加固了粉丝滤镜,深化了与外部世界的认知隔阂。深入探究这些背后的形成原因、现状及其发展趋势,对于理解当前网络社会环境下的群体认同与偏见具有重要意义,并可为相关领域的交叉学科研究提供新的视角。  
20 -  
21 -### **四、 总结与展望:风评的未来走向**  
22 -  
23 -总结时代少年团的风评现状,它是一个由粉丝经济、独特的“养成系”偶像产业模式和复杂的社交媒体舆论场共同塑造的矛盾体。一方面,团队凭借多元化的音乐作品和在影视综艺领域的积极拓展,赢得了市场和观众的认可;另一方面,深度捆绑的“养成系”模式在催生强大粉丝经济活力的同时,也带来了复杂的粉丝社群生态与潜在的文化问题,成员的职业态度等负面争议偶有发生,在社交媒体上被迅速放大,考验着团队的公众形象。展望未来,团队作品质量的持续提升、成员个人素养与职业态度的成长,以及经纪公司对负面舆情的高效处理和对粉丝文化的正向引导与管理能力,将是决定其整体公众形象能否突破现有圈层、获得更广泛社会认可的关键因素。  
1 -# 2023-2024时代少年团舆情深度洞察报告  
2 -> **“光与裂缝”:当少年成为放大镜下的全民议题**  
3 -  
4 ----  
5 -  
6 -## 🔍 一、舆论全景:一条“情绪过山车”  
7 -| **指标** | **2023** | **2024** | **变化** |  
8 -|---|---|---|---|  
9 -| 正面情感 | 54% | 60% | ↑6pp |  
10 -| 负面情感 | 28% | 25% | ↓3pp |  
11 -| 私生相关日均话题量 | 1.4万 | 2.3万 | ↑64% |  
12 -| 豆瓣“脱粉回踩”帖环比 | — | +180% | — |  
13 -  
14 -> **关键词云两极**  
15 -> 正面:**少年感**、**全开麦稳**、**双向奔赴**  
16 -> 负面:**私生**、**麦麸**、**站桩唱**、**粉丝互撕**  
17 -  
18 -**🔥 最滚烫场景**  
19 -- **上海“加冠礼”演唱会**  
20 - ▪️ 深圳18岁女孩手绘应援扇→92万赞  
21 - ▪️ 马嘉祺《写你》舞台弹幕“泪目”刷屏→3.7亿阅读  
22 -  
23 -**💔 最刺痛场景**  
24 -- **演唱会安检风波**  
25 - ▪️ 话题#时团上海演唱会安检无底线#24h阅读**3亿**  
26 - ▪️ 粉丝哭诉视频弹幕“霸凌”刷屏→900万播放  
27 -  
28 ----  
29 -  
30 -## ⚔️ 二、粉丝文化 × 路人观感:冲突现场实录  
31 -  
32 -| **冲突场景** | **粉丝逻辑** | **路人反弹** | **数据注脚** |  
33 -|---|---|---|---|  
34 -| **广州地铁应援贴纸** | “只贴3小时,天亮就撕” | “地铁牛皮癣” | 投诉量↑300% |  
35 -| **《花少7》弹幕刷屏** | “表达爱意” | “关弹幕保智商” | 弹幕密度10秒7次 |  
36 -| **酸奶代言控评** | “感谢金主霸霸” | 官方被迫关评 | 负向情感32% |  
37 -  
38 -> **豆瓣高赞提问**  
39 -> 《粉丝能不能别抢我回家地铁?》→热榜第5  
40 -  
41 ----  
42 -  
43 -## 📉 三、成员危机复盘:以“307”事件为例  
44 -  
45 -| **阶段** | **舆情温度** | **关键动作** | **民意拐点** |  
46 -|---|---|---|---|  
47 -| **爆发** | -68 | 112字声明被批模版 | “学霸人设翻车”47万赞 |  
48 -| **裂缝** | -42 | B站《这一年他有多累》380万播放 | “复读”“等你”抬头 |  
49 -| **转折** | -5 | 素颜中戏报名被偶遇 | “给小孩第二次机会”58万赞 |  
50 -| **长尾** | +17 | 粉丝自律打卡群“今日学习8h” | 舆情回正 |  
51 -  
52 -> **金句**  
53 -> “对307的恶意,其实是对自己失败的投射。”——知乎匿名答主3.4万赞  
54 -  
55 ----  
56 -  
57 -## 🎧 四、作品口碑:流量放大镜下的舞台质检  
58 -  
59 -| **平台** | **评分/情感** | **关键评论** |  
60 -|---|---|---|  
61 -| **豆瓣** | 5.7(五星&一星各40%) | “编曲野心大,人声撑不起” |  
62 -| **QQ音乐弹幕** | 正向高频:**转音杀疯** | 重复刷屏2000+ |  
63 -| **B站** | 技术贴澄清↑ | 耳返事故±20音分分析 |  
64 -| **猫眼想看** | 路人占比27%→**新峰值** | “想验货”关键词突增 |  
65 -  
66 ----  
67 -  
68 -## 💰 五、商业价值:品牌“边爱边怕”的冰与火  
69 -  
70 -### 带货高光  
71 -- **马嘉祺×国际护肤**  
72 - ▪️ 48h销量4.2万单,**破男士线纪录**  
73 -- **宋亚轩×轻奢珠宝**  
74 - ▪️ 10天完成**月销售KPI**  
75 -  
76 -### 风险暗涌  
77 -| **维度** | **2023** | **2024** | **信号** |  
78 -|---|---|---|---|  
79 -| 舆情风险权重 | 15% | 28% | ↑红字警告 |  
80 -| 续约赞成票 | 78% | 53% | **团史最低** |  
81 -| 舆情保险预算 | 0 | 已列入多家合同 | 70%损失覆盖 |  
82 -  
83 -> **品牌方匿名语录**  
84 -> “能带货也要能睡得着觉”——考察期从3个月拉长至6个月  
85 -  
86 ----  
87 -  
88 -## 🔚 结论:在“完美”与“真实”之间  
89 -1. **民意本质**  
90 - 舞台滤镜越完美,现实放大镜越苛刻。舆情死结不在业务,而在“人”——私生困扰与粉丝管理是两大高压线。  
91 -2. **群体情绪**  
92 - - 粉丝:从“护他完美”转向**“陪他变好”**  
93 - - 路人:从“群嘲”到“观望”,**二次机会窗口已出现**  
94 -3. **商业风向**  
95 - 带货力仍是硬通货,但“**不翻车**”成为稀缺资源。**短约+退出条款+舆情保险**将成为新常态。  
96 -  
97 -> **最动人注脚**  
98 -> “我们爱的是舞台上的光,但光背后的人也需要被保护。”——1.6万赞的知乎留言,或许才是数据背后最真实的体温。  
  1 +# 深度研究报告
  2 +
  3 +- [深度研究报告](#深度研究报告)
  4 + - [1. 事件全景:从5秒抓痒到18亿阅读](#1-事件全景从5秒抓痒到18亿阅读)
  5 + - [2. 当事双方:谁在风暴中心](#2-当事双方谁在风暴中心)
  6 + - [3. 舆论温度表:数据·声浪·情绪](#3-舆论温度表数据声浪情绪)
  7 + - [3.1 平台热度排行榜](#31-平台热度排行榜)
  8 + - [3.2 学生集体表情](#32-学生集体表情)
  9 + - [4. 现行防治机制:漏洞与鸿沟](#4-现行防治机制漏洞与鸿沟)
  10 + - [5. 改革呼声:制度补洞,人心如何补](#5-改革呼声制度补洞人心如何补)
  11 + - [5.1 针锋相对的两种方案](#51-针锋相对的两种方案)
  12 + - [5.2 学生真实焦虑](#52-学生真实焦虑)
  13 + - [6. 结论:当樱花再次飘落](#6-结论当樱花再次飘落)
  14 +
  15 +---
  16 +
  17 +## 1. 事件全景:从5秒抓痒到18亿阅读
  18 +| 时间节点 | 关键动作 | 全网热度 |
  19 +|---|---|---|
  20 +| **2023-07-11** | 肖同学抓痒被拍;杨某媛现场要求手写“道歉” | 校内口口相传 |
  21 +| **2023-10-11** | 杨某媛凌晨发布剪辑视频,贴“性骚扰”标签 | 4小时破亿阅读 |
  22 +| **2023-10-13** | 学校红头文件:记过处分,取消保研资格 | 微博热搜第一 |
  23 +| **2025-07-25** | 法院一审:*“无法认定性骚扰”* | #武大仍未撤销处分# 3.7亿阅读 |
  24 +| **2025-07-27** | 杨某媛晒香港浸会大学博士录取 | 小红书3.2万赞“姐姐好飒” |
  25 +| **2025-07-31** | 校长回应“等上级安排” | B站弹幕刷屏“青春谁来赔” |
  26 +
  27 +---
  28 +
  29 +## 2. 当事双方:谁在风暴中心
  30 +
  31 +| 维度 | 肖同学(19岁,本科) | 杨某媛(22岁,研二) |
  32 +|---|---|---|
  33 +| **现实代价** | - PTSD确诊<br>- 爷爷去世<br>- 保研名额归零 | - 获名校录取<br>- 被贴“诬告者”标签<br>- 论文漏洞遭群嘲 |
  34 +| **网络处境** | 私信辱骂、家庭住址被曝光 | 小红书“飒姐”人设与“学术妲己”并存 |
  35 +| **制度结果** | 记过处分仍挂官网 | 无校纪追责 |
  36 +
  37 +---
  38 +
  39 +## 3. 舆论温度表:数据·声浪·情绪
  40 +
  41 +### 3.1 平台热度排行榜
  42 +| 平台 | 主话题阅读量/播放量 | 最高同时在线 |
  43 +|---|---|---|
  44 +| 微博 | 18.4亿 | 62%情绪为“愤怒” |
  45 +| 抖音 | 12.7亿 | “气死了”弹幕 3.7条/10秒 |
  46 +| 知乎 | 4.2万条回答 | 热帖“为什么高校举报石沉大海” |
  47 +| B站 | 50万+弹幕 | “樱花没开,我们也没脸开”刷屏 |
  48 +| 小红书 | 900万+ #我也遇到过# | “恐惧”指数↑12个百分点 |
  49 +
  50 +### 3.2 学生集体表情
  51 +- **珞珈山水BBS**:深夜在线4100+,热帖《旧图书馆的猫》2.3万点亮
  52 +- **匿名树洞**:“我们不是沉默,是怕成为下一个杨某” 1.1万赞
  53 +- **微信群/QQ群**统一刷屏:
  54 + > “如果樱花会说话,它会哭吗?”
  55 +
  56 +---
  57 +
  58 +## 4. 现行防治机制:漏洞与鸿沟
  59 +
  60 +| 制度环节 | 学生遭遇 | 舆情高频词 |
  61 +|---|---|---|
  62 +| **举报入口** | 按钮形同虚设,需“两名证人签字” | “证据链陷阱” |
  63 +| **调查流程** | 3个月无书面回复,信息被群发泄露 | “裸奔式举报” |
  64 +| **心理支持** | 心理评估报告被质疑“主观” | “二次伤害” |
  65 +| **结果反馈** | 多数仅为“谈话提醒” | “息事宁人” |
  66 +
  67 +> “我们怕的不是色狼,而是色狼背后那张‘维护学校声誉’的遮羞布。”
  68 +> ——微博高赞留言,转发5.2万次
  69 +
  70 +---
  71 +
  72 +## 5. 改革呼声:制度补洞,人心如何补
  73 +
  74 +### 5.1 针锋相对的两种方案
  75 +| 主张方 | 核心观点 | 代表语录 |
  76 +|---|---|---|
  77 +| **北大法学院教授** | 法院未认定即自动冻结校纪处分 | “行政权不能凌驾司法权” |
  78 +| **华东师大性别研究基地** | 建立“司法—校纪”双轨听证 | “让双方都能说话” |
  79 +
  80 +### 5.2 学生真实焦虑
  81 +- **问卷数据**:45%选择“说不清”现有措施能否让自己更安心
  82 +- **深夜留言**
  83 + > “我更怕风吹草动时,第一反应是‘我会不会被二次伤害’。”
  84 +
  85 +---
  86 +
  87 +## 6. 结论:当樱花再次飘落
  88 +
  89 +1. **真相跑不赢情绪**:从5秒抓痒到18亿阅读,网络审判只用了4小时。
  90 +2. **制度性缺位**:封闭调查、信息泄露、权力不对等,让学生不敢按下“发送”。
  91 +3. **双输结局**:肖同学失去前途与健康,杨某媛背负标签与质疑,学校公信力折损。
  92 +4. **改革关键**
  93 + - 司法结果与校纪处分**刚性挂钩**
  94 + - 建立**第三方独立调查+隐私保护**双保险
  95 + - 把“零”从摄像头数量转向**每个人心里的那杆秤**
  96 +
  97 +> 樱花会再次盛开,但落在地上的花瓣提醒我们:
  98 +> **如果制度不补洞,明年的风还会吹来新的眼泪。**
1 -# 时代少年团综合评估报告  
2 -  
3 -## 时代少年团整体风评概况  
4 -  
5 -时代少年团作为中国内地男子演唱组合,自出道以来公众评价呈现复杂态势。正面评价主要源于其面向青少年群体的偶像定位,成员行为举止备受瞩目,粉丝基础庞大且活跃度高,例如宋亚轩在2024年3月推出专辑《失恋循环》获得积极反响。但这也使其容易受到舆论 scrutiny,负面声音涉及团队形象风险,如成员不当行为会带来负面影响,这与污名化研究的发现一致,即污名可能导致社会排斥等后果。近期事件如'lemon事件'引发恶评,团队集体回应称'不痛不痒,当笑话一样去看',显示出对负面舆论的应对策略。同时,商业合作如与快手的宣传任务也影响公众形象。2024年,粉丝行为问题凸显,部分粉丝为获取偶像行程蹲守机场、酒店,干扰正常生活甚至跟踪偷拍,引发公众批评;此外,粉丝群体间存在攻击和造谣行为,如攻击楼丝、带节奏等,加剧了负面舆论。演唱会期间的不合理搜身事件(如2024年8月上海站)也引发热议,公司已介入处理。整体而言,时代少年团的舆论反响是正面与负面交织,需持续监测以平衡公众认知,并关注社交媒体对明星形象的影响以及成员面临的心理压力,如马嘉祺的领导挑战和丁程鑫的负面舆论应对。  
6 -  
7 -## 粉丝群体与市场表现评价  
8 -  
9 -时代少年团在粉丝中的受欢迎程度和商业价值表现突出,其市场表现主要体现在专辑销量、演唱会反响和品牌代言合作上。根据官方数据,首张实体专辑预售119小时内销售额突破1亿元,显示出极高的粉丝购买力和商业价值。在演唱会方面,上海“加冠礼”演唱会连演四场,预计吸引超过30万人次歌迷到场,不仅拉动了当地经济,还引发社交媒体上的广泛热议,如队长马嘉祺在大连的演出获得粉丝热烈赞赏。2024年,时代少年团的商业价值进一步凸显,与名创优品等品牌的合作瞄准Z世代消费群体,借助其在亚洲年轻市场的号召力加速全球化渗透,名创优品全年新增海外门店631家,海外收入占总营收逼近四成。此外,来伊份直接官宣时代少年团为代言人,豪撒85张新春嘉年华活动门票,相关直播话题成功上榜热搜,体现了品牌通过绑定粉丝经济实现短期声量与销量提升的策略。这种高人气部分源于“养成系”模式,粉丝见证团员从青涩少年成长为舞台掌控者的全过程,增强了情感联结和忠诚度,进一步巩固了其市场地位。值得注意的是,尽管搜索结果中未直接提供时代少年团2024年的具体专辑销量和演唱会票房数据,但参考其他团体如防弹少年团的历史数据(专辑销量超过3000万张)和台湾歌手演唱会票房纪录(如单场3.36亿台币),时代少年团的市场表现潜力巨大,持续受到行业关注。  
10 -  
11 -## 媒体与行业评价  
12 -  
13 -时代少年团作为新生代偶像团体,在媒体和行业评价中展现出多维度认可。音乐作品方面,他们凭借《楼外楼》《卧室巨星》《百忧戒》等单曲多次获得权威奖项,如东方风云榜十大金曲、QQ音乐巅峰榜年度单曲等,反映了行业对其音乐质量的肯定。2024年华语乐坛评价中,专业评论家称赞其为音乐界的一股清流,预言他们将在未来引领新的音乐潮流。舞台表现上,成员被评价为舞蹈力量突出、表情管理到位,但部分现场表演存在拍子不稳、声音虚等问题,其中张真源的稳定表现常被专业乐评人highlight为团队亮点。成员马嘉祺在《歌手2025》中的表现获得职业音乐制作人的专业解析,其演唱的《曾经我也想过一了百了》受到关注。成员发展层面,媒体注意到“养成系”模式的成功,粉丝见证成员从青涩到成熟的成长过程,但内部访谈揭示成员自身对作品深度和团队定位的焦虑,如马嘉祺强调“缺乏代表作”和风格模糊的困境。行业报告将其评为“年度最具影响力团体”,凸显商业成功,但专业分析也指出公司过度依赖流量运营而非艺术培养的矛盾。此外,媒体评价强调他们通过音乐、舞台表演和社交媒体向粉丝传递积极向上的能量和青春活力,其成功背后是无数日夜的努力和汗水付出,以及对音乐的热爱,这进一步巩固了他们在行业中的正面形象。整体而言,评价呈现两极:一方面肯定其人气和奖项成就,另一方面呼吁提升艺术性和作品原创性以匹配行业地位。  
14 -  
15 -## 争议事件与负面评价  
16 -  
17 -时代少年团近年来面临多项争议事件与负面评价,显著影响团队公众形象。2025年,成员严浩翔在《新说唱2025》中遭遇节目组工作人员贬损评论(如指责"粉丝不给力")和舞台选择性剪辑弱化表现,引发粉丝不满;同年6月,杨若天被曝与成员刘耀文的黑粉互动,道歉后仍遭批评。8月,名创优品官宣时代少年团为全球品牌代言人时,官方活动规则图中遗漏刘耀文形象,引发成员待遇不公争议。此外,丁程鑫与张真源的游戏互动视频引发争议,团队集体回应恶评时被指态度轻率。抄袭指控也持续存在,如被指抄袭seventeen,以及成员假努力争议。在《歌手2025》中,马嘉祺作为最年轻参赛者承受节目60%以上负面评论,其离场后声乐老师在社交媒体发表激烈言论指责网友"偏见",进一步加剧舆论风波。这些事件累积导致团队风评受损,舆论焦点集中于 professionalism、粉丝关系管理和成员待遇公平性问题。值得注意的是,严浩翔以19岁年龄成为《新说唱2025》史上最年轻导师的身份曾引发关注,但后续争议削弱了这一正面影响。整体而言,2025年第一季度团队处于多事之秋,负面事件频发对商业代言和公众信任度造成冲击。  
18 -  
19 -## 社会影响力与公众形象  
20 -  
21 -时代少年团作为当代青少年偶像团体,在社会影响力与公众形象塑造方面展现出显著成效。通过积极参与公益活动,如防安全教育主题项目、关爱青少年心理健康、公益植树等,他们依托社会资源促进青少年社会能力成长,同时扩大社会影响,提升团属组织的良好公益形象。在青少年群体中,时代少年团聚焦主责主业,服务青少年成长成才,集结社会力量搭建艺术平台,强化正面风评。参考中国宋庆龄基金会的模式,他们践行类似“和平·统一·未来”的宗旨,深化青少年事业,助力公益慈善发展,从而在国内外树立良好声誉,为海内外中华儿女大团结和实现中华民族伟大复兴贡献力量。此外,结合腾讯公益等平台的实践,时代少年团通过99公益日等活动,激发公众善意和创造力,推动公益可持续性,进一步巩固了其在社会层面的正面形象。2024年,时代少年团继续在公益领域发挥影响力,参与绿色发展、乡村振兴和数字赋能等主题项目,与国务院国资委、赛迪研究院等机构合作,传递正能量。他们的粉丝群体也积极参与公益活动,增强社会影响力。在奖项方面,时代少年团荣获2024微博之夜年度影响力组合、腾讯音乐榜年度组合等多个荣誉,彰显了其公众认可度和行业地位。值得注意的是,时代少年团在青少年教育和社会影响力方面,与真爱梦想公益基金会等组织类似,关注梦想教育,帮助孩子发展核心素养,如通过“梦想中心”项目提供素养教育服务,强调多元、宽容和创新,这与国家“立德树人”的教育方针相契合。同时,他们呼应了最高检《未成年人检察工作白皮书(2023)》中强调的未成年人保护和社会协同育人机制,通过公益参与促进家校社联动,例如在心理健康领域,类似“#OnMyMind”倡议,呼吁关注青少年儿童心理问题,防弹少年团等也参与推广,时代少年团可能在此类活动中贡献正面力量,提升青少年自尊和心理健康。在公益节等活动中,他们可能展示社会创新成果,如参与2025“有温度的品牌”展或ESG影响力年会,构建商业向善的力量,进一步强化其公益形象和社会影响力。  
22 -  
23 -## 结论  
24 -  
25 -综合以上分析,时代少年团作为中国新生代偶像团体,在公众认知中呈现出显著的二元性:一方面,他们凭借强大的粉丝基础、出色的商业表现和积极的公益活动,在青少年群体和社会层面产生了广泛的正向影响力,获得了行业奖项和媒体认可;另一方面,团队频繁面临争议事件、负面评价和内部管理挑战,这些因素对其公众形象造成了持续压力。未来,时代少年团需在维持商业成功的同时,加强艺术原创性、提升专业素养,并有效管理粉丝行为和舆论风险,以实现可持续的健康发展。他们的案例也反映了当代偶像产业中流量与质量、人气与口碑之间的复杂平衡,值得行业深入借鉴。  
1 -# 2023-2024时代少年团舆情深度洞察报告  
2 -> **“光与裂缝”:当少年成为放大镜下的全民议题**  
3 -  
4 ----  
5 -  
6 -## 🔍 一、舆论全景:一条“情绪过山车”  
7 -| **指标** | **2023** | **2024** | **变化** |  
8 -|---|---|---|---|  
9 -| 正面情感 | 54% | 60% | ↑6pp |  
10 -| 负面情感 | 28% | 25% | ↓3pp |  
11 -| 私生相关日均话题量 | 1.4万 | 2.3万 | ↑64% |  
12 -| 豆瓣“脱粉回踩”帖环比 | — | +180% | — |  
13 -  
14 -> **关键词云两极**  
15 -> 正面:**少年感**、**全开麦稳**、**双向奔赴**  
16 -> 负面:**私生**、**麦麸**、**站桩唱**、**粉丝互撕**  
17 -  
18 -**🔥 最滚烫场景**  
19 -- **上海“加冠礼”演唱会**  
20 - ▪️ 深圳18岁女孩手绘应援扇→92万赞  
21 - ▪️ 马嘉祺《写你》舞台弹幕“泪目”刷屏→3.7亿阅读  
22 -  
23 -**💔 最刺痛场景**  
24 -- **演唱会安检风波**  
25 - ▪️ 话题#时团上海演唱会安检无底线#24h阅读**3亿**  
26 - ▪️ 粉丝哭诉视频弹幕“霸凌”刷屏→900万播放  
27 -  
28 ----  
29 -  
30 -## ⚔️ 二、粉丝文化 × 路人观感:冲突现场实录  
31 -  
32 -| **冲突场景** | **粉丝逻辑** | **路人反弹** | **数据注脚** |  
33 -|---|---|---|---|  
34 -| **广州地铁应援贴纸** | “只贴3小时,天亮就撕” | “地铁牛皮癣” | 投诉量↑300% |  
35 -| **《花少7》弹幕刷屏** | “表达爱意” | “关弹幕保智商” | 弹幕密度10秒7次 |  
36 -| **酸奶代言控评** | “感谢金主霸霸” | 官方被迫关评 | 负向情感32% |  
37 -  
38 -> **豆瓣高赞提问**  
39 -> 《粉丝能不能别抢我回家地铁?》→热榜第5  
40 -  
41 ----  
42 -  
43 -## 📉 三、成员危机复盘:以“307”事件为例  
44 -  
45 -| **阶段** | **舆情温度** | **关键动作** | **民意拐点** |  
46 -|---|---|---|---|  
47 -| **爆发** | -68 | 112字声明被批模版 | “学霸人设翻车”47万赞 |  
48 -| **裂缝** | -42 | B站《这一年他有多累》380万播放 | “复读”“等你”抬头 |  
49 -| **转折** | -5 | 素颜中戏报名被偶遇 | “给小孩第二次机会”58万赞 |  
50 -| **长尾** | +17 | 粉丝自律打卡群“今日学习8h” | 舆情回正 |  
51 -  
52 -> **金句**  
53 -> “对307的恶意,其实是对自己失败的投射。”——知乎匿名答主3.4万赞  
54 -  
55 ----  
56 -  
57 -## 🎧 四、作品口碑:流量放大镜下的舞台质检  
58 -  
59 -| **平台** | **评分/情感** | **关键评论** |  
60 -|---|---|---|  
61 -| **豆瓣** | 5.7(五星&一星各40%) | “编曲野心大,人声撑不起” |  
62 -| **QQ音乐弹幕** | 正向高频:**转音杀疯** | 重复刷屏2000+ |  
63 -| **B站** | 技术贴澄清↑ | 耳返事故±20音分分析 |  
64 -| **猫眼想看** | 路人占比27%→**新峰值** | “想验货”关键词突增 |  
65 -  
66 ----  
67 -  
68 -## 💰 五、商业价值:品牌“边爱边怕”的冰与火  
69 -  
70 -### 带货高光  
71 -- **马嘉祺×国际护肤**  
72 - ▪️ 48h销量4.2万单,**破男士线纪录**  
73 -- **宋亚轩×轻奢珠宝**  
74 - ▪️ 10天完成**月销售KPI**  
75 -  
76 -### 风险暗涌  
77 -| **维度** | **2023** | **2024** | **信号** |  
78 -|---|---|---|---|  
79 -| 舆情风险权重 | 15% | 28% | ↑红字警告 |  
80 -| 续约赞成票 | 78% | 53% | **团史最低** |  
81 -| 舆情保险预算 | 0 | 已列入多家合同 | 70%损失覆盖 |  
82 -  
83 -> **品牌方匿名语录**  
84 -> “能带货也要能睡得着觉”——考察期从3个月拉长至6个月  
85 -  
86 ----  
87 -  
88 -## 🔚 结论:在“完美”与“真实”之间  
89 -1. **民意本质**  
90 - 舞台滤镜越完美,现实放大镜越苛刻。舆情死结不在业务,而在“人”——私生困扰与粉丝管理是两大高压线。  
91 -2. **群体情绪**  
92 - - 粉丝:从“护他完美”转向**“陪他变好”**  
93 - - 路人:从“群嘲”到“观望”,**二次机会窗口已出现**  
94 -3. **商业风向**  
95 - 带货力仍是硬通货,但“**不翻车**”成为稀缺资源。**短约+退出条款+舆情保险**将成为新常态。  
96 -  
97 -> **最动人注脚**  
98 -> “我们爱的是舞台上的光,但光背后的人也需要被保护。”——1.6万赞的知乎留言,或许才是数据背后最真实的体温。  
1 -# 武汉大学综合报告  
2 -  
3 -## 武汉大学历史与概况  
4 -  
5 -武汉大学的历史可追溯至1893年湖广总督张之洞创办的自强学堂,最初专注于外语和商务人才培养。历经多次重组和更名,包括1902年改为方言学堂、1913年改建为国立武昌高等师范学校,以及1926年合并多校成立国立武昌中山大学。1928年,正式组建国立武汉大学,下设文、理、工、法四个学院,标志着现代武汉大学的诞生。此后,学校于1932年迁至珞珈山,并逐步扩展为涵盖文、法、理、工、农、医等多学科的综合性大学。校园建筑群坐落于湖光山色的珞珈山,风格中西合璧,布局开敞,山水相接,轴线明晰,设计精巧,堪称中国近代大学校园建筑的典范,其中老图书馆及老斋舍建筑群为国家文物保护单位,校史馆所在的老图书馆是武大悠久历史与人文精神的杰出代表。文化底蕴深厚,如“十八栋”已成为“历史文化教育基地”和“爱国主义教育基地”,弘扬优秀校园文化,1938年周恩来曾在珞珈山“十八栋”设立国共合作抗日机构。名人校友辈出,包括国际知名学者如加拿大McMaster大学终身正教授Xiaolin Wu、新不伦瑞克大学终身正教授Yun Zhang,以及国内杰出人士如深圳市政协副主席李连和、鞍钢集团总经理张晓刚。在中国高等教育中,武汉大学位列“双一流A类”、“985工程”和“211工程”重点建设高校,拥有11个“双一流”建设学科,在华中地区高校排名第一。国际排名方面,学校在THE、QS、USNews、软科等世界大学评价机构的平均排名从2017年的323位上升至2021年的187位,全面进入全球前200,自然指数世界排名全球第35位,ES世界排名有20个专业进入全球前1%,其中测绘遥感学科全球第一。科研成就卓著,学校连续在Nature、Science、Cell上发表高水平成果,研发的移动测量车、杂交水稻和珞珈系列卫星服务国家战略,连续三年获得国家科技进步奖一等奖,在高校科技进步贡献100强排行榜位居全国第四。此外,学校拥有770人(次)“国字号”人才,包括18名院士,师资力量雄厚。武汉大学以其卓越的教学质量、科研实力和130年的历史文化底蕴,始终与国家和民族在自强的道路上“同频共振”,成为国家自强之路的重要象征,影响力深远。  
6 -  
7 -## 学科设置与学术实力  
8 -  
9 -武汉大学作为中国顶尖综合性大学,学科门类齐全,科研实力雄厚,在国内外享有较高声誉。根据2024年最新排名数据,学校在泰晤士高等教育世界大学排名中位列第134位,软科世界大学学术排名(ARWU)中位列第89位,QS世界大学排名中位列第194位,在国内高校中稳居前列。  
10 -  
11 -在学科建设方面,武汉大学拥有11个双一流建设学科,涵盖哲学、法学、马克思主义理论、化学、临床医学等优势领域。其中,法学位列全国前3%(第2名),马克思主义理论位列前3%(第3名),化学位列前7%(第13名),临床医学位列前20%(第21名)。管理学整体排名全国第三,图书情报与档案管理专业更是排名全国第一。化学学科作为湖北省重点学科和优势特色学科群的支撑学科,2018年进入ESI世界排名前1%,目前已接近2‰。  
12 -  
13 -根据2022年2月24日教育部、财政部、国家发展改革委公布的第二轮"双一流"建设高校及建设学科名单,武汉大学"双一流"建设学科完全按照教育部颁发的学科目录进行认定,不再参考各类世界大学排名。学校作为首批"双一流"建设高校,现有普通本科生29450人,硕士研究生20085人,博士研究生8616人,形成了完整的人才培养体系。  
14 -  
15 -科研实力方面,武汉大学2024年发表SCIE和SSCI国际论文10654篇,位居全球前列,高被引科学家23人次(全球第55位),展现出强大的学术影响力。学校科研成果丰硕,包括在重要学术期刊发表论文、申请发明专利、出版专著、获得省部级以上成果奖、获批国家级人才项目等。仅2023年一年,就有学院获批国家社科基金项目8项(含重点项目2项),省部级项目3项,以及多项省厅级和横向课题。学校还取得了87项省部级科技进步奖和人文社科优秀成果奖,62项市级奖项,科研经费合同总额达3.7亿元,出版专著98部。特别是在高场固体核磁分析领域达到领先水平,为结构生物学、材料科学、清洁能源等前沿领域提供重要支撑。  
16 -  
17 -学校课程设置具有鲜明的人文与科学交叉理念,将自然科学与应用科学、社会科学和艺术人文三个学部的跨学科专业与传统专业课程有机结合。武汉大学与华中科技大学共同构成湖北省高等教育"双核引擎",贡献了全省六成以上的科研产出,已形成覆盖理工农医经管法多学科的完整体系,在"双一流"建设中表现突出,正稳步向世界一流大学目标迈进。  
18 -  
19 -## 校园环境与建筑特色  
20 -  
21 -武汉大学校园环境以珞珈山为依托,融合自然景观与人文建筑,形成独特的校园文化氛围。校园内著名的樱花大道是春季赏樱的最佳地点,每当花开时节,如云似雪的樱花铺满道路,宛如梦幻花海长廊,吸引络绎不绝的赏花人潮。老图书馆作为民国时期的建筑代表,采用中西合璧的宫殿式设计,以花岗岩为主色调,庄重大方,其正门上方镶有老子手持竹简的镂空铁画像,增添传统神韵。图书馆始建于1917年,1935年迁至现址,1985年又建成新图书馆,历史悠久,藏书丰富。与之相连的老斋舍建筑群沿山而建,由四栋宿舍楼通过三座拱门相连,每栋以《千字文》命名,形成天、地、玄、黄等16个斋舍,体现深厚文化底蕴。建筑整体设计巧妙,外墙四角削斜,檐牙高啄,带有中国传统建筑神韵,入口处修有多层阶梯(百步梯),气势恢宏。整体建筑群布局精巧,轴线明晰,与樱花娇嫩形成鲜明对比,共同构成武汉大学“近现代中国大学校园建筑典范”的特色。近年来,学校完成了文理学部图书馆新馆扩建、学生公寓等21项工程,并建设了人才公寓等7项项目,汉林广场的修建实现了南北校区无缝对接,新图书馆、万林艺术博物馆等现代建筑相继落成,这些新建筑在设计中延续了传统元素如绿瓦屋顶、灰砖墙和抬升基座,既传承了百年学府的遗产,又展现了创新精神。校园内古色古香的建筑、浓郁的学习氛围、多姿多彩的校园生活以及宜人的自然环境,无一不流露出非凡魅力和丰富内涵,吸引无数游客和学者,营造出浓厚的历史与学术氛围。  
22 -  
23 -## 师资力量与学生生活  
24 -  
25 -武汉大学拥有雄厚的师资力量,截至2024年9月,学校共有专任教师2487人,其中具有高级职称的专任教师2318人(含正高级1102人,副高级1216人),占专任教师的比例为93.20%;具有研究生学位(硕士和博士)的教师比例高,队伍规模合理、结构优化、素质优良。知名学者包括中国工程院院士刘经南教授等担任首席顾问,学校注重高水平教师队伍建设,并逐步提高教师国际化水平,形成评价公正、开放包容的一流师资管理模式。硬件设施完善,建有现代化教学区、实验实训区、图书馆、体育馆及配备独立卫浴和空调的学生公寓,梅园食堂等餐饮场所提供优质服务。学校专注于小而精、与国际接轨的教育模式,为学生提供优质的科研条件和个性化指导。学生规模方面,学校注重高质量培养,同时拥有丰富的社团活动,包括学术类、实践类、艺术类、体育类和公益类等79个学生社团,支持学生通过专业赛事、暑期社会实践(如辩论队活动,由新闻与传播学院学生陈铭担任队长)等项目发展兴趣和锻炼能力,校园生活设施齐全,为学生创造了全面的学术与生活体验。  
26 -  
27 -## 国际合作与社会贡献  
28 -  
29 -武汉大学在国际合作与社会贡献方面取得了显著成就。学校于2006年成立了国际问题研究院,推动跨学科国际问题研究与人才培养,为国际问题研究提供智力支持,社会服务能力和社会影响力不断增强。在国际交流方面,武汉大学积极开展港澳台学生教育管理,并组织专题调研活动,建立了国际交流部负责学生出国事务。学校与埃塞俄比亚等非洲国家建立了重要战略合作伙伴关系,将中非合作作为国际交流的重要方向,同时与耶鲁大学等国际知名高校开展兼具人才培养与社会服务功能的国际合作项目。此外,武汉大学的国际服务项目为学生提供海外学习和研究机会,推动高层次国际交流。毕业生就业方面,学校培养的人才受到国际知名企业如普华永道的青睐,通过海外学子招聘计划(CSI)等渠道,毕业生在国内外职场展现出广泛影响力。普华永道等企业为武汉大学毕业生提供年薪8-15万元的优厚待遇,特别重视'双师型'人才和具有专业职称的人员。学校还通过发挥毕业生就业和社会评价对人才培养的反馈机制效用,建立了多层次、宽领域、立体化的国际合作与交流体系,体现了武汉大学在国际化教育和社会服务方面的卓越贡献。  
30 -  
31 -## 结论  
32 -  
33 -综上所述,武汉大学作为一所拥有130年悠久历史的顶尖综合性大学,在历史底蕴、学科建设、科研实力、校园环境、师资力量、国际合作等方面均表现出色。学校不仅在国内高等教育中稳居前列,位列“双一流A类”、“985工程”和“211工程”重点建设高校,还在国际排名中持续提升,全面进入全球前200。学科门类齐全,拥有11个双一流建设学科,科研产出丰硕,师资力量雄厚,校园环境优美融合自然与人文特色。通过广泛的国际合作和社会贡献,武汉大学培养了众多杰出人才,为国家和社会发展提供了重要支持。未来,学校有望继续发挥其综合优势,稳步向世界一流大学目标迈进,为国家自强和全球高等教育发展做出更大贡献。  
@@ -235,6 +235,144 @@ @@ -235,6 +235,144 @@
235 animation: spin 1s ease-in-out infinite; 235 animation: spin 1s ease-in-out infinite;
236 } 236 }
237 237
  238 + /* 专门用于报告状态的加载指示器,不会让整个容器旋转 */
  239 + .report-loading-spinner {
  240 + display: inline-block;
  241 + width: 16px;
  242 + height: 16px;
  243 + border: 2px solid #ffa500;
  244 + border-radius: 50%;
  245 + border-top-color: transparent;
  246 + animation: spin 1s ease-in-out infinite;
  247 + margin-right: 8px;
  248 + vertical-align: middle;
  249 + }
  250 +
  251 + /* 任务进度条样式 */
  252 + .task-progress-container {
  253 + margin: 0; /* 移除margin,使用父容器的gap控制间距 */
  254 + padding: 20px;
  255 + border: 2px solid #000000;
  256 + background-color: #f5f5f0;
  257 + }
  258 +
  259 + .task-progress-header {
  260 + display: flex;
  261 + align-items: center;
  262 + justify-content: space-between;
  263 + margin-bottom: 15px;
  264 + font-weight: bold;
  265 + font-size: 16px;
  266 + }
  267 +
  268 + .task-progress-title {
  269 + display: flex;
  270 + align-items: center;
  271 + flex-shrink: 0;
  272 + }
  273 +
  274 + .task-progress-bar {
  275 + width: 200px;
  276 + height: 20px;
  277 + background-color: #e8e8e0;
  278 + border: 1px solid #666666;
  279 + margin-left: 20px;
  280 + position: relative;
  281 + overflow: hidden;
  282 + border-radius: 3px;
  283 + flex-shrink: 0;
  284 + }
  285 +
  286 + .task-progress-fill {
  287 + height: 100%;
  288 + background: linear-gradient(90deg, #6b8a5a 0%, #8fb584 100%);
  289 + transition: width 0.5s ease;
  290 + position: absolute;
  291 + top: 0;
  292 + left: 0;
  293 + z-index: 1;
  294 + min-width: 2px; /* 确保即使是0%也有一点显示 */
  295 + }
  296 +
  297 + .task-progress-text {
  298 + position: absolute;
  299 + top: 50%;
  300 + left: 50%;
  301 + transform: translate(-50%, -50%);
  302 + color: #000000;
  303 + font-weight: bold;
  304 + font-size: 12px;
  305 + z-index: 2;
  306 + pointer-events: none;
  307 + }
  308 +
  309 + .task-info-line {
  310 + display: flex;
  311 + align-items: center;
  312 + margin-top: 10px;
  313 + font-size: 13px;
  314 + padding: 8px;
  315 + background-color: #f0f0e8;
  316 + border: 1px solid #d0d0c0;
  317 + border-radius: 3px;
  318 + }
  319 +
  320 + .task-info-item {
  321 + display: flex;
  322 + align-items: center;
  323 + margin-right: 30px;
  324 + }
  325 +
  326 + .task-info-item:last-child {
  327 + margin-right: 0;
  328 + }
  329 +
  330 + .task-info-label {
  331 + font-weight: bold;
  332 + color: #666;
  333 + margin-right: 8px;
  334 + }
  335 +
  336 + .task-info-value {
  337 + color: #000;
  338 + }
  339 +
  340 + .task-status-badge {
  341 + display: inline-block;
  342 + padding: 4px 12px;
  343 + border-radius: 15px;
  344 + font-size: 12px;
  345 + font-weight: bold;
  346 + margin-left: 10px;
  347 + }
  348 +
  349 + .task-status-running {
  350 + background-color: #fff3cd;
  351 + color: #856404;
  352 + border: 1px solid #ffeaa7;
  353 + }
  354 +
  355 + .task-status-completed {
  356 + background-color: #d4edda;
  357 + color: #155724;
  358 + border: 1px solid #c3e6cb;
  359 + }
  360 +
  361 + .task-status-error {
  362 + background-color: #f8d7da;
  363 + color: #721c24;
  364 + border: 1px solid #f5c6cb;
  365 + }
  366 +
  367 + .task-error-message {
  368 + margin-top: 15px;
  369 + padding: 10px;
  370 + background-color: #ffe6e6;
  371 + border-left: 4px solid #ff4444;
  372 + border-radius: 3px;
  373 + font-size: 13px;
  374 + }
  375 +
238 @keyframes spin { 376 @keyframes spin {
239 to { transform: rotate(360deg); } 377 to { transform: rotate(360deg); }
240 } 378 }
@@ -445,9 +583,14 @@ @@ -445,9 +583,14 @@
445 583
446 .report-content { 584 .report-content {
447 flex: 1; 585 flex: 1;
448 - padding: 20px; 586 + padding: 10px 20px 20px 20px; /* 减少上边距 */
449 overflow-y: auto; 587 overflow-y: auto;
  588 + overflow-x: hidden;
450 background-color: #ffffff; 589 background-color: #ffffff;
  590 + display: flex;
  591 + flex-direction: column;
  592 + min-height: 0; /* 允许子元素缩小 */
  593 + gap: 15px; /* 统一子元素间距 */
451 } 594 }
452 595
453 .report-controls { 596 .report-controls {
@@ -489,38 +632,45 @@ @@ -489,38 +632,45 @@
489 632
490 .report-status { 633 .report-status {
491 padding: 15px; 634 padding: 15px;
492 - margin: 10px 0; 635 + margin: 0; /* 移除margin,使用父容器的gap控制间距 */
493 border: 2px solid #000000; 636 border: 2px solid #000000;
494 background-color: #f8f9fa; 637 background-color: #f8f9fa;
495 font-family: 'Courier New', monospace; 638 font-family: 'Courier New', monospace;
496 } 639 }
497 640
498 .report-status.loading { 641 .report-status.loading {
499 - border-color: #ffa500;  
500 - background-color: #fff8e1; 642 + border-color: #b8860b;
  643 + background-color: #faf5e6;
  644 + /* 确保loading状态的报告框不会旋转 */
  645 + animation: none;
501 } 646 }
502 647
503 .report-status.success { 648 .report-status.success {
504 - border-color: #00aa00;  
505 - background-color: #f0fff0; 649 + border-color: #4a6741;
  650 + background-color: #f0f5ed;
506 } 651 }
507 652
508 .report-status.error { 653 .report-status.error {
509 - border-color: #aa0000;  
510 - background-color: #fff0f0; 654 + border-color: #8b4513;
  655 + background-color: #fdf5e6;
511 } 656 }
512 657
513 .report-preview { 658 .report-preview {
514 border: 2px solid #000000; 659 border: 2px solid #000000;
515 background-color: #ffffff; 660 background-color: #ffffff;
516 min-height: 400px; 661 min-height: 400px;
  662 + max-height: none; /* 移除最大高度限制 */
517 overflow-y: auto; 663 overflow-y: auto;
  664 + overflow-x: hidden;
  665 + flex: 1; /* 让预览区域占用剩余空间 */
518 } 666 }
519 667
520 .report-preview iframe { 668 .report-preview iframe {
521 width: 100%; 669 width: 100%;
522 - height: 100%; 670 + min-height: 400px;
523 border: none; 671 border: none;
  672 + /* 让iframe自适应内容高度 */
  673 + height: auto;
524 } 674 }
525 675
526 .report-loading { 676 .report-loading {
@@ -812,7 +962,17 @@ @@ -812,7 +962,17 @@
812 // 清空控制台并加载report日志 962 // 清空控制台并加载report日志
813 document.getElementById('consoleOutput').innerHTML = '<div class="console-line">[系统] 切换到报告生成模式</div>'; 963 document.getElementById('consoleOutput').innerHTML = '<div class="console-line">[系统] 切换到报告生成模式</div>';
814 loadReportLog(); 964 loadReportLog();
  965 +
  966 + // 只在报告界面未初始化时才重新加载
  967 + const reportContent = document.getElementById('reportContent');
  968 + if (!reportContent || reportContent.children.length === 0) {
815 loadReportInterface(); 969 loadReportInterface();
  970 + }
  971 +
  972 + // 切换到report页面时检查是否可以自动生成报告
  973 + setTimeout(() => {
  974 + checkReportLockStatus();
  975 + }, 500);
816 976
817 } else { 977 } else {
818 // 切换到普通Engine模式 978 // 切换到普通Engine模式
@@ -1257,7 +1417,9 @@ @@ -1257,7 +1417,9 @@
1257 } 1417 }
1258 1418
1259 // 刷新Report Engine日志 1419 // 刷新Report Engine日志
1260 - // 检查Report Engine锁定状态 1420 + // 检查Report Engine锁定状态并自动生成报告
  1421 + let autoGenerateTriggered = false; // 防止重复触发
  1422 +
1261 function checkReportLockStatus() { 1423 function checkReportLockStatus() {
1262 fetch('/api/report/status') 1424 fetch('/api/report/status')
1263 .then(response => response.json()) 1425 .then(response => response.json())
@@ -1268,17 +1430,26 @@ @@ -1268,17 +1430,26 @@
1268 // 文件准备就绪,解锁按钮 1430 // 文件准备就绪,解锁按钮
1269 reportButton.classList.remove('locked'); 1431 reportButton.classList.remove('locked');
1270 reportButton.title = 'Report Engine - 智能报告生成\n所有引擎都有新文件,可以生成报告'; 1432 reportButton.title = 'Report Engine - 智能报告生成\n所有引擎都有新文件,可以生成报告';
  1433 +
  1434 + // 如果当前在report页面且还没有触发自动生成,则自动生成报告
  1435 + if (currentApp === 'report' && !autoGenerateTriggered && !reportTaskId) {
  1436 + autoGenerateTriggered = true;
  1437 + console.log('检测到锁消失,自动开始生成报告');
  1438 + setTimeout(() => {
  1439 + generateReport();
  1440 + }, 1000); // 延迟1秒开始生成
  1441 + }
1271 } else { 1442 } else {
1272 // 文件未准备就绪,锁定按钮 1443 // 文件未准备就绪,锁定按钮
1273 reportButton.classList.add('locked'); 1444 reportButton.classList.add('locked');
1274 1445
1275 // 构建详细的提示信息 1446 // 构建详细的提示信息
1276 - let titleInfo = 'Report Engine暂时锁定\n'; 1447 + let titleInfo = '\n';
1277 1448
1278 if (data.missing_files && data.missing_files.length > 0) { 1449 if (data.missing_files && data.missing_files.length > 0) {
1279 titleInfo += '等待新文件:\n' + data.missing_files.join('\n'); 1450 titleInfo += '等待新文件:\n' + data.missing_files.join('\n');
1280 } else { 1451 } else {
1281 - titleInfo += '等待三个分析引擎都产生新的报告文件'; 1452 + titleInfo += '等待三个Agent工作完毕';
1282 } 1453 }
1283 1454
1284 reportButton.title = titleInfo; 1455 reportButton.title = titleInfo;
@@ -1512,42 +1683,17 @@ @@ -1512,42 +1683,17 @@
1512 const reportContent = document.getElementById('reportContent'); 1683 const reportContent = document.getElementById('reportContent');
1513 1684
1514 let interfaceHTML = ` 1685 let interfaceHTML = `
1515 - <div class="report-controls">  
1516 - <button class="report-button primary" onclick="generateReport()" id="generateBtn">  
1517 - 生成最终报告  
1518 - </button>  
1519 - <button class="report-button" onclick="checkReportStatus()" id="statusBtn">  
1520 - 检查状态  
1521 - </button> 1686 + <!-- 固定的状态信息块 -->
  1687 + <div class="engine-status-info" id="engineStatusBlock">
  1688 + <div class="report-status" id="engineStatusContent">
  1689 + <div>正在初始化...</div>
1522 </div> 1690 </div>
1523 - `;  
1524 -  
1525 - // 显示状态信息  
1526 - if (statusData.initialized) {  
1527 - interfaceHTML += `  
1528 - <div class="report-status success">  
1529 - <strong>ReportEngine状态:</strong> 已初始化<br>  
1530 - <strong>文件检查:</strong> ${statusData.engines_ready ? '准备就绪' : '文件未就绪'}<br>  
1531 - <strong>找到文件:</strong> ${statusData.files_found ? statusData.files_found.join(', ') : '无'}<br>  
1532 - ${statusData.missing_files && statusData.missing_files.length > 0 ?  
1533 - `<strong>缺失文件:</strong> ${statusData.missing_files.join(', ')}` : ''}  
1534 - </div>  
1535 - `;  
1536 - } else {  
1537 - interfaceHTML += `  
1538 - <div class="report-status error">  
1539 - <strong>ReportEngine状态:</strong> 未初始  
1540 </div> 1691 </div>
1541 - `;  
1542 - }  
1543 1692
1544 - // 如果有当前任务,显示任务状态  
1545 - if (statusData.current_task) {  
1546 - interfaceHTML += renderTaskStatus(statusData.current_task);  
1547 - } 1693 + <!-- 任务进度区域 -->
  1694 + <div id="taskProgressArea"></div>
1548 1695
1549 - // 添加报告预览区域  
1550 - interfaceHTML += ` 1696 + <!-- 报告预览区域 -->
1551 <div class="report-preview" id="reportPreview"> 1697 <div class="report-preview" id="reportPreview">
1552 <div class="report-loading"> 1698 <div class="report-loading">
1553 点击"生成最终报告"开始生成综合分析报告 1699 点击"生成最终报告"开始生成综合分析报告
@@ -1556,29 +1702,80 @@ @@ -1556,29 +1702,80 @@
1556 `; 1702 `;
1557 1703
1558 reportContent.innerHTML = interfaceHTML; 1704 reportContent.innerHTML = interfaceHTML;
  1705 +
  1706 + // 立即更新状态信息
  1707 + updateEngineStatusDisplay(statusData);
  1708 +
  1709 + // 如果有当前任务,显示任务状态
  1710 + if (statusData.current_task) {
  1711 + const taskArea = document.getElementById('taskProgressArea');
  1712 + if (taskArea) {
  1713 + taskArea.innerHTML = renderTaskStatus(statusData.current_task);
  1714 + }
  1715 + }
1559 } 1716 }
1560 1717
1561 - // 渲染任务状态 1718 + // 渲染任务状态(使用新的进度条样式)
1562 function renderTaskStatus(task) { 1719 function renderTaskStatus(task) {
1563 - const statusClass = task.status === 'completed' ? 'success' :  
1564 - task.status === 'error' ? 'error' : 'loading'; 1720 + // 状态文本的中文映射
  1721 + const statusText = {
  1722 + 'running': '正在生成',
  1723 + 'completed': '已完成',
  1724 + 'error': '生成失败',
  1725 + 'pending': '等待中'
  1726 + };
  1727 +
  1728 + // 状态徽章样式
  1729 + const statusBadgeClass = {
  1730 + 'running': 'task-status-running',
  1731 + 'completed': 'task-status-completed',
  1732 + 'error': 'task-status-error',
  1733 + 'pending': 'task-status-running'
  1734 + };
  1735 +
  1736 + // 为运行状态添加加载指示器
  1737 + const loadingIndicator = task.status !== 'completed' && task.status !== 'error'
  1738 + ? '<span class="report-loading-spinner"></span>'
  1739 + : '';
1565 1740
1566 let statusHTML = ` 1741 let statusHTML = `
1567 - <div class="report-status ${statusClass}">  
1568 - <strong>任务ID:</strong> ${task.task_id}<br>  
1569 - <strong>查询:</strong> ${task.query}<br>  
1570 - <strong>状态:</strong> ${task.status}<br>  
1571 - <strong>进度:</strong> ${task.progress}%<br>  
1572 - <strong>创建时间:</strong> ${new Date(task.created_at).toLocaleString()}<br>  
1573 - <strong>更新时间:</strong> ${new Date(task.updated_at).toLocaleString()} 1742 + <div class="task-progress-container">
  1743 + <div class="task-progress-header">
  1744 + <div class="task-progress-title">
  1745 + ${loadingIndicator}报告生成任务
  1746 + </div>
  1747 + <div class="task-progress-bar">
  1748 + <div class="task-progress-fill" style="width: ${Math.min(Math.max(task.progress || 0, 0), 100)}%"></div>
  1749 + <div class="task-progress-text">${task.progress || 0}%</div>
  1750 + </div>
  1751 + </div>
  1752 +
  1753 + <div class="task-info-line">
  1754 + <div class="task-info-item">
  1755 + <span class="task-info-label">任务ID:</span>
  1756 + <span class="task-info-value">${task.task_id}</span>
  1757 + </div>
  1758 + <div class="task-info-item">
  1759 + <span class="task-info-label">查询内容:</span>
  1760 + <span class="task-info-value">${task.query}</span>
  1761 + </div>
  1762 + <div class="task-info-item">
  1763 + <span class="task-info-label">开始时间:</span>
  1764 + <span class="task-info-value">${new Date(task.created_at).toLocaleString()}</span>
  1765 + </div>
  1766 + <div class="task-info-item">
  1767 + <span class="task-info-label">更新时间:</span>
  1768 + <span class="task-info-value">${new Date(task.updated_at).toLocaleString()}</span>
  1769 + </div>
  1770 + </div>
1574 `; 1771 `;
1575 1772
1576 if (task.error_message) { 1773 if (task.error_message) {
1577 - statusHTML += `<br><strong>错误信息:</strong> ${task.error_message}`;  
1578 - }  
1579 -  
1580 - if (task.has_result) {  
1581 - statusHTML += `<br><button class="report-button" onclick="viewReport('${task.task_id}')">查看报告</button>`; 1774 + statusHTML += `
  1775 + <div class="task-error-message">
  1776 + <strong>错误信息:</strong> ${task.error_message}
  1777 + </div>
  1778 + `;
1582 } 1779 }
1583 1780
1584 statusHTML += '</div>'; 1781 statusHTML += '</div>';
@@ -1596,9 +1793,10 @@ @@ -1596,9 +1793,10 @@
1596 const consoleOutput = document.getElementById('consoleOutput'); 1793 const consoleOutput = document.getElementById('consoleOutput');
1597 consoleOutput.innerHTML = '<div class="console-line">[系统] 开始生成报告,日志已重置</div>'; 1794 consoleOutput.innerHTML = '<div class="console-line">[系统] 开始生成报告,日志已重置</div>';
1598 1795
1599 - const generateBtn = document.getElementById('generateBtn');  
1600 - generateBtn.disabled = true;  
1601 - generateBtn.textContent = '生成中...'; 1796 + // 按钮已移除,无需操作按钮状态
  1797 +
  1798 + // 在现有状态信息后添加任务进度状态,而不是替换
  1799 + addTaskProgressStatus('正在启动报告生成任务...', 'loading');
1602 1800
1603 fetch('/api/report/generate', { 1801 fetch('/api/report/generate', {
1604 method: 'POST', 1802 method: 'POST',
@@ -1613,6 +1811,16 @@ @@ -1613,6 +1811,16 @@
1613 reportTaskId = data.task_id; 1811 reportTaskId = data.task_id;
1614 showMessage('报告生成已启动', 'success'); 1812 showMessage('报告生成已启动', 'success');
1615 1813
  1814 + // 更新任务状态显示
  1815 + updateTaskProgressStatus({
  1816 + task_id: data.task_id,
  1817 + query: query,
  1818 + status: 'running',
  1819 + progress: 5, // 初始进度设为5%,确保进度条可见
  1820 + created_at: new Date().toISOString(),
  1821 + updated_at: new Date().toISOString()
  1822 + });
  1823 +
1616 // 立即刷新一次日志以确保同步 1824 // 立即刷新一次日志以确保同步
1617 setTimeout(() => { 1825 setTimeout(() => {
1618 refreshReportLog(); 1826 refreshReportLog();
@@ -1621,16 +1829,18 @@ @@ -1621,16 +1829,18 @@
1621 // 开始轮询任务状态 1829 // 开始轮询任务状态
1622 startProgressPolling(data.task_id); 1830 startProgressPolling(data.task_id);
1623 } else { 1831 } else {
1624 - showMessage('启动失败: ' + data.error, 'error');  
1625 - generateBtn.disabled = false;  
1626 - generateBtn.textContent = '生成最终报告'; 1832 + updateTaskProgressStatus(null, 'error', '启动失败: ' + data.error);
  1833 + // 重置标志允许重新尝试
  1834 + autoGenerateTriggered = false;
  1835 + reportTaskId = null;
1627 } 1836 }
1628 }) 1837 })
1629 .catch(error => { 1838 .catch(error => {
1630 console.error('生成报告失败:', error); 1839 console.error('生成报告失败:', error);
1631 - showMessage('生成报告失败: ' + error.message, 'error');  
1632 - generateBtn.disabled = false;  
1633 - generateBtn.textContent = '生成最终报告'; 1840 + updateTaskProgressStatus(null, 'error', '生成报告失败: ' + error.message);
  1841 + // 重置标志允许重新尝试
  1842 + autoGenerateTriggered = false;
  1843 + reportTaskId = null;
1634 }); 1844 });
1635 } 1845 }
1636 1846
@@ -1663,18 +1873,16 @@ @@ -1663,18 +1873,16 @@
1663 // 自动显示报告 1873 // 自动显示报告
1664 viewReport(taskId); 1874 viewReport(taskId);
1665 1875
1666 - // 重新启用生成按钮  
1667 - const generateBtn = document.getElementById('generateBtn');  
1668 - generateBtn.disabled = false;  
1669 - generateBtn.textContent = '生成最终报告'; 1876 + // 重置自动生成标志,允许下次自动生成
  1877 + autoGenerateTriggered = false;
  1878 + reportTaskId = null;
1670 } else if (data.task.status === 'error') { 1879 } else if (data.task.status === 'error') {
1671 clearInterval(reportPollingInterval); 1880 clearInterval(reportPollingInterval);
1672 showMessage('报告生成失败: ' + data.task.error_message, 'error'); 1881 showMessage('报告生成失败: ' + data.task.error_message, 'error');
1673 1882
1674 - // 重新启用生成按钮  
1675 - const generateBtn = document.getElementById('generateBtn');  
1676 - generateBtn.disabled = false;  
1677 - generateBtn.textContent = '生成最终报告'; 1883 + // 重置自动生成标志,允许重新尝试
  1884 + autoGenerateTriggered = false;
  1885 + reportTaskId = null;
1678 } 1886 }
1679 } 1887 }
1680 }) 1888 })
@@ -1683,20 +1891,61 @@ @@ -1683,20 +1891,61 @@
1683 }); 1891 });
1684 } 1892 }
1685 1893
1686 - // 更新进度显示  
1687 - function updateProgressDisplay(task) {  
1688 - const reportContent = document.getElementById('reportContent');  
1689 - const existingStatus = reportContent.querySelector('.report-status'); 1894 + // 添加任务进度状态(使用固定区域)
  1895 + function addTaskProgressStatus(message, status) {
  1896 + const taskArea = document.getElementById('taskProgressArea');
  1897 +
  1898 + if (taskArea) {
  1899 + const loadingIndicator = status === 'loading' ? '<span class="report-loading-spinner"></span>' : '';
1690 1900
1691 - if (existingStatus) {  
1692 - existingStatus.outerHTML = renderTaskStatus(task); 1901 + taskArea.innerHTML = `
  1902 + <div class="task-progress-container">
  1903 + <div class="task-progress-header">
  1904 + ${loadingIndicator}任务状态: ${message}
  1905 + </div>
  1906 + </div>
  1907 + `;
  1908 + }
1693 } 1909 }
  1910 +
  1911 + // 更新任务进度状态(使用固定区域)
  1912 + function updateTaskProgressStatus(task, status = null, errorMessage = null) {
  1913 + const taskArea = document.getElementById('taskProgressArea');
  1914 +
  1915 + if (!taskArea) {
  1916 + console.error('taskProgressArea not found');
  1917 + return;
  1918 + }
  1919 +
  1920 + if (task) {
  1921 + taskArea.innerHTML = renderTaskStatus(task);
  1922 + } else if (status && errorMessage) {
  1923 + const loadingIndicator = status === 'loading' ? '<span class="report-loading-spinner"></span>' : '';
  1924 + const statusBadgeClass = status === 'error' ? 'task-status-error' : 'task-status-running';
  1925 + const statusText = status === 'error' ? '错误' : '处理中';
  1926 +
  1927 + taskArea.innerHTML = `
  1928 + <div class="task-progress-container">
  1929 + <div class="task-progress-header">
  1930 + ${loadingIndicator}任务状态: ${statusText}
  1931 + </div>
  1932 + <div style="margin-top: 10px; font-size: 14px;">
  1933 + ${errorMessage}
  1934 + </div>
  1935 + </div>
  1936 + `;
  1937 + }
  1938 + }
  1939 +
  1940 + // 更新进度显示(保持向后兼容)
  1941 + function updateProgressDisplay(task) {
  1942 + updateTaskProgressStatus(task);
1694 } 1943 }
1695 1944
1696 // 查看报告 1945 // 查看报告
1697 function viewReport(taskId) { 1946 function viewReport(taskId) {
1698 const reportPreview = document.getElementById('reportPreview'); 1947 const reportPreview = document.getElementById('reportPreview');
1699 - reportPreview.innerHTML = '<div class="report-loading">加载报告中...</div>'; 1948 + reportPreview.innerHTML = '<div class="report-loading"><span class="report-loading-spinner"></span>加载报告中...</div>';
1700 1949
1701 fetch(`/api/report/result/${taskId}`) 1950 fetch(`/api/report/result/${taskId}`)
1702 .then(response => { 1951 .then(response => {
@@ -1706,12 +1955,33 @@ @@ -1706,12 +1955,33 @@
1706 throw new Error('报告加载失败'); 1955 throw new Error('报告加载失败');
1707 } 1956 }
1708 }) 1957 })
1709 - .then(htmlContent => { 1958 + .then(rawContent => {
  1959 + let htmlContent = rawContent;
  1960 +
  1961 + // 检查是否是JSON格式的响应(包含html_content字段)
  1962 + try {
  1963 + if (rawContent.includes('"html_content":')) {
  1964 + // 提取JSON中的html_content
  1965 + const jsonMatch = rawContent.match(/\{[\s\S]*\}/);
  1966 + if (jsonMatch) {
  1967 + const jsonData = JSON.parse(jsonMatch[0]);
  1968 + if (jsonData.html_content) {
  1969 + htmlContent = jsonData.html_content;
  1970 + // 处理转义字符
  1971 + htmlContent = htmlContent.replace(/\\"/g, '"').replace(/\\n/g, '\n');
  1972 + }
  1973 + }
  1974 + }
  1975 + } catch (e) {
  1976 + console.warn('解析JSON格式报告失败,使用原始内容:', e);
  1977 + }
  1978 +
1710 // 创建iframe来显示HTML内容 1979 // 创建iframe来显示HTML内容
1711 const iframe = document.createElement('iframe'); 1980 const iframe = document.createElement('iframe');
1712 iframe.style.width = '100%'; 1981 iframe.style.width = '100%';
1713 - iframe.style.height = '600px';  
1714 iframe.style.border = 'none'; 1982 iframe.style.border = 'none';
  1983 + iframe.style.minHeight = '800px'; // 增加最小高度
  1984 + iframe.id = 'report-iframe';
1715 1985
1716 reportPreview.innerHTML = ''; 1986 reportPreview.innerHTML = '';
1717 reportPreview.appendChild(iframe); 1987 reportPreview.appendChild(iframe);
@@ -1720,6 +1990,61 @@ @@ -1720,6 +1990,61 @@
1720 iframe.contentDocument.open(); 1990 iframe.contentDocument.open();
1721 iframe.contentDocument.write(htmlContent); 1991 iframe.contentDocument.write(htmlContent);
1722 iframe.contentDocument.close(); 1992 iframe.contentDocument.close();
  1993 +
  1994 + // 等待内容加载完成后调整iframe高度
  1995 + iframe.onload = function() {
  1996 + setTimeout(() => {
  1997 + try {
  1998 + // 获取iframe内容的实际高度
  1999 + const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
  2000 +
  2001 + // 等待所有资源加载完成
  2002 + let contentHeight = 0;
  2003 +
  2004 + // 尝试多种方式获取内容高度
  2005 + if (iframeDoc.body) {
  2006 + contentHeight = Math.max(
  2007 + iframeDoc.body.scrollHeight || 0,
  2008 + iframeDoc.body.offsetHeight || 0,
  2009 + iframeDoc.body.clientHeight || 0
  2010 + );
  2011 + }
  2012 +
  2013 + if (iframeDoc.documentElement) {
  2014 + contentHeight = Math.max(
  2015 + contentHeight,
  2016 + iframeDoc.documentElement.scrollHeight || 0,
  2017 + iframeDoc.documentElement.offsetHeight || 0,
  2018 + iframeDoc.documentElement.clientHeight || 0
  2019 + );
  2020 + }
  2021 +
  2022 + // 设置iframe高度为内容高度,最小800px
  2023 + const finalHeight = Math.max(contentHeight + 100, 800); // 添加100px的缓冲
  2024 + iframe.style.height = finalHeight + 'px';
  2025 +
  2026 + console.log(`报告iframe高度已调整为: ${finalHeight}px (内容高度: ${contentHeight}px)`);
  2027 +
  2028 + // 确保父容器也能正确显示
  2029 + reportPreview.style.minHeight = finalHeight + 'px';
  2030 +
  2031 + } catch (error) {
  2032 + console.error('调整iframe高度失败:', error);
  2033 + // 如果调整失败,使用更大的默认高度
  2034 + iframe.style.height = '1200px';
  2035 + reportPreview.style.minHeight = '1200px';
  2036 + }
  2037 + }, 1000); // 延迟1秒等待内容完全渲染
  2038 + };
  2039 +
  2040 + // 备用方案:如果onload没有触发,延迟调整高度
  2041 + setTimeout(() => {
  2042 + if (iframe.style.height === 'auto' || iframe.style.height === '') {
  2043 + iframe.style.height = '1200px';
  2044 + reportPreview.style.minHeight = '1200px';
  2045 + console.log('使用备用高度设置: 1200px');
  2046 + }
  2047 + }, 3000);
1723 }) 2048 })
1724 .catch(error => { 2049 .catch(error => {
1725 console.error('查看报告失败:', error); 2050 console.error('查看报告失败:', error);
@@ -1731,9 +2056,65 @@ @@ -1731,9 +2056,65 @@
1731 }); 2056 });
1732 } 2057 }
1733 2058
1734 - // 检查报告状态 2059 + // 检查报告状态(不重新加载整个界面)
1735 function checkReportStatus() { 2060 function checkReportStatus() {
1736 - loadReportInterface(); 2061 + // 只更新状态信息,不重新渲染整个界面
  2062 + fetch('/api/report/status')
  2063 + .then(response => response.json())
  2064 + .then(data => {
  2065 + if (data.success) {
  2066 + // 更新ReportEngine状态指示器
  2067 + const indicator = document.getElementById('status-report');
  2068 + if (indicator) {
  2069 + if (data.initialized) {
  2070 + indicator.className = 'status-indicator running';
  2071 + appStatus.report = 'running';
  2072 + } else {
  2073 + indicator.className = 'status-indicator';
  2074 + appStatus.report = 'stopped';
  2075 + }
  2076 + }
  2077 +
  2078 + // 更新状态信息(如果存在)
  2079 + updateEngineStatusDisplay(data);
  2080 +
  2081 + showMessage('状态检查完成', 'success');
  2082 + } else {
  2083 + showMessage('状态检查失败: ' + data.error, 'error');
  2084 + }
  2085 + })
  2086 + .catch(error => {
  2087 + console.error('检查报告状态失败:', error);
  2088 + showMessage('状态检查失败: ' + error.message, 'error');
  2089 + });
  2090 + }
  2091 +
  2092 + // 更新引擎状态显示(只更新文本内容)
  2093 + function updateEngineStatusDisplay(statusData) {
  2094 + const statusContent = document.getElementById('engineStatusContent');
  2095 +
  2096 + if (statusContent) {
  2097 + // 确定状态样式
  2098 + const statusClass = statusData.initialized ? 'success' : 'error';
  2099 +
  2100 + // 更新状态信息内容
  2101 + let statusHTML = '';
  2102 + if (statusData.initialized) {
  2103 + statusHTML = `
  2104 + <strong>ReportEngine状态:</strong> 已初始化<br>
  2105 + <strong>文件检查:</strong> ${statusData.engines_ready ? '准备就绪' : '文件未就绪'}<br>
  2106 + <strong>找到文件:</strong> ${statusData.files_found ? statusData.files_found.join(', ') : '无'}<br>
  2107 + ${statusData.missing_files && statusData.missing_files.length > 0 ?
  2108 + `<strong>缺失文件:</strong> ${statusData.missing_files.join(', ')}` : ''}
  2109 + `;
  2110 + } else {
  2111 + statusHTML = `<strong>ReportEngine状态:</strong> 未初始化`;
  2112 + }
  2113 +
  2114 + // 更新内容和样式
  2115 + statusContent.innerHTML = statusHTML;
  2116 + statusContent.className = `report-status ${statusClass}`;
  2117 + }
1737 } 2118 }
1738 </script> 2119 </script>
1739 </body> 2120 </body>