From b23f60e66b81fe303684369a3965ab4bc8c04f3b Mon Sep 17 00:00:00 2001 From: TheSmallHanCat Date: Sun, 11 Jan 2026 15:34:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EToken=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD(=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=9B=B4=E6=96=B0/=E6=89=B9=E9=87=8F=E5=90=AF?= =?UTF-8?q?=E7=94=A8/=E6=B8=85=E7=90=86=E7=A6=81=E7=94=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/admin.py | 73 ++++++++++++++++++++++++++++++++++++++++++++ static/generate.html | 2 +- static/manage.html | 24 +++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) diff --git a/src/api/admin.py b/src/api/admin.py index 35eb960..ed92281 100644 --- a/src/api/admin.py +++ b/src/api/admin.py @@ -348,6 +348,79 @@ async def delete_token(token_id: int, token: str = Depends(verify_admin_token)): except Exception as e: raise HTTPException(status_code=400, detail=str(e)) +@router.post("/api/tokens/batch/test-update") +async def batch_test_update(token: str = Depends(verify_admin_token)): + """Test and update all tokens by fetching their status from upstream""" + try: + tokens = await db.get_all_tokens() + success_count = 0 + failed_count = 0 + results = [] + + for token_obj in tokens: + try: + # Test token and update account info (same as single test) + result = await token_manager.test_token(token_obj.id) + if result.get("valid"): + success_count += 1 + results.append({"id": token_obj.id, "email": token_obj.email, "status": "success"}) + else: + failed_count += 1 + results.append({"id": token_obj.id, "email": token_obj.email, "status": "failed", "message": result.get("message")}) + except Exception as e: + failed_count += 1 + results.append({"id": token_obj.id, "email": token_obj.email, "status": "error", "message": str(e)}) + + return { + "success": True, + "message": f"测试完成:成功 {success_count} 个,失败 {failed_count} 个", + "success_count": success_count, + "failed_count": failed_count, + "results": results + } + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.post("/api/tokens/batch/enable-all") +async def batch_enable_all(token: str = Depends(verify_admin_token)): + """Enable all disabled tokens""" + try: + tokens = await db.get_all_tokens() + enabled_count = 0 + + for token_obj in tokens: + if not token_obj.is_active: + await token_manager.enable_token(token_obj.id) + enabled_count += 1 + + return { + "success": True, + "message": f"已启用 {enabled_count} 个禁用的Token", + "enabled_count": enabled_count + } + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.post("/api/tokens/batch/delete-disabled") +async def batch_delete_disabled(token: str = Depends(verify_admin_token)): + """Delete all disabled tokens""" + try: + tokens = await db.get_all_tokens() + deleted_count = 0 + + for token_obj in tokens: + if not token_obj.is_active: + await token_manager.delete_token(token_obj.id) + deleted_count += 1 + + return { + "success": True, + "message": f"已删除 {deleted_count} 个禁用的Token", + "deleted_count": deleted_count + } + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + @router.post("/api/tokens/import") async def import_tokens(request: ImportTokensRequest, token: str = Depends(verify_admin_token)): """Import tokens with different modes: offline/at/st/rt""" diff --git a/static/generate.html b/static/generate.html index a290b95..727964f 100644 --- a/static/generate.html +++ b/static/generate.html @@ -1529,7 +1529,7 @@
- +
diff --git a/static/manage.html b/static/manage.html index 4d9b4a0..94f1fdd 100644 --- a/static/manage.html +++ b/static/manage.html @@ -101,6 +101,27 @@ + + +