feat: support both site-level and type-level risk rule storage

List shows source column: site-level or type-level

Fallback: siteId rule first, then siteType rule

Save always creates site-level entry; load falls back to type-level if none exists
This commit is contained in:
mediabot-pt
2026-07-06 23:51:26 +08:00
parent 5a7b218944
commit a643d976cf

View File

@@ -11,6 +11,9 @@
<template #default="s">{{ (s.row.names||[]).join('/') || '-' }}</template> <template #default="s">{{ (s.row.names||[]).join('/') || '-' }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="siteType" label="类型" width="100" /> <el-table-column prop="siteType" label="类型" width="100" />
<el-table-column label="来源" width="80" align="center">
<template #default="s">{{ s.row.source || '—' }}</template>
</el-table-column>
<el-table-column label="规则数" width="80" align="center"> <el-table-column label="规则数" width="80" align="center">
<template #default="s"><el-tag size="small">{{ s.row.ruleCount || 0 }}</el-tag></template> <template #default="s"><el-tag size="small">{{ s.row.ruleCount || 0 }}</el-tag></template>
</el-table-column> </el-table-column>
@@ -332,11 +335,16 @@ const ruleText = (r) => {
} }
return `${typeLabel(r.type)}:${val} → <span style="color:#f56c6c;font-weight:500">封号/删除账号</span>${appText}` return `${typeLabel(r.type)}:${val} → <span style="color:#f56c6c;font-weight:500">封号/删除账号</span>${appText}`
} }
const merged = computed(() => (Array.isArray(sites.value)?sites.value:[]).map(s => ({ const merged = computed(() => (Array.isArray(sites.value)?sites.value:[]).map(s => {
siteId: s.siteId, names: s.names, siteType: s.siteType, // 优先站点级,兜底类型级
ruleCount: rulesMap.value[s.siteId]?.ruleCount || 0, version: rulesMap.value[s.siteId]?.version || null, const entry = rulesMap.value[s.siteId] || rulesMap.value[s.siteType] || {}
updatedAt: rulesMap.value[s.siteId]?.updatedAt || null, rulesJson: rulesMap.value[s.siteId]?.rulesJson || null, return {
}))) siteId: s.siteId, names: s.names, siteType: s.siteType,
ruleCount: entry.ruleCount || 0, version: entry.version || null,
updatedAt: entry.updatedAt || null, rulesJson: entry.rulesJson || null,
source: rulesMap.value[s.siteId] ? '站点级' : entry.ruleCount ? '类型级' : null,
}
}))
// ============ 数据操作 ============ // ============ 数据操作 ============
const fetchAll = async () => { const fetchAll = async () => {