feat: 风险规则缓刑天数可配置

- DRATIO/RATIO 编辑区域增加缓刑天数输入框
- 规则摘要和卡片头部的缓刑天数文案改为动态读取 graceDays 字段
- DRATIO 预设模板增加 graceDays: 7 默认值
- 不填时默认7天,向后兼容
This commit is contained in:
mediabot-pt
2026-07-12 23:18:55 +08:00
parent efd693e8e9
commit 8b004e5c45

View File

@@ -99,7 +99,7 @@
<span v-else-if="rule.type==='EXEMPT'" class="rule-fixed-text">永久保留 ≥ {{ rankDisplay(rule.permRank) }} / 封存豁免 ≥ {{ rankDisplay(rule.sealExemptRank) }}</span> <span v-else-if="rule.type==='EXEMPT'" class="rule-fixed-text">永久保留 ≥ {{ rankDisplay(rule.permRank) }} / 封存豁免 ≥ {{ rankDisplay(rule.sealExemptRank) }}</span>
<span v-else class="rule-fixed-text">{{ metricLabel(rule.metric) }} {{ condLabel(rule.condition) }} {{ rule.threshold }}{{ rule.unit || '' }}</span> <span v-else class="rule-fixed-text">{{ metricLabel(rule.metric) }} {{ condLabel(rule.condition) }} {{ rule.threshold }}{{ rule.unit || '' }}</span>
<span class="then-arrow" :style="rule.type==='EXEMPT'?'color:#67c23a':rule.type==='RATIO'||rule.type==='DRATIO'?'color:#e6a23c':''">→</span> <span class="then-arrow" :style="rule.type==='EXEMPT'?'color:#67c23a':rule.type==='RATIO'||rule.type==='DRATIO'?'color:#e6a23c':''">→</span>
<span :style="{fontWeight:'600',fontSize:'13px',color:rule.type==='EXEMPT'?'#67c23a':rule.type==='RATIO'||rule.type==='DRATIO'?'#e6a23c':'#f56c6c'}">{{ rule.type==='EXEMPT' ? '保号' : rule.type==='RATIO'||rule.type==='DRATIO' ? '封号(缓刑7天)' : '封号/删除账号' }}</span> <span :style="{fontWeight:'600',fontSize:'13px',color:rule.type==='EXEMPT'?'#67c23a':rule.type==='RATIO'||rule.type==='DRATIO'?'#e6a23c':'#f56c6c'}">{{ rule.type==='EXEMPT' ? '保号' : rule.type==='RATIO'||rule.type==='DRATIO' ? '封号(缓刑' + (rule.graceDays || 7) + '天)' : '封号/删除账号' }}</span>
<span v-if="rule.applicable" class="applicable-tag">{{ applicableLabel(rule.applicable) }}</span> <span v-if="rule.applicable" class="applicable-tag">{{ applicableLabel(rule.applicable) }}</span>
</div> </div>
<div class="card-header-right"> <div class="card-header-right">
@@ -139,6 +139,12 @@
<el-button size="small" text type="primary" @click="addDRatioLevel(rule)" style="align-self:flex-start"> <el-button size="small" text type="primary" @click="addDRatioLevel(rule)" style="align-self:flex-start">
<el-icon style="margin-right:2px"><Plus /></el-icon>添加等级 <el-icon style="margin-right:2px"><Plus /></el-icon>添加等级
</el-button> </el-button>
<!-- 缓刑天数 -->
<div class="field-row" style="margin-top:4px">
<span class="field-label">缓刑天数</span>
<el-input v-model.number="rule.graceDays" size="small" type="number" placeholder="天数" @input="sync" style="width:100px" />
<span class="field-hint">天(不填则默认7天)</span>
</div>
</template> </template>
<!-- EXEMPT 等级豁免 --> <!-- EXEMPT 等级豁免 -->
@@ -173,9 +179,15 @@
<div class="field-row"> <div class="field-row">
<span class="field-label">阈值</span> <span class="field-label">阈值</span>
<el-input v-model.number="rule.threshold" size="small" type="number" placeholder="阈值" @input="sync" style="width:120px" /> <el-input v-model.number="rule.threshold" size="small" type="number" placeholder="阈值" @input="sync" style="width:120px" />
<span v-if="rule.type==='RATIO'" class="field-hint">(低于此分享率则降级至Peasant,7天缓刑后封号/删除账号)</span> <span v-if="rule.type==='RATIO'" class="field-hint">(低于此分享率则降级至Peasant,缓刑后封号/删除账号)</span>
<span v-else class="field-hint">{{ rule.unit || '' }}</span> <span v-else class="field-hint">{{ rule.unit || '' }}</span>
</div> </div>
<!-- RATIO 缓刑天数 -->
<div v-if="rule.type==='RATIO'" class="field-row" style="margin-top:4px">
<span class="field-label">缓刑天数</span>
<el-input v-model.number="rule.graceDays" size="small" type="number" placeholder="天数" @input="sync" style="width:100px" />
<span class="field-hint">天(不填则默认7天)</span>
</div>
</template> </template>
</div> </div>
</div> </div>
@@ -283,7 +295,7 @@ const presets = [
// 新人考核 // 新人考核
{ name:'新人考核', type:'TASK', threshold:30, unit:'天', description:'新注册用户需在考核周期内完成各项要求' }, { name:'新人考核', type:'TASK', threshold:30, unit:'天', description:'新注册用户需在考核周期内完成各项要求' },
// 分享率 // 分享率
{ name:'分享率', type:'DRATIO', levels:[{threshold:0,ratio:1.0}], description:'下载量>0时,分享率<1.0即封号(缓刑7天)' }, { name:'分享率', type:'DRATIO', graceDays: 7, levels:[{threshold:0,ratio:1.0}], description:'下载量>0时,分享率<1.0即封号(缓刑7天)' },
// 等级豁免 // 等级豁免
{ name:'等级豁免', type:'EXEMPT', permRank:'Elite User', sealExemptRank:'Power User', description:'达到等级的账号可豁免清理' }, { name:'等级豁免', type:'EXEMPT', permRank:'Elite User', sealExemptRank:'Power User', description:'达到等级的账号可豁免清理' },
] ]
@@ -351,11 +363,13 @@ const ruleText = (r) => {
return `无流量且未登录:${val} → <span style="color:#f56c6c;font-weight:500">封号/删除账号</span>${appText}` return `无流量且未登录:${val} → <span style="color:#f56c6c;font-weight:500">封号/删除账号</span>${appText}`
} }
if (r.type === 'DRATIO') { if (r.type === 'DRATIO') {
const grace = r.graceDays != null ? `(缓刑${r.graceDays}天)` : '(缓刑7天)'
const levels = (r.levels||[]).map(l => `下载量≥${l.threshold}GB时分享率<${l.ratio}`).join(',') const levels = (r.levels||[]).map(l => `下载量≥${l.threshold}GB时分享率<${l.ratio}`).join(',')
return `分享率:${levels} → <span style="color:#e6a23c;font-weight:500">封号(缓刑7天)</span>${appText}` return `分享率:${levels} → <span style="color:#e6a23c;font-weight:500">封号${grace}</span>${appText}`
} }
if (r.type === 'RATIO') { if (r.type === 'RATIO') {
return `分享率:${val} → <span style="color:#e6a23c;font-weight:500">封号(缓刑7天)</span>${appText}` const grace = r.graceDays != null ? `(缓刑${r.graceDays}天)` : '(缓刑7天)'
return `分享率:${val} → <span style="color:#e6a23c;font-weight:500">封号${grace}</span>${appText}`
} }
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}`
} }