💻 源码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>LLM 安全攻防演示平台</title>
  <link rel="stylesheet" href="/static/css/style.css" />
</head>
<body>
  <header class="header">
    <div class="header-brand">
      <div class="logo">🛡️</div>
      <div>
        <h1>LLM 安全攻防演示平台</h1>
        <p class="subtitle">看得见攻击 · 看得见后果 · 看得见防御生效</p>
      </div>
    </div>
    <div class="header-actions">
      <div class="steps-hint">
        <span class="step">① 选样本</span>
        <span class="step-arrow">→</span>
        <span class="step">② 发攻击</span>
        <span class="step-arrow">→</span>
        <span class="step">③ 看对比</span>
      </div>
      <button id="btnRedteam" class="btn btn-outline">红队批量测试</button>
    </div>
  </header>

  <div id="defenseWarning" class="defense-warning hidden"></div>

  <main class="layout">
    <!-- 左侧:场景与样本 -->
    <aside class="sidebar">
      <section class="panel">
        <div class="panel-title">
          <span class="panel-icon">📂</span>
          <h2>攻击场景</h2>
        </div>
        <div id="scenarioTabs" class="tabs"></div>
      </section>

      <section class="panel">
        <div class="panel-title">
          <span class="panel-icon">🎯</span>
          <h2>攻击样本库</h2>
        </div>
        <p id="scenarioDesc" class="desc"></p>
        <ul id="sampleList" class="sample-list"></ul>
      </section>

      <section class="panel attack-guide">
        <div class="panel-title">
          <span class="panel-icon">📖</span>
          <h2>攻击说明</h2>
        </div>
        <div id="attackGuide">
          <p class="empty-hint">选择样本后,这里会显示攻击手法与预期后果</p>
        </div>
      </section>
    </aside>

    <!-- 中间:实验区 -->
    <section class="main-content">
      <div class="input-area panel">
        <div class="panel-title">
          <span class="panel-icon">⚡</span>
          <h2>攻击输入</h2>
        </div>
        <textarea id="attackInput" rows="4" placeholder="输入攻击 payload,或从左侧选择样本一键填充…"></textarea>
        <div class="input-actions">
          <button id="btnSend" class="btn btn-primary">
            <span class="btn-icon">▶</span> 发送对比实验
          </button>
          <span id="loadingHint" class="loading hidden">处理中…</span>
        </div>
      </div>

      <div class="compare-section-label">实验结果对比</div>
      <div id="compareSummary" class="compare-summary hidden">
        <div class="summary-side summary-vuln">
          <span class="summary-label">无防护模式</span>
          <span id="summaryVulnStatus" class="summary-status">—</span>
          <span id="summaryVulnDetail" class="summary-detail"></span>
        </div>
        <div class="summary-vs">VS</div>
        <div class="summary-side summary-secure">
          <span class="summary-label">安全模式</span>
          <span id="summarySecureStatus" class="summary-status">—</span>
          <span id="summarySecureDetail" class="summary-detail"></span>
        </div>
      </div>
      <div class="compare-grid">
        <article class="panel result-card vulnerable">
          <div class="card-top-bar"></div>
          <div class="card-header">
            <div class="card-title-group">
              <span class="card-icon">🔓</span>
              <div>
                <h3>无防护模式</h3>
                <p class="card-sub">用户输入直接拼接进提示词</p>
              </div>
            </div>
            <span id="vulnBadge" class="badge badge-neutral">等待实验</span>
          </div>
          <div id="vulnOutput" class="output-box placeholder">发送实验后,这里展示脆弱模式的输出结果</div>
          <div class="result-meta">
            <span class="meta-label">后果标签</span>
            <div id="vulnConsequences" class="consequences"></div>
          </div>
          <p id="vulnExplain" class="explain"></p>
        </article>

        <article class="panel result-card secure">
          <div class="card-top-bar"></div>
          <div class="card-header">
            <div class="card-title-group">
              <span class="card-icon">🔒</span>
              <div>
                <h3>安全模式</h3>
                <p class="card-sub">经过统一安全防护层处理</p>
              </div>
            </div>
            <div class="card-header-right">
              <button id="btnPipeline" class="btn btn-pipeline hidden" type="button">查看处理流程</button>
              <span id="secureBadge" class="badge badge-neutral">等待实验</span>
            </div>
          </div>
          <div id="secureOutput" class="output-box placeholder">发送实验后,这里展示安全模式的输出结果</div>
          <div class="result-meta">
            <span class="meta-label">防御信息</span>
            <div id="secureDefense" class="defense-info"></div>
          </div>
          <p id="secureExplain" class="explain"></p>
        </article>
      </div>

      <section class="panel">
        <div class="panel-title">
          <span class="panel-icon">📋</span>
          <h2>审计日志</h2>
        </div>
        <div id="auditLog" class="audit-log">
          <p class="empty-hint">暂无记录,发送实验后显示</p>
        </div>
      </section>
    </section>

    <!-- 右侧:安全设定 -->
    <aside class="settings-sidebar">
      <section class="panel">
        <div class="panel-title">
          <span class="panel-icon">⚙️</span>
          <h2>统一安全设定</h2>
        </div>
        <form id="securityForm" class="settings-form">
          <div class="settings-group">
            <p class="group-label">防护开关</p>
            <label class="checkbox"><input type="checkbox" name="enable_input_isolation" checked /><span>输入隔离</span></label>
            <label class="checkbox"><input type="checkbox" name="enable_injection_detection" checked /><span>注入检测</span></label>
            <label class="checkbox"><input type="checkbox" name="enable_jailbreak_detection" checked /><span>越狱检测</span></label>
            <label class="checkbox"><input type="checkbox" name="enable_output_filter" checked /><span>输出过滤</span></label>
            <label class="checkbox"><input type="checkbox" name="audit_enabled" checked /><span>审计日志</span></label>
          </div>

          <div class="settings-group">
            <label class="field">
              <span>任务白名单</span>
              <input type="text" name="task_whitelist" value="translate,summarize,faq" placeholder="逗号分隔" />
            </label>
            <label class="field">
              <span>统一拒绝话术</span>
              <textarea name="refusal_message" rows="2">抱歉,我只能协助完成规定范围内的请求,无法处理该内容。</textarea>
            </label>
          </div>

          <button type="submit" class="btn btn-secondary">保存设定</button>
        </form>
        <p id="settingsStatus" class="status-msg"></p>
      </section>

      <section class="panel legend">
        <div class="panel-title">
          <span class="panel-icon">🏷️</span>
          <h2>状态图例</h2>
        </div>
        <ul>
          <li><span class="badge badge-danger">攻击成功</span><span>脆弱模式被攻破</span></li>
          <li><span class="badge badge-success">防御成功</span><span>安全模式拦截攻击</span></li>
          <li><span class="badge badge-warn">部分风险</span><span>需检查输出层</span></li>
        </ul>
      </section>
    </aside>
  </main>

  <div id="pipelineModal" class="modal hidden">
    <div class="modal-content panel pipeline-modal">
      <div class="modal-header">
        <div>
          <h2>安全模式处理流程</h2>
          <p class="modal-sub">展示统一安全防护层对本次请求的逐步处理</p>
        </div>
        <button id="btnClosePipeline" class="btn btn-ghost" type="button">✕</button>
      </div>
      <div id="pipelineTimeline" class="pipeline-timeline"></div>
    </div>
  </div>

  <div id="redteamModal" class="modal hidden">
    <div class="modal-content panel">
      <div class="modal-header">
        <h2>红队批量测试报告</h2>
        <button id="btnCloseModal" class="btn btn-ghost">✕</button>
      </div>
      <div id="redteamSummary" class="redteam-summary"></div>
      <div id="redteamResults" class="redteam-results"></div>
    </div>
  </div>

  <script src="/static/js/app.js"></script>
</body>
</html>