131 lines
3.7 KiB
Python
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}
|