diff --git a/server/api.py b/server/api.py index 050b7df..04b5ea4 100644 --- a/server/api.py +++ b/server/api.py @@ -389,9 +389,6 @@ async def api_import_backup(file: UploadFile = File(...)): from config.settings import reload_config reload_config() - from models.dashboard import dashboard_manager - import importlib - importlib.reload(__import__('models.dashboard', fromlist=['dashboard_manager'])) from server.game_manager import game_plugin_manager game_plugin_manager.reload() @@ -400,6 +397,15 @@ async def api_import_backup(file: UploadFile = File(...)): return {"ok": False, "message": str(e)} +# ---- Restart ---- +@router.post("/restart") +async def api_restart(): + import os, sys, atexit + logger.info("Restart requested via API") + atexit.register(lambda: os.execv(sys.executable, [sys.executable] + sys.argv)) + sys.exit(0) + + # ---- Data Forwarding ---- @router.get("/forward") async def api_list_forward_targets(): diff --git a/static/js/pages/settings.js b/static/js/pages/settings.js index b1043ce..891f7b0 100644 --- a/static/js/pages/settings.js +++ b/static/js/pages/settings.js @@ -111,6 +111,18 @@ const PageSettings = { }; input.click(); }); + document.getElementById('btn-restart-server')?.addEventListener('click', async () => { + if (!confirm('确定重启 TurboSu 服务?')) return; + try { + await fetch('/api/restart', { method: 'POST' }); + Toast.show('服务正在重启,3秒后自动刷新...', 'info'); + setTimeout(() => location.reload(), 3000); + } catch (e) { + Toast.show('重启请求已发送,请手动刷新', 'info'); + setTimeout(() => location.reload(), 3000); + } + }); + document.getElementById('settings-test-mode')?.addEventListener('change', async (e) => { const on = e.target.checked; await API.updateConfig({ ui_test_mode: on }); @@ -184,7 +196,9 @@ const PageSettings = { '