"""管理后台路由""" from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from app.dependencies import get_db, get_admin_user from app.schemas.admin import ( AdminLoginRequest, AdminLoginResponse, DashboardStats, UserBanRequest, SystemConfigUpdate, ) from app.services.admin_service import AdminService from app.services.message_service import MessageService router = APIRouter() @router.post("/login", response_model=AdminLoginResponse) async def admin_login( req: AdminLoginRequest, db: AsyncSession = Depends(get_db), ): """管理员登录(仅密码)""" service = AdminService(db) token = await service.login(req.password) if not token: raise HTTPException(status_code=401, detail="管理员密码错误") return AdminLoginResponse(access_token=token) @router.get("/dashboard", response_model=DashboardStats) async def admin_dashboard( _=Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): """仪表盘统计数据""" service = AdminService(db) return await service.get_dashboard_stats() @router.get("/stats/{metric}") async def admin_stats( metric: str, days: int = Query(7, ge=1, le=90), _=Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): """获取趋势数据 (online/messages/registrations)""" if metric not in ("online", "messages", "registrations"): raise HTTPException(status_code=400, detail="无效的指标类型") service = AdminService(db) return await service.get_trend_data(metric, days) @router.get("/users") async def admin_users( page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=100), search: str | None = Query(None), status: str | None = Query(None), _=Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): """用户管理列表""" service = AdminService(db) return await service.get_users_list(page, page_size, search, status) @router.put("/users/{user_id}/ban") async def admin_ban_user( user_id: str, req: UserBanRequest, _=Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): """封禁/解封用户""" service = AdminService(db) try: await service.ban_user(user_id, req.is_banned, req.reason) return {"success": True} except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) @router.delete("/users/{user_id}") async def admin_delete_user( user_id: str, _=Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): """删除用户""" service = AdminService(db) await service.delete_user(user_id) return {"success": True} @router.get("/messages") async def admin_messages( user_id: str | None = Query(None), conversation_id: str | None = Query(None), keyword: str | None = Query(None), date_from: str | None = Query(None), date_to: str | None = Query(None), _=Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): """搜索消息(管理审查)""" service = MessageService(db) return await service.search_messages(user_id, conversation_id, keyword, date_from, date_to) @router.get("/config") async def admin_get_config( _=Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): """获取系统配置""" service = AdminService(db) return await service.get_all_configs() @router.put("/config") async def admin_update_config( req: SystemConfigUpdate, _=Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): """更新系统配置""" service = AdminService(db) await service.update_configs(req.configs) return {"success": True}