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 @@
{{ (s.row.names||[]).join('/') || '-' }}
+
+ {{ s.row.source || '—' }}
+
{{ s.row.ruleCount || 0 }}
@@ -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 () => {