Files
c/miniprogram/pages/admin-dashboard/index.js
刘正航 b5237f9038 1
2026-04-21 22:45:19 +08:00

72 lines
2.0 KiB
JavaScript

const { request } = require('../../utils/request')
Page({
data: {
loading: false,
stats: null,
kpis: [],
bars: [],
sourceDist: [],
topKeywords: []
},
formatPercent(value, digits = 2) {
const num = Number(value || 0)
return `${(num * 100).toFixed(digits)}%`
},
onShow() {
this.fetchStats()
},
onPullDownRefresh() {
this.fetchStats(true)
},
normalizeKpis(stats) {
return [
{ label: '系统用户', value: stats.user_count || 0 },
{ label: '发布总量', value: stats.post_count || 0 },
{ label: '拦截总量', value: stats.blocked_count || 0 },
{ label: '待处理申诉', value: stats.pending_appeal_count || 0 },
{ label: '训练样本', value: stats.sample_count || 0 },
{ label: '近7天拦截率', value: this.formatPercent(stats.blocked_ratio_7d, 2) }
]
},
normalizeBars(trend) {
const rows = Array.isArray(trend) ? trend : []
const maxVal = Math.max(1, ...rows.map((r) => Number(r.post_count || 0)))
return rows.map((row) => {
const value = Number(row.post_count || 0)
const ratio = value / maxVal
return {
...row,
value,
percent_text: `${Math.max(6, Math.round(ratio * 100))}%`
}
})
},
async fetchStats(fromPullDown = false) {
this.setData({ loading: true })
try {
const stats = await request({ url: '/admin/stats' })
const normalizedStats = {
...stats,
threshold_text: stats && stats.threshold ? this.formatPercent(stats.threshold.spam_threshold, 1) : '--'
}
this.setData({
stats: normalizedStats,
kpis: this.normalizeKpis(normalizedStats),
bars: this.normalizeBars(normalizedStats.trend_7d || []),
sourceDist: normalizedStats.source_distribution || [],
topKeywords: normalizedStats.top_keywords || []
})
} finally {
this.setData({ loading: false })
if (fromPullDown) wx.stopPullDownRefresh()
}
}
})