Files
c/miniprogram/pages/admin-dashboard/index.wxml
刘正航 385ebe25e7 feat: 运营报告生成功能
- 后端新增 /admin/stats/report 接口,生成14天运营数据报告
- 报告内容:垃圾信息变化趋势、高频风险词Top10、误判率趋势
- 前端运营看板增加"生成报告"按钮,展示完整报告
- 支持复制报告文本到剪贴板

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 00:07:07 +08:00

137 lines
5.8 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<view class="container">
<view class="hero fade-up">
<view class="hero-badge">OPS DASHBOARD</view>
<view class="hero-title">垃圾信息运营看板</view>
<view class="hero-sub">覆盖发布、拦截、申诉、样本与模型状态,支持日常运营与风险监控。</view>
</view>
<view class="card fade-up fade-up-delay-1" wx:if="{{kpis.length}}">
<view class="card-title">核心指标</view>
<view class="grid-2">
<view class="kpi" wx:for="{{kpis}}" wx:key="label">
<view class="kpi-value">{{item.value}}</view>
<view class="kpi-label">{{item.label}}</view>
</view>
</view>
</view>
<view class="card fade-up fade-up-delay-2" wx:if="{{stats && stats.threshold}}">
<view class="card-title">检测阈值配置</view>
<view class="row"><text class="label">当前阈值</text><text class="value">{{stats.threshold_text}}</text></view>
<view class="row"><text class="label">更新时间</text><text class="value">{{stats.threshold.updated_at || '--'}}</text></view>
</view>
<view class="card fade-up fade-up-delay-2" wx:if="{{stats && stats.model_info}}">
<view class="card-title">模型信息</view>
<view class="row"><text class="label">模型版本</text><text class="value">{{stats.model_info.version || '未训练'}}</text></view>
<view class="row"><text class="label">训练时间</text><text class="value">{{stats.model_info.trained_at || '--'}}</text></view>
<view class="row"><text class="label">样本数量</text><text class="value">{{stats.model_info.sample_count || 0}}</text></view>
</view>
<view class="card fade-up fade-up-delay-3" wx:if="{{bars.length}}">
<view class="card-title">近 7 天发布趋势</view>
<view class="list-item" wx:for="{{bars}}" wx:key="date">
<view class="row">
<text class="label">{{item.label}}</text>
<text class="value">{{item.value}} 条</text>
</view>
<view class="progress-track">
<view class="progress-fill-safe" style="width: {{item.percent_text}};"></view>
</view>
</view>
</view>
<view class="card fade-up fade-up-delay-3" wx:if="{{sourceDist.length}}">
<view class="card-title">训练样本来源</view>
<view class="list-item" wx:for="{{sourceDist}}" wx:key="name">
<view class="row"><text class="item-title">{{item.name}}</text><text class="value">{{item.value}}</text></view>
</view>
</view>
<view class="card fade-up fade-up-delay-3" wx:if="{{topKeywords.length}}">
<view class="card-title">高频风险词</view>
<view class="chip-group">
<text class="tag" wx:for="{{topKeywords}}" wx:key="token">{{item.token}} × {{item.count}}</text>
</view>
</view>
<!-- 生成报告按钮 -->
<view class="card fade-up fade-up-delay-3">
<button class="btn btn-accent" loading="{{reportLoading}}" bindtap="generateReport">生成运营报告</button>
</view>
<!-- 报告展示区域 -->
<view class="report-modal" wx:if="{{report}}">
<view class="report-header">
<view class="report-title">垃圾信息运营报告</view>
<view class="report-period">{{report.period}}</view>
</view>
<view class="report-close" bindtap="closeReport">×</view>
<view class="report-section">
<view class="report-section-title">汇总统计</view>
<view class="grid-3">
<view class="report-kpi">
<view class="report-kpi-value">{{report.summary.total_posts}}</view>
<view class="report-kpi-label">总发布量</view>
</view>
<view class="report-kpi">
<view class="report-kpi-value">{{report.summary.total_blocked}}</view>
<view class="report-kpi-label">拦截量</view>
</view>
<view class="report-kpi">
<view class="report-kpi-value">{{report.summary.total_published}}</view>
<view class="report-kpi-label">正常发布</view>
</view>
</view>
<view class="row">
<text class="label">拦截率</text>
<text class="value">{{report.summary.blocked_ratio * 100}}%</text>
</view>
<view class="row">
<text class="label">平均误判率</text>
<text class="value">{{report.summary.avg_misjudge_rate_text}}</text>
</view>
</view>
<view class="report-section">
<view class="report-section-title">垃圾信息数量变化近14天</view>
<view class="report-trend-item" wx:for="{{report.spam_trend}}" wx:key="date">
<view class="row">
<text class="label">{{item.label}}</text>
<text class="value">拦截 {{item.blocked}} / 发布 {{item.published}}</text>
</view>
<view class="progress-track">
<view class="progress-fill" style="width: {{item.blocked_percent}};"></view>
</view>
</view>
</view>
<view class="report-section">
<view class="report-section-title">高频风险词 Top10</view>
<view class="chip-group">
<text class="tag tag-danger" wx:for="{{report.topKeywords}}" wx:for-item="kw" wx:if="{{index < 10}}" wx:key="token">{{kw.token}} × {{kw.count}}</text>
</view>
</view>
<view class="report-section">
<view class="report-section-title">误判率趋势近14天</view>
<view class="report-trend-item" wx:for="{{report.misjudge_trend}}" wx:key="date">
<view class="row">
<text class="label">{{item.label}}</text>
<text class="value">{{item.misjudge_rate_text}}</text>
</view>
<view class="progress-track">
<view class="progress-fill-safe" style="width: {{item.rate_percent}};"></view>
</view>
</view>
</view>
<view class="btn-row">
<button class="btn btn-primary" bindtap="copyReportText">复制报告文本</button>
<button class="btn btn-ghost" bindtap="closeReport">关闭</button>
</view>
</view>
</view>