Files
chat/backend/app/routers/admin.py
T
2026-06-12 23:14:12 +08:00

131 lines
3.7 KiB
Python

"""管理后台路由"""
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}