fix: 12 issues - admin permission scope, player sidebar nav, SMTP label, user create servers

This commit is contained in:
2026-07-16 23:04:15 +08:00
parent e46dad9f95
commit 09f0d8f2aa
4 changed files with 31 additions and 16 deletions

View File

@@ -1,17 +1,17 @@
const App = {
navItems: [
{ id: 'dashboard', label: '控制台', icon: 'fa-chart-simple', roles: ['owner','admin','player'] },
{ id: 'unclaimed', label: '待处理工单', icon: 'fa-inbox', roles: ['owner','admin'] },
{ id: 'tickets-create', label: '提交工单', icon: 'fa-plus-circle', roles: ['player'] },
{ id: 'tickets', label: '工单列表', icon: 'fa-ticket-alt', roles: ['owner','admin','player'] },
{ id: 'tracking', label: '追踪工单', icon: 'fa-search', roles: ['owner','admin','player'] },
{ id: 'users', label: '用户管理', icon: 'fa-users', roles: ['owner','admin'] },
{ id: 'notifications', label: '通知配置', icon: 'fa-bell', roles: ['owner','admin'] },
{ id: 'templates', label: '邮件模板', icon: 'fa-envelope', roles: ['owner','admin'] },
{ id: 'settings', label: '系统设置', icon: 'fa-cog', roles: ['owner','admin'] },
{ 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'] },
{ id: 'polls', label: '投票', icon: 'fa-poll', roles: ['owner'] },
{ id: 'features', label: '更新内容', icon: 'fa-lightbulb', roles: ['owner'] },
{ id: 'notifications', label: '通知配置', icon: 'fa-bell', roles: ['owner'] },
{ id: 'templates', label: '邮件模板', icon: 'fa-envelope', roles: ['owner'] },
{ id: 'settings', label: '系统设置', icon: 'fa-cog', roles: ['owner'] },
{ id: 'export', label: '数据导出', icon: 'fa-download', roles: ['owner'] },
{ id: 'polls', label: '投票', icon: 'fa-poll', roles: ['owner','admin','player'] },
{ id: 'features', label: '更新内容', icon: 'fa-lightbulb', roles: ['owner','admin','player'] },
{ id: 'servers', label: '服务器管理', icon: 'fa-server', roles: ['owner','admin'] },
],
async init() {
@@ -81,6 +81,7 @@ const App = {
switch (page) {
case 'dashboard': this.renderMain('控制台', Dashboard, param); break;
case 'unclaimed': this.renderMain('待处理工单', UnclaimedPage, param); break;
case 'tickets-create': App.navigate('tickets','create?type=report'); break;
case 'tickets':
if (param === 'create') {
const q = new URLSearchParams((location.hash.split('?')[1] || ''));
@@ -120,10 +121,9 @@ const App = {
if (Auth.logged()) {
const u = Auth.user();
el.innerHTML = `<span class="tm ts">${U.esc(u.game_name||u.username)}</span>
<a href="#/dashboard" class="btn btn-p btn-sm"><i class="fas fa-chart-simple"></i> 控制台</a>
<a href="#/polls" class="btn btn-o btn-sm"><i class="fas fa-poll"></i> 投票</a>
<a href="#/features" class="btn btn-o btn-sm"><i class="fas fa-lightbulb"></i> 更新</a>
${Auth.isAdmin() ? `<a href="#/unclaimed" class="btn btn-o btn-sm">待处理</a>`:''}
${Auth.isAdmin() ? `<a href="#/dashboard" class="btn btn-p btn-sm"><i class="fas fa-chart-simple"></i> 控制台</a>` : ''}
${Auth.isAdmin() ? `<a href="#/unclaimed" class="btn btn-o btn-sm">待处理</a>` : ''}
${Auth.isOwner() ? `<a href="#/polls" class="btn btn-o btn-sm"><i class="fas fa-poll"></i></a>` : ''}
<button class="btn btn-o btn-sm" onclick="App.logout()"><i class="fas fa-sign-out-alt"></i> 退出</button>`;
} else {
el.innerHTML = `<a href="#/login" class="btn btn-o btn-sm"><i class="fas fa-sign-in-alt"></i> 登录</a><a href="#/register" class="btn btn-p btn-sm"><i class="fas fa-user-plus"></i> 注册</a>`;
@@ -136,7 +136,7 @@ const App = {
document.getElementById('public-page').classList.add('hidden');
document.getElementById('main-layout').classList.remove('hidden');
const u = Auth.user();
document.getElementById('user-info').innerHTML = `<div class="av">${U.esc(u.game_name||u.username).charAt(0).toUpperCase()}</div><div class="dt"><div class="nm">${U.esc(u.game_name||u.username)}</div><div class="rl">${U.ROLE[u.role]}</div></div>`;
document.getElementById('user-info').innerHTML = `<div class="dt"><div class="nm">${U.esc(u.game_name||u.username)}</div></div>`;
document.getElementById('sidebar-logout').onclick = () => App.logout();
this.loadFooter();
},