优化代码风格

This commit is contained in:
ZZX9599
2025-09-08 17:34:23 +08:00
parent 9b3d20511a
commit 8ceb92c572
20 changed files with 223 additions and 192 deletions

View File

@ -18,27 +18,27 @@ router = APIRouter(
# ------------------------------
# 1. 创建人脸记录(核心修正ID 数据库自增前端无需传)
# 1. 创建人脸记录(核心修正: ID 数据库自增前端无需传)
# ------------------------------
@router.post("", response_model=APIResponse, summary="创建人脸记录(传名称+文件ID自增")
@router.post("", response_model=APIResponse, summary="创建人脸记录(传名称+文件ID自增")
async def create_face(
# 前端仅需传name可选Form格式、file必传文件)
# 前端仅需传: name可选Form格式、file必传文件)
name: str = Form(None, max_length=255, description="名称(可选)"),
file: UploadFile = File(..., description="人脸文件(必传暂不处理内容)")
file: UploadFile = File(..., description="人脸文件(必传暂不处理内容)")
):
"""
创建人脸记录
创建人脸记录:
- 需登录认证
- 前端传参multipart/form-data 表单name 可选file 必传)
- ID 由数据库自动生成无需前端传入
- 暂不处理文件内容eigenvalue 设为 None
- 前端传参: multipart/form-data 表单name 可选file 必传)
- ID 由数据库自动生成无需前端传入
- 暂不处理文件内容eigenvalue 设为 None
"""
# 调用你的方法
conn = None
cursor = None
try:
# 1. 用模型校验 name仅校验长度无需ID
# 1. 用模型校验 name仅校验长度无需ID
face_create = FaceCreateRequest(name=name)
conn = db.get_connection()
@ -57,9 +57,9 @@ async def create_face(
)
# 打印数组长度
print(f"文件大小{len(file_content)} 字节")
print(f"文件大小: {len(file_content)} 字节")
# 2. 插入数据库无需传 ID自增只传 name 和 eigenvalueNone
# 2. 插入数据库: 无需传 ID自增只传 name 和 eigenvalueNone
insert_query = """
INSERT INTO face (name, eigenvalue)
VALUES (%s, %s)
@ -67,7 +67,7 @@ async def create_face(
cursor.execute(insert_query, (face_create.name, str(eigenvalue)))
conn.commit()
# 3. 获取数据库自动生成的 ID关键用 LAST_INSERT_ID() 查刚插入的记录)
# 3. 获取数据库自动生成的 ID关键: 用 LAST_INSERT_ID() 查刚插入的记录)
select_new_query = "SELECT * FROM face WHERE id = LAST_INSERT_ID()"
cursor.execute(select_new_query)
created_face = cursor.fetchone()
@ -75,12 +75,12 @@ async def create_face(
if not created_face:
raise HTTPException(
status_code=500,
detail="创建人脸记录成功但无法获取新创建的记录"
detail="创建人脸记录成功但无法获取新创建的记录"
)
return APIResponse(
code=201,
message=f"人脸记录创建成功ID{created_face['id']}文件名{file.filename}",
message=f"人脸记录创建成功ID: {created_face['id']}文件名: {file.filename}",
data=FaceResponse(** created_face)
)
except MySQLError as e:
@ -89,13 +89,13 @@ async def create_face(
# 改为使用HTTPException
raise HTTPException(
status_code=500,
detail=f"创建人脸记录失败{str(e)}"
detail=f"创建人脸记录失败: {str(e)}"
) from e
except Exception as e:
# 捕获其他可能的异常
raise HTTPException(
status_code=500,
detail=f"服务器错误{str(e)}"
detail=f"服务器错误: {str(e)}"
) from e
finally:
await file.close() # 关闭文件流
@ -113,11 +113,11 @@ async def create_face(
eigenvalue = str(eigenvalue)
# ------------------------------
# 2. 获取单个人脸记录(不变用自增ID查询
# 2. 获取单个人脸记录(不变用自增ID查询
# ------------------------------
@router.get("/{face_id}", response_model=APIResponse, summary="获取单个人脸记录")
async def get_face(
face_id: int, # 这里的 ID 是数据库自增的前端从创建响应中获取
face_id: int, # 这里的 ID 是数据库自增的前端从创建响应中获取
current_user: UserResponse = Depends(get_current_user)
):
conn = None
@ -145,7 +145,7 @@ async def get_face(
# 改为使用HTTPException
raise HTTPException(
status_code=500,
detail=f"查询人脸记录失败{str(e)}"
detail=f"查询人脸记录失败: {str(e)}"
) from e
finally:
db.close_connection(conn, cursor)
@ -176,14 +176,14 @@ async def get_all_faces(
except MySQLError as e:
raise HTTPException(
status_code=500,
detail=f"查询所有人脸记录失败{str(e)}"
detail=f"查询所有人脸记录失败: {str(e)}"
) from e
finally:
db.close_connection(conn, cursor)
# ------------------------------
# 4. 更新人脸记录(不变用自增ID更新
# 4. 更新人脸记录(不变用自增ID更新
# ------------------------------
@router.put("/{face_id}", response_model=APIResponse, summary="更新人脸记录")
async def update_face(
@ -240,14 +240,14 @@ async def update_face(
conn.rollback()
raise HTTPException(
status_code=500,
detail=f"更新人脸记录失败{str(e)}"
detail=f"更新人脸记录失败: {str(e)}"
) from e
finally:
db.close_connection(conn, cursor)
# ------------------------------
# 5. 删除人脸记录(不变用自增ID删除
# 5. 删除人脸记录(不变用自增ID删除
# ------------------------------
@router.delete("/{face_id}", response_model=APIResponse, summary="删除人脸记录")
async def delete_face(
@ -283,7 +283,7 @@ async def delete_face(
conn.rollback()
raise HTTPException(
status_code=500,
detail=f"删除人脸记录失败{str(e)}"
detail=f"删除人脸记录失败: {str(e)}"
) from e
finally:
db.close_connection(conn, cursor)
@ -291,10 +291,10 @@ async def delete_face(
def get_all_face_name_with_eigenvalue() -> dict:
"""
获取所有人脸的名称及其对应的特征值组成字典返回
获取所有人脸的名称及其对应的特征值组成字典返回
key: 人脸名称name
value: 人脸特征值eigenvalue若名称重复则返回平均特征值
过滤掉name为None的记录避免字典key为None的情况
value: 人脸特征值eigenvalue若名称重复则返回平均特征值
: 过滤掉name为None的记录避免字典key为None的情况
"""
conn = None
cursor = None
@ -303,27 +303,27 @@ def get_all_face_name_with_eigenvalue() -> dict:
conn = db.get_connection()
cursor = conn.cursor(dictionary=True)
# 2. 执行SQL查询只获取name非空的记录减少数据传输
# 2. 执行SQL查询: 只获取name非空的记录减少数据传输
query = "SELECT name, eigenvalue FROM face WHERE name IS NOT NULL"
cursor.execute(query)
faces = cursor.fetchall() # 返回结果列表套字典如 [{"name":"张三","eigenvalue":...}, ...]
faces = cursor.fetchall() # 返回结果: 列表套字典如 [{"name":"张三","eigenvalue":...}, ...]
# 3. 收集同一名称对应的所有特征值(处理名称重复场景)
name_to_eigenvalues = {}
for face in faces:
name = face["name"]
eigenvalue = face["eigenvalue"]
# 若名称已存在追加特征值;否则新建列表存储
# 若名称已存在追加特征值;否则新建列表存储
if name in name_to_eigenvalues:
name_to_eigenvalues[name].append(eigenvalue)
else:
name_to_eigenvalues[name] = [eigenvalue]
# 4. 构建最终字典重复名称取平均唯一名称直接取特征值
# 4. 构建最终字典: 重复名称取平均唯一名称直接取特征值
face_dict = {}
for name, eigenvalues in name_to_eigenvalues.items():
# 处理特征值多个则求平均单个则直接使用
# 处理特征值: 多个则求平均单个则直接使用
if len(eigenvalues) > 1:
# 调用外部方法计算平均特征值需确保binary_face_feature_handler已正确导入
face_dict[name] = get_average_feature(eigenvalues)
@ -334,8 +334,8 @@ def get_all_face_name_with_eigenvalue() -> dict:
return face_dict
except MySQLError as e:
# 捕获数据库异常添加上下文信息后重新抛出(便于定位问题)
raise Exception(f"获取人脸名称与特征值失败{str(e)}") from e
# 捕获数据库异常添加上下文信息后重新抛出(便于定位问题)
raise Exception(f"获取人脸名称与特征值失败: {str(e)}") from e
finally:
# 5. 无论是否异常均释放数据库连接和游标(避免资源泄漏)
# 5. 无论是否异常均释放数据库连接和游标(避免资源泄漏)
db.close_connection(conn, cursor)