from fastapi import APIRouter, HTTPException, Body from . import schemas from .services import face_service router = APIRouter() @router.post("/register", response_model=schemas.RegisterResponse, summary="注册新的人脸") async def register(request: schemas.RegisterRequest): """ 为用户注册一张新的人脸。 - **功能**: 将一张图片中的人脸与一个用户ID和姓名关联起来。 - **校验**: - 检查用户ID是否已被他人注册。 - 确保图片中只包含一张清晰可识别的人脸。 - **操作**: 如果是新用户,会创建用户记录;然后将提取到的人脸特征向量存入数据库。 """ try: if not request.url and not request.face_data: raise ValueError("必须提供图片的url或face_data。") user_info = face_service.register_new_face(request.id, request.name, request) return schemas.RegisterResponse(data=user_info) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except Exception as e: raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}") @router.post("/detect", response_model=schemas.DetectResponse, summary="1:N 人脸识别") async def detect(request: schemas.ImageSource = Body(...)): """ 在一张图片中检测并识别所有已知的人脸。 - **功能**: 对比图片中的人脸与数据库中的所有人脸,返回匹配结果。 - **阈值**: 内部使用相似度阈值来判断是否匹配成功。 - **返回**: 返回一个列表,包含所有被识别出的人员信息、位置和置信度。 """ try: if not request.url and not request.face_data: raise ValueError("必须提供图片的url或face_data。") detected_faces = face_service.detect_faces(request) return schemas.DetectResponse(data=detected_faces) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except Exception as e: raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}") @router.post("/verify", response_model=schemas.VerifyResponse, summary="1:1 人脸认证") async def verify(request: schemas.VerifyRequest): """ 验证一张图片中的人脸是否属于指定的用户ID。 - **功能**: 精确比对,判断“这张脸是不是这个人”。 - **场景**: 用于人脸登录、刷脸支付等高安全要求的场景。 - **返回**: 返回布尔值 `match` 表示是否匹配,以及具体的相似度 `confidence`。 """ try: if not request.url and not request.face_data: raise ValueError("必须提供图片的url或face_data。") verification_result = face_service.verify_face(request.id, request) return schemas.VerifyResponse(data=verification_result) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except Exception as e: raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}") @router.delete("/users/{user_id}", response_model=schemas.StandardResponse, summary="删除用户") async def delete_user(user_id: int): """ 根据用户ID,从数据库中删除该用户及其所有注册的人脸信息。 """ try: deleted_user = face_service.delete_user(user_id) return schemas.StandardResponse(message=f"成功删除用户 {deleted_user['name']} (ID: {user_id})。") except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) except Exception as e: raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}") @router.get("/users/{user_id}", response_model=schemas.RegisterResponse, summary="获取单个用户信息") async def get_user(user_id: int): """ 根据用户ID,查询并返回用户的详细信息。 """ user_info = face_service.get_user(user_id) if not user_info: raise HTTPException(status_code=404, detail=f"ID为 {user_id} 的用户不存在。") return schemas.RegisterResponse(data=user_info) @router.get("/users", response_model=schemas.UserListResponse, summary="获取所有用户列表") async def list_users(skip: int = 0, limit: int = 100): """ 获取数据库中所有已注册用户的列表,支持分页。 """ users_list = face_service.list_all_users(skip=skip, limit=limit) return schemas.UserListResponse(data=users_list) # 可以在这里继续添加其他API端点...