refactor: use only siteId for risk rule storage, drop type-level fallback

This commit is contained in:
mediabot-pt
2026-07-06 23:52:30 +08:00
parent a643d976cf
commit 0b0dcb4f04
2 changed files with 4 additions and 27 deletions

View File

@@ -22,16 +22,9 @@ public class RiskRuleServiceImpl implements RiskRuleService {
private final com.par.core.storage.CachedStorageService storageService; private final com.par.core.storage.CachedStorageService storageService;
private static final ObjectMapper om = new ObjectMapper(); private static final ObjectMapper om = new ObjectMapper();
/** Find by siteId first, fallback to siteType for backward compat */
private RiskRule findByIdentifier(String identifier) { private RiskRule findByIdentifier(String identifier) {
// Try siteId first
RiskRule rr = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteId, identifier).eq(RiskRule::getDeleted, 0)
.orderByDesc(RiskRule::getId).last("limit 1"));
if (rr != null) return rr;
// Fallback to siteType
return mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>() return mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteType, identifier).eq(RiskRule::getDeleted, 0) .eq(RiskRule::getSiteId, identifier).eq(RiskRule::getDeleted, 0)
.orderByDesc(RiskRule::getId).last("limit 1")); .orderByDesc(RiskRule::getId).last("limit 1"));
} }
@@ -84,11 +77,6 @@ public class RiskRuleServiceImpl implements RiskRuleService {
var list = mapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>() var list = mapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteId, siteType).eq(RiskRule::getDeleted, 0) .eq(RiskRule::getSiteId, siteType).eq(RiskRule::getDeleted, 0)
.orderByDesc(RiskRule::getId)); .orderByDesc(RiskRule::getId));
if (list.isEmpty()) {
list = mapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteType, siteType).eq(RiskRule::getDeleted, 0)
.orderByDesc(RiskRule::getId));
}
List<Map<String, Object>> result = new ArrayList<>(); List<Map<String, Object>> result = new ArrayList<>();
for (var r : list) { for (var r : list) {
result.add(Map.of("version", r.getVersion(), "createdAt", r.getCreatedAt() != null ? r.getCreatedAt().toString() : "")); result.add(Map.of("version", r.getVersion(), "createdAt", r.getCreatedAt() != null ? r.getCreatedAt().toString() : ""));
@@ -101,11 +89,6 @@ public class RiskRuleServiceImpl implements RiskRuleService {
var r = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>() var r = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteId, siteType).eq(RiskRule::getVersion, version) .eq(RiskRule::getSiteId, siteType).eq(RiskRule::getVersion, version)
.eq(RiskRule::getDeleted, 0)); .eq(RiskRule::getDeleted, 0));
if (r == null) {
r = mapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteType, siteType).eq(RiskRule::getVersion, version)
.eq(RiskRule::getDeleted, 0));
}
return r != null ? r.getRulesJson() : null; return r != null ? r.getRulesJson() : null;
} }
@@ -113,8 +96,6 @@ public class RiskRuleServiceImpl implements RiskRuleService {
public void deleteRules(String siteType) { public void deleteRules(String siteType) {
mapper.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>() mapper.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteId, siteType).eq(RiskRule::getDeleted, 0)); .eq(RiskRule::getSiteId, siteType).eq(RiskRule::getDeleted, 0));
mapper.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<RiskRule>()
.eq(RiskRule::getSiteType, siteType).eq(RiskRule::getDeleted, 0));
} }
@Override @Override

View File

@@ -11,9 +11,6 @@
<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>
@@ -336,13 +333,11 @@ 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 => {
// 优先站点级,兜底类型级 const entry = rulesMap.value[s.siteId] || {}
const entry = rulesMap.value[s.siteId] || rulesMap.value[s.siteType] || {}
return { return {
siteId: s.siteId, names: s.names, siteType: s.siteType, siteId: s.siteId, names: s.names, siteType: s.siteType,
ruleCount: entry.ruleCount || 0, version: entry.version || null, ruleCount: entry.ruleCount || 0, version: entry.version || null,
updatedAt: entry.updatedAt || null, rulesJson: entry.rulesJson || null, updatedAt: entry.updatedAt || null, rulesJson: entry.rulesJson || null,
source: rulesMap.value[s.siteId] ? '站点级' : entry.ruleCount ? '类型级' : null,
} }
})) }))
@@ -356,7 +351,8 @@ const fetchAll = async () => {
const map = {} const map = {}
for (const r of rulesData) { for (const r of rulesData) {
const cnt = (() => { try { return JSON.parse(r.rulesJson||'[]').length } catch { return 0 } })() const cnt = (() => { try { return JSON.parse(r.rulesJson||'[]').length } catch { return 0 } })()
const key = r.siteId || r.siteType // siteId is the new key, fallback to siteType const key = r.siteId
if (!key) continue
if (!map[key] || r.version > map[key].version) if (!map[key] || r.version > map[key].version)
map[key] = { ruleCount: cnt, version: r.version, updatedAt: r.updatedAt, rulesJson: r.rulesJson } map[key] = { ruleCount: cnt, version: r.version, updatedAt: r.updatedAt, rulesJson: r.rulesJson }
} }