From 9eb893e831aa74b268b672ca79a7b99bd2ec0aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Wed, 19 Nov 2025 22:58:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E8=B7=AF=E7=94=B1=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E5=92=8C=E7=8A=B6=E6=80=81=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/webui/routers/system.py | 108 ++++++++++++++++++++++++++++++++++++ src/webui/routes.py | 3 + 2 files changed, 111 insertions(+) create mode 100644 src/webui/routers/system.py diff --git a/src/webui/routers/system.py b/src/webui/routers/system.py new file mode 100644 index 00000000..743da5b9 --- /dev/null +++ b/src/webui/routers/system.py @@ -0,0 +1,108 @@ +""" +系统控制路由 + +提供系统重启、状态查询等功能 +""" +import os +import sys +import time +from datetime import datetime +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +from src.config.config import MMC_VERSION + +router = APIRouter(prefix="/system", tags=["system"]) + +# 记录启动时间 +_start_time = time.time() + + +class RestartResponse(BaseModel): + """重启响应""" + success: bool + message: str + + +class StatusResponse(BaseModel): + """状态响应""" + running: bool + uptime: float + version: str + start_time: str + + +@router.post("/restart", response_model=RestartResponse) +async def restart_maibot(): + """ + 重启麦麦主程序 + + 使用 os.execv 重启当前进程,配置更改将在重启后生效。 + 注意:此操作会使麦麦暂时离线。 + """ + try: + # 记录重启操作 + print(f"[{datetime.now()}] WebUI 触发重启操作") + + # 使用 os.execv 重启当前进程 + # 这会替换当前进程,保持相同的 PID + python = sys.executable + args = [python] + sys.argv + + # 返回成功响应(实际上这个响应可能不会发送,因为进程会立即重启) + # 但我们仍然返回它以保持 API 一致性 + os.execv(python, args) + + return RestartResponse( + success=True, + message="麦麦正在重启中..." + ) + except Exception as e: + raise HTTPException( + status_code=500, + detail=f"重启失败: {str(e)}" + ) from e + + +@router.get("/status", response_model=StatusResponse) +async def get_maibot_status(): + """ + 获取麦麦运行状态 + + 返回麦麦的运行状态、运行时长和版本信息。 + """ + try: + uptime = time.time() - _start_time + + # 尝试获取版本信息(需要根据实际情况调整) + version = MMC_VERSION # 可以从配置或常量中读取 + + return StatusResponse( + running=True, + uptime=uptime, + version=version, + start_time=datetime.fromtimestamp(_start_time).isoformat() + ) + except Exception as e: + raise HTTPException( + status_code=500, + detail=f"获取状态失败: {str(e)}" + ) from e + + +# 可选:添加更多系统控制功能 + +@router.post("/reload-config") +async def reload_config(): + """ + 热重载配置(不重启进程) + + 仅重新加载配置文件,某些配置可能需要重启才能生效。 + 此功能需要在主程序中实现配置热重载逻辑。 + """ + # 这里需要调用主程序的配置重载函数 + # 示例:await app_instance.reload_config() + + return { + "success": True, + "message": "配置重载功能待实现" + } diff --git a/src/webui/routes.py b/src/webui/routes.py index b52dede6..b71619ed 100644 --- a/src/webui/routes.py +++ b/src/webui/routes.py @@ -11,6 +11,7 @@ from .expression_routes import router as expression_router from .emoji_routes import router as emoji_router from .plugin_routes import router as plugin_router from .plugin_progress_ws import get_progress_router +from .routers.system import router as system_router logger = get_logger("webui.api") @@ -31,6 +32,8 @@ router.include_router(emoji_router) router.include_router(plugin_router) # 注册插件进度 WebSocket 路由 router.include_router(get_progress_router()) +# 注册系统控制路由 +router.include_router(system_router) class TokenVerifyRequest(BaseModel):