fix: data-action delegation + convert onclick to event listeners, sidebar+logout+modals

This commit is contained in:
2026-07-15 02:44:18 +08:00
parent 9e15a319f5
commit f0e891b17c
20 changed files with 147 additions and 133 deletions

View File

@@ -34,38 +34,38 @@ const TicketCreate = {
${isReport ? `
<div class="grid-2">
<div class="form-group"><label>对方游戏名称 (至少一项)</label><input name="target_game_name" placeholder="被举报者Minecraft ID"></div>
<div class="form-group"><label>对方游戏UID (至少一项)</label><input name="target_game_uid" placeholder="被举报者UID"></div>
<div class="form-group"><label>å¯¹æ¹æ¸¸æˆ<EFBFBD>å<EFBFBD><EFBFBD>ç§° (至少一é¡?</label><input name="target_game_name" placeholder="被举报者Minecraft ID"></div>
<div class="form-group"><label>å¯¹æ¹æ¸¸æˆ<EFBFBD>UID (至少一é¡?</label><input name="target_game_uid" placeholder="被举报者UID"></div>
</div>
<div class="form-group"><label>举报原因 *</label>
<input name="reason" list="reason-list" required placeholder="选择或自行输入举报原因">
<input name="reason" list="reason-list" required placeholder="选择或自行输入举报原�>
<datalist id="reason-list">
<option value="ç ´å<C2B4><C3A5>建ç­"><option value="ç—窃物å“<C3A5>"><option value="外挂作弊">
<option value="语言骚扰"><option value="æ<>¶æ„<C3A6>PVP"><option value="利用æ¼<C3A6>æ´ž">
<option value="å…¶ä»è¿<C3A8>è§„"><option value="诈骗"><option value="æ<>¶æ„<C3A6>è¾±éª">
</datalist>
</div>
<div class="form-group"><label>详细描述</label><textarea name="description" rows="4" placeholder="请详细描述事件经过..."></textarea></div>
<div class="form-group"><label>详细æ<EFBFBD><EFBFBD>è¿°</label><textarea name="description" rows="4" placeholder="请详细æ<EFBFBD><EFBFBD>è¿°äºä»¶ç»<EFBFBD>è¿?.."></textarea></div>
<div class="form-group" style="display:flex;align-items:center;gap:8px;margin-top:12px">
<input type="checkbox" name="is_admin_complaint" value="1" id="cb-admin" style="width:auto">
<label for="cb-admin" style="margin:0;font-weight:500;text-transform:none;letter-spacing:0;color:var(--d)"><i class="fas fa-exclamation-triangle"></i> 投诉管ç<C2A1>†å˜ï¼ˆä»…æœ<C3A6>主å<C2BB>¯è§<C3A8>)</label>
</div>
` : isAppeal ? `
<div class="form-group"><label>申诉理由 *</label><input name="reason" required placeholder="如:误封、证据不足被封、违规行为已纠正等"></div>
<div class="form-group"><label>详细说明 *</label><textarea name="description" rows="5" placeholder="请详细说明情况,包括被封时间、可能原因、为什么应解封等..." required></textarea></div>
<div class="form-group"><label>申诉ç<EFBFBD>†ç”± *</label><input name="reason" required placeholder="å¦ï¼šè¯¯å°<EFBFBD>ã€<EFBFBD>è¯<EFBFBD>æ<EFBFBD>®ä¸<EFBFBD>足被å°<EFBFBD>ã€<EFBFBD>è¿<EFBFBD>规行为已纠正ç­?></div>
<div class="form-group"><label>详细说明 *</label><textarea name="description" rows="5" placeholder="请详细说明情况,包æ¬è¢«å°<EFBFBD>æ—¶é—´ã€<EFBFBD>å<EFBFBD>¯èƒ½åŽŸå ã€<EFBFBD>为什么应解å°<EFBFBD>ç­?.." required></textarea></div>
` : `
<div class="form-group"><label>建议内容 *</label><textarea name="description" rows="5" placeholder="请详细描述您的建议..." required></textarea></div>
<div class="form-group"><label>建议内容 *</label><textarea name="description" rows="5" placeholder="请详细æ<EFBFBD><EFBFBD>è¿°æ¨çš„建è®?.." required></textarea></div>
`}
</div>
</div>
<div class="card">
<div class="card-h">上传文件 (图片/视频每个最大20MB)</div>
<div class="card-h">上传文件 (图片/视é¢ï¼Œæ¯<C3A6>个最å¤?0MB)</div>
<div class="card-b">
<div class="file-upload" id="file-drop">
<i class="fas fa-cloud-upload-alt"></i>
<p>点击选择文件或拖拽到此处</p>
<p class="help">支持: JPG/PNG/GIF/WebP/MP4/WebM &nbsp; 每个最大50MB</p>
<p class="help">支æŒ<EFBFBD>: JPG/PNG/GIF/WebP/MP4/WebM &nbsp; æ¯<EFBFBD>个最å¤?0MB</p>
</div>
<input type="file" id="file-input" multiple accept="image/jpeg,image/png,image/gif,image/webp,video/mp4,video/webm" style="display:none">
<div class="file-list" id="file-list"></div>
@@ -104,7 +104,7 @@ const TicketCreate = {
for (const f of fileList) {
if (!allowed.includes(f.type)) { alert(`ä¸<EFBFBD>支æŒ<EFBFBD>çš„æ‡ä»¶ç±»åž: ${f.name}`); continue; }
if (f.size > 50 * 1024 * 1024) { alert(`文件过大: ${f.name}`); continue; }
if (this.files.length >= 5) { alert('最多5个文件'); break; }
if (this.files.length >= 5) { alert('最�个文�); break; }
this.files.push(f);
}
this.refreshFileList(listEl);
@@ -137,13 +137,13 @@ const TicketCreate = {
const btn = form.querySelector('[type="submit"]');
btn.disabled = true;
btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> 提交中...';
btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> æ<EFBFBD><EFBFBD>交ä¸?..';
try {
const res = await API.req('POST', '/tickets', fd);
if (res.tracking_token) {
document.cookie = `tracking_token=${res.tracking_token};path=/;max-age=${365*24*3600};SameSite=Lax`;
}
alert('提交成功!工单编号: #' + res.id);
alert('æ<EFBFBD><EFBFBD>交æˆ<EFBFBD>功ï¼<EFBFBD>å·¥å<EFBFBD>•ç¼å<EFBFBD>? #' + res.id);
if (Auth.logged()) App.navigate('tickets');
else App.navigate('home');
} catch (ex) {