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>
</el-table-column>
<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">
<template #default="s"><el-tag size="small">{{ s.row.ruleCount || 0 }}</el-tag></template>
</el-table-column>
@@ -332,11 +335,16 @@ const ruleText = (r) => {
}
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 => ({
siteId: s.siteId, names: s.names, siteType: s.siteType,
ruleCount: rulesMap.value[s.siteId]?.ruleCount || 0, version: rulesMap.value[s.siteId]?.version || null,
updatedAt: rulesMap.value[s.siteId]?.updatedAt || null, rulesJson: rulesMap.value[s.siteId]?.rulesJson || null,
})))
const merged = computed(() => (Array.isArray(sites.value)?sites.value:[]).map(s => {
// 优先站点级,兜底类型级
const entry = rulesMap.value[s.siteId] || rulesMap.value[s.siteType] || {}
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 () => {