From 2a12e7b7406176f61675029b6e0719339122201d Mon Sep 17 00:00:00 2001 From: canglan Date: Sat, 18 Jul 2026 01:11:41 +0800 Subject: [PATCH] fix: ban duration >= not >, auto-prefill min duration --- backend/routes/bans.js | 11 +++++++++-- public/js/pages/dashboard.js | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/backend/routes/bans.js b/backend/routes/bans.js index c02a770..affca1a 100644 --- a/backend/routes/bans.js +++ b/backend/routes/bans.js @@ -19,6 +19,13 @@ router.get('/active', authenticate, async (req, res) => { res.json(await query("SELECT * FROM bans WHERE status = 'active' ORDER BY created_at DESC")); }); +router.get('/min-duration', authenticate, async (req, res) => { + const { player_name, player_uid, type } = req.query; + const prev = await getRow('SELECT * FROM bans WHERE (player_name = ? OR player_uid = ?) AND type = ? AND status = ? ORDER BY created_at DESC LIMIT 1', + [player_name||'', player_uid||'', type||'ban', 'active']); + res.json({ minDays: prev ? parseDuration(prev.duration) : 0 }); +}); + router.post('/', authenticate, requireRole('owner'), async (req, res) => { const { player_name, player_uid, reason, type, duration, ticket_id, expires_at } = req.body; if (!player_name) return res.status(400).json({ error: '玩家名为必填' }); @@ -26,8 +33,8 @@ router.post('/', authenticate, requireRole('owner'), async (req, res) => { const durDays = parseDuration(duration); const prev = await getRow('SELECT * FROM bans WHERE (player_name = ? OR player_uid = ?) AND type = ? AND status = ? ORDER BY created_at DESC LIMIT 1', [player_name, player_uid||'', type||'ban', 'active']); - if (prev && durDays > 0 && parseDuration(prev.duration) >= durDays) { - return res.status(400).json({ error: `该玩家已有${parseDuration(prev.duration)}天处罚记录,新处罚时长不可低于上次(需 > ${parseDuration(prev.duration)}天)` }); + if (prev && durDays > 0 && parseDuration(prev.duration) > durDays) { + return res.status(400).json({ error: `该玩家已有${parseDuration(prev.duration)}天处罚记录,新处罚时长不可少于上次(需 ≥ ${parseDuration(prev.duration)}天)` }); } const r = await query('INSERT INTO bans(player_name, player_uid, reason, type, duration, ticket_id, created_by, expires_at) VALUES (?,?,?,?,?,?,?,?)', diff --git a/public/js/pages/dashboard.js b/public/js/pages/dashboard.js index d9545df..7fb215f 100644 --- a/public/js/pages/dashboard.js +++ b/public/js/pages/dashboard.js @@ -53,7 +53,7 @@ const Dashboard = { U.modal('添加封禁', `
-
+
@@ -65,5 +65,22 @@ const Dashboard = { App.closeModal(); this.mount(); } catch(ex) { alert(ex.message); } }; + setTimeout(() => Dashboard.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 {} } };