()
| 805 | } |
| 806 | } |
| 807 | function bindAdmin(){ |
| 808 | $('adminToken').value = S.admin.token; |
| 809 | $('adminTokenForm').addEventListener('submit', async e => { |
| 810 | e.preventDefault(); |
| 811 | S.admin.token = $('adminToken').value.trim(); |
| 812 | localStorage.setItem('serverstatusAdminToken', S.admin.token); |
| 813 | try{ await loadConfig(); }catch(err){ setAdminStatus('认证失败:' + err.message, 'err'); } |
| 814 | }); |
| 815 | $('refreshConfigBtn').addEventListener('click', async () => { try{ await loadConfig(); }catch(err){ setAdminStatus('刷新失败:' + err.message, 'err'); } }); |
| 816 | $('configTypeTabs').addEventListener('click', e => { |
| 817 | if(e.target.tagName !== 'BUTTON') return; |
| 818 | S.admin.selectedType = e.target.dataset.type; |
| 819 | S.admin.selectedIndex = -1; |
| 820 | renderConfigList(); |
| 821 | renderConfigEditor(); |
| 822 | }); |
| 823 | $('addConfigItemBtn').addEventListener('click', clearConfigForm); |
| 824 | $('resetConfigFormBtn').addEventListener('click', clearConfigForm); |
| 825 | $('adminReload').addEventListener('click', async () => { |
| 826 | try{ await api('/api/reload', { method:'POST' }); setAdminStatus('配置重载已触发。', 'ok'); } |
| 827 | catch(err){ setAdminStatus('重载失败:' + err.message, 'err'); } |
| 828 | }); |
| 829 | $('adminRestart').addEventListener('click', async () => { |
| 830 | if(!confirm('重启 sergate 采集服务?客户端会短暂断开后自动重连。')) return; |
| 831 | try{ await api('/api/restart', { method:'POST' }); setAdminStatus('服务重启已触发,等待容器入口脚本拉起 sergate。', 'ok'); } |
| 832 | catch(err){ setAdminStatus('重启失败:' + err.message, 'err'); } |
| 833 | }); |
| 834 | $('configForm').addEventListener('submit', async e => { |
| 835 | e.preventDefault(); |
| 836 | const def = activeConfigDef(); |
| 837 | const key = S.admin.selectedType; |
| 838 | const item = formConfigItem(); |
| 839 | const index = S.admin.selectedIndex; |
| 840 | try{ |
| 841 | await saveConfigItem(key, index, item); |
| 842 | S.admin.selectedIndex = index >= 0 ? index : configItems().length - 1; |
| 843 | renderConfigList(); |
| 844 | renderConfigEditor(configItems()[S.admin.selectedIndex]); |
| 845 | setAdminStatus(`${def.label}配置已保存并重载。`, 'ok'); |
| 846 | }catch(err){ setAdminStatus('保存失败:' + err.message, 'err'); } |
| 847 | }); |
| 848 | $('deleteConfigItemBtn').addEventListener('click', async () => { |
| 849 | const def = activeConfigDef(); |
| 850 | const key = S.admin.selectedType; |
| 851 | const index = S.admin.selectedIndex; |
| 852 | if(index < 0) return setAdminStatus(`请先选择要删除的${def.label}。`, 'err'); |
| 853 | const item = configItems()[index]; |
| 854 | if(!confirm(`删除${def.label} ${def.title(item, index)}?`)) return; |
| 855 | try{ |
| 856 | await deleteConfigItem(key, index); |
| 857 | S.admin.selectedIndex = -1; |
| 858 | renderConfigList(); |
| 859 | renderConfigEditor(); |
| 860 | setAdminStatus(`${def.label}配置已删除并重载。`, 'ok'); |
| 861 | }catch(err){ setAdminStatus('删除失败:' + err.message, 'err'); } |
| 862 | }); |
| 863 | } |
| 864 |
no test coverage detected