const UsersPage = { async render() { return '
'; }, async mount() { document.getElementById('page-title').textContent = '用户管理'; document.getElementById('page-actions').innerHTML = ''; await this.load(); }, async load() { const ct = document.getElementById('page-content'); try { const users = await API.get('/users'); const srcLabel = { netease:'网易', skin:'皮肤站' }; ct.innerHTML = `
${users.map(u => ` `).join('')}
#用户名邮箱游戏名游戏UID来源角色状态时间操作
${u.id}${U.esc(u.username)}${U.esc(u.email)} ${U.esc(u.game_name)}${U.esc(u.game_uid)} ${srcLabel[u.source] || u.source || '网易'} ${U.badge(u.role,'role')} ${u.active ? '启用' : '禁用'} ${U.date(u.created_at)}
`; } catch (e) { ct.innerHTML = `
${e.message}
`; } }, createUser() { U.modal('添加用户', `
`); document.getElementById('cu-form').onsubmit = async e => { e.preventDefault(); try { await API.post('/users', { username: document.getElementById('cu-u').value, password: document.getElementById('cu-p').value, email: document.getElementById('cu-e').value, role: document.getElementById('cu-r').value, game_name: document.getElementById('cu-gn').value, game_uid: document.getElementById('cu-gu').value, source: document.getElementById('cu-s').value, }); App.closeModal(); this.load(); } catch (ex) { alert(ex.message); } }; }, editUser(id, username, email, gameName, gameUid, role, active, source) { this.loadUserServers(id, username, email, gameName, gameUid, role, active, source); }, async loadUserServers(id, username, email, gameName, gameUid, role, active, source) { let groups = [], userServers = []; try { groups = await API.get('/polls/groups'); } catch {} try { const u = await API.get('/users/'+id); userServers = u.admin_servers ? (typeof u.admin_servers==='string'?JSON.parse(u.admin_servers):u.admin_servers) : []; } catch {} const checks = groups.map(g => { const key = g.group_name+'::'+g.server_name; const has = userServers.some(s => s.group_name===g.group_name && s.server_name===g.server_name); return ``; }).join(''); U.modal('编辑用户', `
${checks||'无可用服务器(先在投票→分组管理中添加)'}
`); document.getElementById('eu-form').onsubmit = async e => { e.preventDefault(); const servers = []; document.querySelectorAll('.eu-srv:checked').forEach(cb => { const [g,s] = cb.value.split('::'); servers.push({group_name:g,server_name:s}); }); const data = { email: document.getElementById('eu-e').value, role: document.getElementById('eu-r').value, game_name: document.getElementById('eu-gn').value, game_uid: document.getElementById('eu-gu').value, active: document.getElementById('eu-a').value === '1', source: document.getElementById('eu-s').value, admin_servers: servers, }; const pw = document.getElementById('eu-p').value; if (pw) data.password = pw; try { await API.put('/users/'+id, data); App.closeModal(); this.load(); } catch (ex) { alert(ex.message); } }; } };