From 47249c6dab3b54bdac4827b26a2dcef6f210ed4e Mon Sep 17 00:00:00 2001 From: xunbu Date: Mon, 14 Jul 2025 15:31:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0admin=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docutranslate/app.py | 16 ++++++++++++++-- docutranslate/static/index.html | 32 +++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/docutranslate/app.py b/docutranslate/app.py index 5d08f38..8d6885c 100644 --- a/docutranslate/app.py +++ b/docutranslate/app.py @@ -368,6 +368,10 @@ async def service_get_engin_list(): if available_packages.get("docling"): engin_list.append("docling") return JSONResponse(content=engin_list) +@service_router.get("/task-list", summary="获取所有task-id") +async def service_get_task_list(): + return JSONResponse(content=list(tasks_state.keys())) + @service_router.get("/default-params", summary="获取默认翻译参数") def service_get_default_params(): @@ -477,7 +481,9 @@ async def get_logs_from_queue_for_frontend(request: Request, task_id: str = Quer @backend_router.get("/get-engin-list") async def get_engin_list_for_frontend(request: Request): return await _proxy_request(request, "GET", "/service/engin-list") - +@backend_router.get("/get-task-list") +async def get_task_list_for_frontend(request: Request): + return await _proxy_request(request, "GET", "/service/task-list") @backend_router.get("/translate/default_param") async def get_default_param_for_frontend(request: Request): @@ -500,7 +506,13 @@ async def main_page(): no_cache_headers = {"Cache-Control": "no-store, no-cache, must-revalidate, max-age=0", "Pragma": "no-cache", "Expires": "0"} return FileResponse(index_path, headers=no_cache_headers) - +@app.get("/admin", response_class=HTMLResponse, include_in_schema=False) +async def main_page_admin(): + index_path = Path(STATIC_DIR) / "index.html" + if not index_path.exists(): raise HTTPException(status_code=404, detail="index.html not found") + no_cache_headers = {"Cache-Control": "no-store, no-cache, must-revalidate, max-age=0", "Pragma": "no-cache", + "Expires": "0"} + return FileResponse(index_path, headers=no_cache_headers) @app.post("/temp/translate") async def temp_translate(base_url: str = Body(...), api_key: str = Body(...), diff --git a/docutranslate/static/index.html b/docutranslate/static/index.html index b258745..d6f3acb 100644 --- a/docutranslate/static/index.html +++ b/docutranslate/static/index.html @@ -454,6 +454,7 @@ // --- Global State --- let defaultParams = {}; const tasks = {}; // { taskId: { elements: {...}, state: {...}, intervals: {...} } } + let isAdminMode = false; // Flag for admin view const apiHrefMap = { "https://openrouter.ai/api/v1": "https://openrouter.ai/settings/keys", @@ -530,6 +531,7 @@ } function saveTaskIds() { + if (isAdminMode) return; // In admin mode, do not save task list to localStorage const taskIds = Object.keys(tasks); saveToStorage('active_task_ids', JSON.stringify(taskIds)); } @@ -955,6 +957,9 @@ // --- Initialization --- async function init() { + // Determine if in admin mode + isAdminMode = window.location.pathname === '/admin'; + // Fetch metadata try { const [metaRes, enginRes, paramsRes] = await Promise.all([ @@ -996,12 +1001,29 @@ setupSlider(concurrentSlider, concurrentDisplay, concurrentReset, 'concurrent', defaultParams); setupSlider(temperatureSlider, temperatureDisplay, temperatureReset, 'temperature', defaultParams); - // Restore tasks - const savedTaskIds = JSON.parse(getFromStorage('active_task_ids', '[]')); - if (savedTaskIds.length > 0) { - savedTaskIds.forEach(taskId => createTaskCard(taskId, true)); + // Restore tasks based on mode + if (isAdminMode) { + document.title = "DocuTranslate - Admin Panel"; + try { + const response = await fetch('/backend/get-task-list'); + if (!response.ok) throw new Error(`Failed to fetch task list: ${response.statusText}`); + const allTaskIds = await response.json(); + if (allTaskIds && Array.isArray(allTaskIds) && allTaskIds.length > 0) { + allTaskIds.reverse().forEach(taskId => createTaskCard(taskId, true)); + } + } catch (error) { + console.error("Admin mode: Failed to load task list from server.", error); + alert("无法从服务器加载任务列表,请检查后台连接。"); + } + updateTaskPlaceholderVisibility(); } else { - createTaskCard(); // Create one new task by default + // Normal mode: Restore from localStorage + const savedTaskIds = JSON.parse(getFromStorage('active_task_ids', '[]')); + if (savedTaskIds.length > 0) { + savedTaskIds.forEach(taskId => createTaskCard(taskId, true)); + } else { + createTaskCard(); // Create one new task by default + } } // Add event listeners for settings