From d242786a3a621f686c4a7f515d91995a8dc549bf Mon Sep 17 00:00:00 2001 From: canglan Date: Sat, 18 Jul 2026 01:17:40 +0800 Subject: [PATCH] feat: bans sidebar page, public view with masked names --- public/index.html | 1 + public/js/app.js | 4 ++- public/js/pages/bans.js | 78 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 public/js/pages/bans.js diff --git a/public/index.html b/public/index.html index 74d7ecf..8d5111c 100644 --- a/public/index.html +++ b/public/index.html @@ -73,6 +73,7 @@ + diff --git a/public/js/app.js b/public/js/app.js index f5d07b4..06c1b2a 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -2,7 +2,7 @@ const App = { navItems: [ { id: 'dashboard', label: '控制台', icon: 'fa-chart-simple', roles: ['owner','admin','player'] }, { id: 'tickets-create', label: '提交工单', icon: 'fa-plus-circle', roles: ['player'] }, - { id: 'tickets', label: '工单列表', icon: 'fa-ticket-alt', roles: ['owner','admin','player'] }, + { id: 'bans', label: '封禁列表', icon: 'fa-ban', roles: ['owner','admin','player'] }, { id: 'unclaimed', label: '待处理工单', icon: 'fa-inbox', roles: ['owner','admin'] }, { id: 'users', label: '用户管理', icon: 'fa-users', roles: ['owner'] }, { id: 'servers', label: '服务器管理', icon: 'fa-server', roles: ['owner'] }, @@ -98,6 +98,7 @@ const App = { case 'features': this.renderMain('更新内容', FeaturesPage, param); break; case 'feature': this.renderMain('更新详情', FeatureDetail, param); break; case 'servers': this.renderMain('服务器管理', ServersPage, param); break; + case 'bans': this.renderMain('封禁列表', BansPage, param); break; default: this.renderMain('控制台', Dashboard, param); } }, @@ -176,6 +177,7 @@ window.PollsPage = PollsPage; window.FeaturesPage = FeaturesPage; window.FeatureDetail = FeatureDetail; window.ServersPage = ServersPage; +window.BansPage = BansPage; window.LoginPage = LoginPage; window.RegisterPage = RegisterPage; window.HomePage = HomePage; diff --git a/public/js/pages/bans.js b/public/js/pages/bans.js new file mode 100644 index 0000000..af585fe --- /dev/null +++ b/public/js/pages/bans.js @@ -0,0 +1,78 @@ +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.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('添加封禁', ` +
+
+
+
+ +
+ `); + 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, 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);} + } +}; + +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); }