const BansPage = { async render() { return '
'; }, async mount() { document.getElementById('page-title').textContent = '封禁列表'; document.getElementById('page-actions').innerHTML = Auth.isOwner() ? '' : ''; const btn = document.getElementById('add-ban-btn'); if (btn) btn.onclick = () => this.showAddBan(); await this.load(); }, async load() { const ct = document.getElementById('page-content'); try { const bans = await API.get('/bans/active'); const isStaff = Auth.isAdmin(); ct.innerHTML = bans.length === 0 ? '

暂无封禁记录

' : `
${Auth.isOwner()?'':''}${bans.map(b => ` ${Auth.isOwner()?``:''} `).join('')}
玩家UID帐号来源处罚来源类型原因时长时间操作
${isStaff ? U.esc(b.player_name) : maskName(b.player_name)} ${isStaff ? U.esc(b.player_uid||'-') : maskUid(b.player_uid)} ${b.source==='netease'?'网易':b.source==='skin'?'皮肤站':'-'} ${b.ticket_id?'工单处理':'手动添加'} ${b.type==='ban'?'封禁':b.type==='mute'?'禁言':'警告'} ${U.esc((b.reason||'').substring(0,50))} ${b.duration||'永久'} ${b.status==='active'?'生效中':'已解除'} ${U.date(b.created_at)}
`; } catch(e) { ct.innerHTML = `
${e.message}
`; } }, showAddBan() { U.modal('添加封禁', `
`); U.sources().then(list => { const sel = document.getElementById('ban-source'); if (sel) sel.innerHTML = '' + list.map(s => ``).join(''); }).catch(()=>{}); document.getElementById('ban-form').onsubmit = async e => { e.preventDefault(); try { await API.post('/bans', { player_name: document.getElementById('ban-name').value, player_uid: document.getElementById('ban-uid').value, source: document.getElementById('ban-source').value, type: document.getElementById('ban-type').value, duration: document.getElementById('ban-dur').value, reason: document.getElementById('ban-reason').value }); App.closeModal(); this.load(); } catch(ex) { alert(ex.message); } }; setTimeout(() => BansPage.checkMinDuration(), 100); }, async checkMinDuration() { const name = document.getElementById('ban-name')?.value; const uid = document.getElementById('ban-uid')?.value; const type = document.getElementById('ban-type')?.value; if (!name && !uid) return; try { const r = await API.get('/bans/min-duration?player_name='+name+'&player_uid='+uid+'&type='+type); const sel = document.getElementById('ban-dur'); if (r.minDays > 0) { sel.innerHTML = ``; } else { sel.innerHTML = ``; } } catch {} }, async lift(id) { if (!await U.confirm('确认解除该封禁?')) return; try { await API.put('/bans/'+id, { status: 'lifted' }); this.load(); } catch(ex){alert(ex.message);} }, edit(id, name, uid, source, type, reason, duration, status) { U.modal('编辑封禁', `
`); U.sources().then(list => { const sel = document.getElementById('be-source'); if (sel) sel.innerHTML = '' + list.map(s => ``).join(''); }).catch(()=>{}); document.getElementById('be-form').onsubmit = async e => { e.preventDefault(); try { await API.put('/bans/'+id, { status: document.getElementById('be-status').value, reason: document.getElementById('be-reason').value, duration: document.getElementById('be-dur').value }); App.closeModal(); this.load(); } catch(ex) { alert(ex.message); } }; } }; function maskName(n) { if (!n) return '***'; return n[0] + '***' + (n.length>2?n[n.length-1]:''); } function maskUid(u) { if (!u) return '***'; return u.substring(0,3) + '****' + u.substring(u.length-3); }