const Dashboard = { async render() { return '
'; }, async mount() { const ct = document.getElementById('page-content'); document.getElementById('page-title').textContent = '控制台'; document.getElementById('page-actions').innerHTML = ` `; try { const [stats, exports] = await Promise.all([ API.get('/tickets/stats'), Auth.isOwner() ? API.get('/export/dashboard') : null, ]); const bans = Auth.isAdmin() ? await API.get('/bans/active').catch(()=>[]) : []; this.renderContent(ct, stats, exports, bans); } catch (e) { ct.innerHTML = `
${e.message}
`; } }, renderContent(ct, stats, exports) { const byStatus = stats.byStatus || {}; ct.innerHTML = `
${stats.total}
工单总数
${byStatus.pending || 0}
待处理
${byStatus.processing || 0}
处理中
${byStatus.resolved || 0}
已解决
${Auth.isAdmin() ? `
封禁列表 ${Auth.isOwner() ? ``:''}
${bans.length === 0 ? '暂无封禁记录' : `${bans.map(b=>``).join('')}
玩家类型原因时长时间
${U.esc(b.player_name)}${b.type==='ban'?'封禁':b.type==='mute'?'禁言':'其他'}${U.esc(b.reason||'')}${b.duration||'永久'}${U.date(b.created_at)}
`}
` : ''}
类型分布
${(exports.byType||[]).map(r => `
${U.TYPE[r.type]||r.type}${r.c} 条
`).join('')}
状态分布
${(exports.byStatus||[]).map(r => `
${U.STATUS[r.status]||r.status}${r.c} 条
`).join('')}
${exports.monthly?.length ? `
月度趋势
${exports.monthly.map(m=>``).join('')}
月份数量
${m.m}${m.c}
` : ''} ` : ''}

提示: 可在"工单列表"中查看和管理所有工单

`; }, 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.mount(); } catch(ex) { alert(ex.message); } }; } };