Files
vps_web/templates/admin/forum_tracking.html
ddrwode d454699f50 哈哈
2026-02-11 17:38:06 +08:00

395 lines
20 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>论坛埋点看板 - 后台</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="stylesheet" href="/static/css/admin.css">
</head>
<body class="admin-page">
<header class="admin-header">
<h1>论坛埋点看板</h1>
<nav>
<a href="{{ url_for('admin_forum_tracking') }}">埋点看板</a>
<a href="{{ url_for('admin_forum_tracking_daily') }}">埋点日报</a>
<a href="{{ url_for('admin_forum_tracking_weekly', days=days, variant=selected_variant, device=selected_device) }}">埋点周报</a>
<a href="{{ url_for('admin_forum_posts') }}">帖子管理</a>
<a href="{{ url_for('admin_forum_comments') }}">评论管理</a>
<a href="{{ url_for('admin_forum_reports') }}">举报审核</a>
<a href="{{ url_for('admin_dashboard') }}">返回总览</a>
<a href="{{ url_for('admin_logout') }}">退出</a>
</nav>
</header>
<main class="admin-main">
{% if msg %}
<p class="hint success-msg">{{ msg }}</p>
{% endif %}
{% if error %}
<p class="error-msg">{{ error }}</p>
{% endif %}
<section class="dashboard-section">
<div class="admin-topline">
<h2>筛选条件</h2>
</div>
<form method="get" class="admin-filter-form">
<div class="filter-row">
<div class="filter-item">
<label for="days">时间窗口</label>
<select id="days" name="days">
{% for opt in days_options %}
<option value="{{ opt }}" {{ 'selected' if days == opt else '' }}>最近 {{ opt }} 天</option>
{% endfor %}
</select>
</div>
<div class="filter-item">
<label for="variant">CTA 变体</label>
<select id="variant" name="variant">
<option value="all" {{ 'selected' if selected_variant == 'all' else '' }}>全部</option>
<option value="control" {{ 'selected' if selected_variant == 'control' else '' }}>control</option>
<option value="intent" {{ 'selected' if selected_variant == 'intent' else '' }}>intent</option>
<option value="unknown" {{ 'selected' if selected_variant == 'unknown' else '' }}>unknown</option>
</select>
</div>
<div class="filter-item">
<label for="device">设备类型</label>
<select id="device" name="device">
{% for opt in device_options %}
<option value="{{ opt }}" {{ 'selected' if selected_device == opt else '' }}>{{ opt }}</option>
{% endfor %}
</select>
</div>
<div class="filter-actions">
<button type="submit">应用筛选</button>
<a href="{{ url_for('admin_forum_tracking') }}">重置</a>
</div>
</div>
</form>
<div class="tracking-export-row">
<a href="{{ url_for('admin_forum_tracking_daily') }}" class="admin-btn-link">查看埋点日报</a>
<a href="{{ url_for('admin_forum_tracking_weekly', days=days, variant=selected_variant, device=selected_device) }}" class="admin-btn-link">查看埋点周报</a>
<a href="{{ url_for('admin_forum_tracking_export', days=days, variant=selected_variant, device=selected_device, mode='recent') }}" class="admin-btn-link">导出事件明细 CSV</a>
<a href="{{ url_for('admin_forum_tracking_export', days=days, variant=selected_variant, device=selected_device, mode='daily') }}" class="admin-btn-link">导出日汇总 CSV</a>
<a href="{{ url_for('admin_forum_tracking_export', days=days, variant=selected_variant, device=selected_device, mode='variants') }}" class="admin-btn-link">导出变体汇总 CSV</a>
<a href="{{ url_for('admin_forum_tracking_export', days=days, variant=selected_variant, device=selected_device, mode='variant_funnel') }}" class="admin-btn-link">导出变体漏斗 CSV</a>
<a href="{{ url_for('admin_forum_tracking_weekly_export_markdown', days=days, variant=selected_variant, device=selected_device) }}" class="admin-btn-link">导出周期周报 Markdown</a>
<a href="{{ url_for('admin_forum_tracking_export', days=days, variant=selected_variant, device=selected_device, mode='device_variants') }}" class="admin-btn-link">导出设备×变体 CSV</a>
<a href="{{ url_for('admin_forum_tracking_export', days=days, variant=selected_variant, device=selected_device, mode='posts') }}" class="admin-btn-link">导出帖子转化 CSV</a>
<a href="{{ url_for('admin_forum_tracking_export', days=days, variant=selected_variant, device=selected_device, mode='labels') }}" class="admin-btn-link">导出标签排行 CSV</a>
</div>
</section>
<section class="dashboard-section">
<h2>核心指标(当前筛选)</h2>
<div class="metric-grid">
<article class="metric-card">
<span class="metric-label">总事件</span>
<strong class="metric-value">{{ summary.events }}</strong>
</article>
<article class="metric-card">
<span class="metric-label">曝光</span>
<strong class="metric-value">{{ summary.impressions }}</strong>
</article>
<article class="metric-card">
<span class="metric-label">移动底栏曝光</span>
<strong class="metric-value">{{ summary.mobile_bar_impressions }}</strong>
</article>
<article class="metric-card">
<span class="metric-label">移动比价点击</span>
<strong class="metric-value">{{ summary.mobile_pricing_clicks }}</strong>
<small class="metric-meta">Rate {{ summary_rates.mobile_pricing_rate }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">点击比价</span>
<strong class="metric-value">{{ summary.pricing_clicks }}</strong>
<small class="metric-meta">CTR {{ summary_rates.pricing_ctr }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">点击发需求</span>
<strong class="metric-value">{{ summary.new_topic_clicks }}</strong>
<small class="metric-meta">Rate {{ summary_rates.new_topic_rate }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">模板发帖点击</span>
<strong class="metric-value">{{ summary.template_clicks }}</strong>
<small class="metric-meta">Rate {{ summary_rates.template_rate }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">模板发帖提交</span>
<strong class="metric-value">{{ summary.template_submits }}</strong>
<small class="metric-meta">Submit {{ summary_rates.template_submit_rate }}% · Completion {{ summary_rates.template_completion_rate }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">评论提交</span>
<strong class="metric-value">{{ summary.comment_submits }}</strong>
<small class="metric-meta">Rate {{ summary_rates.comment_rate }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">复制链接成功</span>
<strong class="metric-value">{{ summary.copy_success }}</strong>
<small class="metric-meta">Rate {{ summary_rates.copy_rate }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">资源链接点击</span>
<strong class="metric-value">{{ summary.resource_clicks }}</strong>
</article>
<article class="metric-card">
<span class="metric-label">相关推荐点击</span>
<strong class="metric-value">{{ summary.related_clicks }}</strong>
</article>
<article class="metric-card">
<span class="metric-label">目录点击</span>
<strong class="metric-value">{{ summary.outline_clicks }}</strong>
</article>
</div>
</section>
<section class="dashboard-section">
<h2>移动端漏斗(当前筛选)</h2>
<div class="metric-grid">
<article class="metric-card">
<span class="metric-label">移动端曝光</span>
<strong class="metric-value">{{ mobile_funnel.mobile_impressions }}</strong>
<small class="metric-meta">Share {{ mobile_funnel.mobile_traffic_share }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">移动底栏曝光</span>
<strong class="metric-value">{{ mobile_funnel.mobile_bar_impressions }}</strong>
</article>
<article class="metric-card">
<span class="metric-label">移动比价点击</span>
<strong class="metric-value">{{ mobile_funnel.mobile_pricing_clicks }}</strong>
<small class="metric-meta">CTR {{ mobile_funnel.mobile_pricing_rate }}%</small>
</article>
<article class="metric-card">
<span class="metric-label">移动点击占比</span>
<strong class="metric-value">{{ mobile_funnel.mobile_click_share }}%</strong>
<small class="metric-meta">占全部比价点击</small>
</article>
</div>
<p class="admin-note">移动比价点击率 = 移动比价点击 / 移动底栏曝光;移动点击占比 = 移动比价点击 / 全部比价点击。</p>
</section>
<section class="dashboard-section">
<h2>变体表现(最近 {{ days }} 天)</h2>
<table class="admin-table">
<thead>
<tr>
<th>变体</th>
<th>曝光</th>
<th>比价点击</th>
<th>CTR</th>
<th>发需求点击</th>
<th>需求率</th>
<th>模板发帖点击</th>
<th>模板率</th>
<th>模板发帖提交</th>
<th>模板完成率</th>
<th>评论提交</th>
<th>评论率</th>
<th>复制成功</th>
<th>复制率</th>
</tr>
</thead>
<tbody>
{% for row in variant_summary %}
<tr>
<td><span class="status-pill {{ 'active' if row.variant in ['control', 'intent'] else 'inactive' }}">{{ row.variant }}</span></td>
<td>{{ row.impressions }}</td>
<td>{{ row.pricing_clicks }}</td>
<td>{{ row.pricing_ctr }}%</td>
<td>{{ row.new_topic_clicks }}</td>
<td>{{ row.new_topic_rate }}%</td>
<td>{{ row.template_clicks }}</td>
<td>{{ row.template_rate }}%</td>
<td>{{ row.template_submits }}</td>
<td>{{ row.template_completion_rate }}%</td>
<td>{{ row.comment_submits }}</td>
<td>{{ row.comment_rate }}%</td>
<td>{{ row.copy_success }}</td>
<td>{{ row.copy_rate }}%</td>
</tr>
{% else %}
<tr><td colspan="14">暂无变体统计数据。</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section class="dashboard-section">
<h2>设备表现(最近 {{ days }} 天)</h2>
<table class="admin-table">
<thead>
<tr>
<th>设备</th>
<th>曝光</th>
<th>移动底栏曝光</th>
<th>比价点击</th>
<th>CTR</th>
<th>移动比价点击</th>
<th>移动底栏点击率</th>
<th>评论提交</th>
<th>评论率</th>
</tr>
</thead>
<tbody>
{% for row in device_summary %}
<tr>
<td><span class="status-pill {{ 'active' if row.device_type in ['mobile', 'desktop', 'tablet'] else 'inactive' }}">{{ row.device_type }}</span></td>
<td>{{ row.impressions }}</td>
<td>{{ row.mobile_bar_impressions }}</td>
<td>{{ row.pricing_clicks }}</td>
<td>{{ row.pricing_ctr }}%</td>
<td>{{ row.mobile_pricing_clicks }}</td>
<td>{{ row.mobile_pricing_rate }}%</td>
<td>{{ row.comment_submits }}</td>
<td>{{ row.comment_rate }}%</td>
</tr>
{% else %}
<tr><td colspan="9">暂无设备分组统计。</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section class="dashboard-section">
<h2>按帖子转化排行(当前筛选)</h2>
<table class="admin-table">
<thead>
<tr>
<th>帖子</th>
<th>曝光</th>
<th>比价点击</th>
<th>CTR</th>
<th>模板点击</th>
<th>模板提交</th>
<th>模板完成率</th>
<th>评论提交</th>
<th>评论率</th>
</tr>
</thead>
<tbody>
{% for row in post_rows %}
<tr>
<td>
<div class="table-title"><a href="{{ url_for('forum_post_detail', post_id=row.post_id) }}" target="_blank" rel="noopener">#{{ row.post_id }} {{ row.title }}</a></div>
</td>
<td>{{ row.impressions }}</td>
<td>{{ row.pricing_clicks }}</td>
<td>{{ row.pricing_ctr }}%</td>
<td>{{ row.template_clicks }}</td>
<td>{{ row.template_submits }}</td>
<td>{{ row.template_completion_rate }}%</td>
<td>{{ row.comment_submits }}</td>
<td>{{ row.comment_rate }}%</td>
</tr>
{% else %}
<tr><td colspan="9">暂无帖子级转化数据。</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section class="dashboard-section">
<h2>模板转化排行(当前筛选)</h2>
<table class="admin-table">
<thead>
<tr>
<th>帖子</th>
<th>模板点击</th>
<th>模板提交</th>
<th>模板完成率</th>
<th>模板点击率</th>
<th>模板提交率</th>
</tr>
</thead>
<tbody>
{% for row in template_post_rows %}
<tr>
<td><div class="table-title"><a href="{{ url_for('forum_post_detail', post_id=row.post_id) }}" target="_blank" rel="noopener">#{{ row.post_id }} {{ row.title }}</a></div></td>
<td>{{ row.template_clicks }}</td>
<td>{{ row.template_submits }}</td>
<td>{{ row.template_completion_rate }}%</td>
<td>{{ row.template_rate }}%</td>
<td>{{ row.template_submit_rate }}%</td>
</tr>
{% else %}
<tr><td colspan="6">暂无模板转化数据。</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section class="dashboard-section">
<h2>高频标签(当前筛选)</h2>
<table class="admin-table">
<thead>
<tr>
<th>事件</th>
<th>标签</th>
<th>次数</th>
</tr>
</thead>
<tbody>
{% for row in label_rows %}
<tr>
<td><code>{{ row.event_name }}</code></td>
<td>{{ row.label }}</td>
<td>{{ row.total }}</td>
</tr>
{% else %}
<tr><td colspan="3">暂无标签统计。</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section class="dashboard-section">
<h2>最近事件(当前筛选)</h2>
<table class="admin-table">
<thead>
<tr>
<th>时间</th>
<th>事件</th>
<th>标签</th>
<th>变体</th>
<th>设备</th>
<th>帖子</th>
<th>用户</th>
<th>访客</th>
</tr>
</thead>
<tbody>
{% for e in recent_rows %}
<tr>
<td>{{ e.created_at.strftime('%Y-%m-%d %H:%M:%S') if e.created_at else '' }}</td>
<td><code>{{ e.event_name }}</code></td>
<td>{{ e.label or '—' }}</td>
<td>{{ e.cta_variant or 'unknown' }}</td>
<td>{{ e.device_type or 'unknown' }}</td>
<td>
{% if e.post_id %}
<a href="{{ url_for('forum_post_detail', post_id=e.post_id) }}" target="_blank" rel="noopener">#{{ e.post_id }}</a>
{% else %}
{% endif %}
</td>
<td>{{ e.user_id or '—' }}</td>
<td>{{ e.visitor_id or '—' }}</td>
</tr>
{% else %}
<tr><td colspan="8">暂无事件数据。</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section class="dashboard-section">
<h2>查询说明</h2>
<p class="admin-note">本页基于数据库表 <code>forum_track_events</code> 聚合。SQL 示例可见 <code>/Users/ddrwode/code/vps_price/docs/forum-post-detail-funnel-sql.md</code></p>
</section>
</main>
</body>
</html>