From a643d976cf393ee266190fdd0b70f9576ecba9a7 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Mon, 6 Jul 2026 23:51:26 +0800 Subject: [PATCH] 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 --- web/src/views/RiskRules.vue | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/web/src/views/RiskRules.vue b/web/src/views/RiskRules.vue index 2b28ea9..ab27898 100644 --- a/web/src/views/RiskRules.vue +++ b/web/src/views/RiskRules.vue @@ -11,6 +11,9 @@ + + + @@ -332,11 +335,16 @@ const ruleText = (r) => { } return `${typeLabel(r.type)}:${val} → 封号/删除账号${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 () => {