优化代码风格
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
from fastapi import APIRouter, Query
|
||||
from fastapi import APIRouter, Query, Path
|
||||
from mysql.connector import Error as MySQLError
|
||||
|
||||
from ds.db import db
|
||||
@ -9,7 +9,6 @@ from schema.device_action_schema import (
|
||||
)
|
||||
from schema.response_schema import APIResponse
|
||||
|
||||
|
||||
# 路由配置
|
||||
router = APIRouter(
|
||||
prefix="/device/actions",
|
||||
@ -18,11 +17,11 @@ router = APIRouter(
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# 内部方法:新增设备操作记录(适配id自增)
|
||||
# 内部方法: 新增设备操作记录(适配id自增)
|
||||
# ------------------------------
|
||||
def add_device_action(action_data: DeviceActionCreate) -> DeviceActionResponse:
|
||||
"""
|
||||
新增设备操作记录(内部方法,非接口)
|
||||
新增设备操作记录(内部方法、非接口)
|
||||
:param action_data: 含client_ip和action(0/1)
|
||||
:return: 新增的完整记录
|
||||
"""
|
||||
@ -32,7 +31,7 @@ def add_device_action(action_data: DeviceActionCreate) -> DeviceActionResponse:
|
||||
conn = db.get_connection()
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
# 插入SQL(id自增,依赖数据库自动生成)
|
||||
# 插入SQL(id自增、依赖数据库自动生成)
|
||||
insert_query = """
|
||||
INSERT INTO device_action
|
||||
(client_ip, action, created_at, updated_at)
|
||||
@ -54,20 +53,20 @@ def add_device_action(action_data: DeviceActionCreate) -> DeviceActionResponse:
|
||||
except MySQLError as e:
|
||||
if conn:
|
||||
conn.rollback()
|
||||
raise Exception(f"新增记录失败:{str(e)}") from e
|
||||
raise Exception(f"新增记录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# 接口:分页查询操作记录列表(仅返回 total + device_actions)
|
||||
# 接口: 分页查询操作记录列表(仅返回 total + device_actions)
|
||||
# ------------------------------
|
||||
@router.get("/list", response_model=APIResponse, summary="分页查询设备操作记录")
|
||||
async def get_device_action_list(
|
||||
page: int = Query(1, ge=1, description="页码,默认1"),
|
||||
page_size: int = Query(10, ge=1, le=100, description="每页条数,1-100"),
|
||||
page: int = Query(1, ge=1, description="页码、默认1"),
|
||||
page_size: int = Query(10, ge=1, le=100, description="每页条数、1-100"),
|
||||
client_ip: str = Query(None, description="按客户端IP筛选"),
|
||||
action: int = Query(None, ge=0, le=1, description="按状态筛选(0=离线,1=上线)")
|
||||
action: int = Query(None, ge=0, le=1, description="按状态筛选(0=离线、1=上线)")
|
||||
):
|
||||
conn = None
|
||||
cursor = None
|
||||
@ -75,7 +74,7 @@ async def get_device_action_list(
|
||||
conn = db.get_connection()
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
# 1. 构建筛选条件(参数化查询,避免注入)
|
||||
# 1. 构建筛选条件(参数化查询、避免注入)
|
||||
where_clause = []
|
||||
params = []
|
||||
if client_ip:
|
||||
@ -92,13 +91,13 @@ async def get_device_action_list(
|
||||
cursor.execute(count_sql, params)
|
||||
total = cursor.fetchone()["total"]
|
||||
|
||||
# 3. 分页查询记录(按创建时间倒序,确保最新记录在前)
|
||||
# 3. 分页查询记录(按创建时间倒序、确保最新记录在前)
|
||||
offset = (page - 1) * page_size
|
||||
list_sql = "SELECT * FROM device_action"
|
||||
if where_clause:
|
||||
list_sql += " WHERE " + " AND ".join(where_clause)
|
||||
list_sql += " ORDER BY created_at DESC LIMIT %s OFFSET %s"
|
||||
params.extend([page_size, offset]) # 追加分页参数(page/page_size仅用于查询,不返回)
|
||||
params.extend([page_size, offset]) # 追加分页参数(page/page_size仅用于查询、不返回)
|
||||
|
||||
cursor.execute(list_sql, params)
|
||||
action_list = cursor.fetchall()
|
||||
@ -114,6 +113,46 @@ async def get_device_action_list(
|
||||
)
|
||||
|
||||
except MySQLError as e:
|
||||
raise Exception(f"查询记录失败:{str(e)}") from e
|
||||
raise Exception(f"查询记录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
|
||||
@router.get("/{client_ip}", response_model=APIResponse, summary="根据IP查询设备操作记录")
|
||||
async def get_device_actions_by_ip(
|
||||
client_ip: str = Path(..., description="客户端IP地址")
|
||||
):
|
||||
conn = None
|
||||
cursor = None
|
||||
try:
|
||||
conn = db.get_connection()
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
# 1. 查询总记录数
|
||||
count_sql = "SELECT COUNT(*) AS total FROM device_action WHERE client_ip = %s"
|
||||
cursor.execute(count_sql, (client_ip,))
|
||||
total = cursor.fetchone()["total"]
|
||||
|
||||
# 2. 查询该IP的所有记录(按创建时间倒序)
|
||||
list_sql = """
|
||||
SELECT * FROM device_action
|
||||
WHERE client_ip = %s
|
||||
ORDER BY created_at DESC
|
||||
"""
|
||||
cursor.execute(list_sql, (client_ip,))
|
||||
action_list = cursor.fetchall()
|
||||
|
||||
# 3. 返回结果
|
||||
return APIResponse(
|
||||
code=200,
|
||||
message="查询成功",
|
||||
data=DeviceActionListResponse(
|
||||
total=total,
|
||||
device_actions=[DeviceActionResponse(**item) for item in action_list]
|
||||
)
|
||||
)
|
||||
|
||||
except MySQLError as e:
|
||||
raise Exception(f"查询记录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
@ -37,7 +37,7 @@ def increment_alarm_count_by_ip(client_ip: str) -> bool:
|
||||
if not cursor.fetchone():
|
||||
raise ValueError(f"客户端IP为 {client_ip} 的设备不存在")
|
||||
|
||||
# 报警次数加1,并更新时间戳
|
||||
# 报警次数加1、并更新时间戳
|
||||
update_query = """
|
||||
UPDATE devices
|
||||
SET alarm_count = alarm_count + 1,
|
||||
@ -51,7 +51,7 @@ def increment_alarm_count_by_ip(client_ip: str) -> bool:
|
||||
except MySQLError as e:
|
||||
if conn:
|
||||
conn.rollback()
|
||||
raise Exception(f"更新报警次数失败:{str(e)}") from e
|
||||
raise Exception(f"更新报警次数失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
@ -99,7 +99,7 @@ def update_online_status_by_ip(client_ip: str, online_status: int) -> bool:
|
||||
except MySQLError as e:
|
||||
if conn:
|
||||
conn.rollback()
|
||||
raise Exception(f"更新设备在线状态失败:{str(e)}") from e
|
||||
raise Exception(f"更新设备在线状态失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
@ -124,7 +124,7 @@ async def create_device(device_data: DeviceCreateRequest, request: Request): #
|
||||
# 返回信息
|
||||
return APIResponse(
|
||||
code=200,
|
||||
message=f"设备IP {device_data.ip} 已存在,返回已有设备信息",
|
||||
message=f"设备IP {device_data.ip} 已存在、返回已有设备信息",
|
||||
data=DeviceResponse(** existing_device)
|
||||
)
|
||||
|
||||
@ -173,9 +173,9 @@ async def create_device(device_data: DeviceCreateRequest, request: Request): #
|
||||
except MySQLError as e:
|
||||
if conn:
|
||||
conn.rollback()
|
||||
raise Exception(f"创建设备失败:{str(e)}") from e
|
||||
raise Exception(f"创建设备失败: {str(e)}") from e
|
||||
except json.JSONDecodeError as e:
|
||||
raise Exception(f"设备详细信息JSON序列化失败:{str(e)}") from e
|
||||
raise Exception(f"设备详细信息JSON序列化失败: {str(e)}") from e
|
||||
except Exception as e:
|
||||
if conn:
|
||||
conn.rollback()
|
||||
@ -185,8 +185,8 @@ async def create_device(device_data: DeviceCreateRequest, request: Request): #
|
||||
|
||||
@router.get("/", response_model=APIResponse, summary="获取设备列表(支持筛选分页)")
|
||||
async def get_device_list(
|
||||
page: int = Query(1, ge=1, description="页码,默认第1页"),
|
||||
page_size: int = Query(10, ge=1, le=100, description="每页条数,1-100之间"),
|
||||
page: int = Query(1, ge=1, description="页码、默认第1页"),
|
||||
page_size: int = Query(10, ge=1, le=100, description="每页条数、1-100之间"),
|
||||
device_type: str = Query(None, description="按设备类型筛选"),
|
||||
online_status: int = Query(None, ge=0, le=1, description="按在线状态筛选")
|
||||
):
|
||||
@ -233,6 +233,6 @@ async def get_device_list(
|
||||
)
|
||||
|
||||
except MySQLError as e:
|
||||
raise Exception(f"获取设备列表失败:{str(e)}") from e
|
||||
raise Exception(f"获取设备列表失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
@ -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 和 eigenvalue(None)
|
||||
# 2. 插入数据库: 无需传 ID(自增)、只传 name 和 eigenvalue(None)
|
||||
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)
|
@ -21,7 +21,7 @@ router = APIRouter(
|
||||
async def create_sensitive(
|
||||
sensitive: SensitiveCreateRequest): # 添加了登录认证依赖
|
||||
"""
|
||||
创建敏感信息记录:
|
||||
创建敏感信息记录:
|
||||
- 需登录认证
|
||||
- 插入新的敏感信息记录到数据库(ID由数据库自动生成)
|
||||
- 返回创建成功信息
|
||||
@ -32,7 +32,7 @@ async def create_sensitive(
|
||||
conn = db.get_connection()
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
# 插入新敏感信息记录到数据库(不包含ID,由数据库自动生成)
|
||||
# 插入新敏感信息记录到数据库(不包含ID、由数据库自动生成)
|
||||
insert_query = """
|
||||
INSERT INTO sensitives (name)
|
||||
VALUES (%s)
|
||||
@ -56,7 +56,7 @@ async def create_sensitive(
|
||||
except MySQLError as e:
|
||||
if conn:
|
||||
conn.rollback()
|
||||
raise Exception(f"创建敏感信息记录失败:{str(e)}") from e
|
||||
raise Exception(f"创建敏感信息记录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
@ -71,7 +71,7 @@ async def get_sensitive(
|
||||
current_user: UserResponse = Depends(get_current_user) # 需登录认证
|
||||
):
|
||||
"""
|
||||
获取单个敏感信息记录:
|
||||
获取单个敏感信息记录:
|
||||
- 需登录认证
|
||||
- 根据ID查询敏感信息记录
|
||||
- 返回查询到的敏感信息
|
||||
@ -98,7 +98,7 @@ async def get_sensitive(
|
||||
data=SensitiveResponse(**sensitive)
|
||||
)
|
||||
except MySQLError as e:
|
||||
raise Exception(f"查询敏感信息记录失败:{str(e)}") from e
|
||||
raise Exception(f"查询敏感信息记录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
@ -109,7 +109,7 @@ async def get_sensitive(
|
||||
@router.get("", response_model=APIResponse, summary="获取所有敏感信息记录")
|
||||
async def get_all_sensitives():
|
||||
"""
|
||||
获取所有敏感信息记录:
|
||||
获取所有敏感信息记录:
|
||||
- 需登录认证
|
||||
- 查询所有敏感信息记录(不需要分页)
|
||||
- 返回所有敏感信息列表
|
||||
@ -130,7 +130,7 @@ async def get_all_sensitives():
|
||||
data=[SensitiveResponse(**sensitive) for sensitive in sensitives]
|
||||
)
|
||||
except MySQLError as e:
|
||||
raise Exception(f"查询所有敏感信息记录失败:{str(e)}") from e
|
||||
raise Exception(f"查询所有敏感信息记录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
@ -145,7 +145,7 @@ async def update_sensitive(
|
||||
current_user: UserResponse = Depends(get_current_user) # 需登录认证
|
||||
):
|
||||
"""
|
||||
更新敏感信息记录:
|
||||
更新敏感信息记录:
|
||||
- 需登录认证
|
||||
- 根据ID更新敏感信息记录
|
||||
- 返回更新后的敏感信息
|
||||
@ -203,7 +203,7 @@ async def update_sensitive(
|
||||
except MySQLError as e:
|
||||
if conn:
|
||||
conn.rollback()
|
||||
raise Exception(f"更新敏感信息记录失败:{str(e)}") from e
|
||||
raise Exception(f"更新敏感信息记录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
@ -217,7 +217,7 @@ async def delete_sensitive(
|
||||
current_user: UserResponse = Depends(get_current_user) # 需登录认证
|
||||
):
|
||||
"""
|
||||
删除敏感信息记录:
|
||||
删除敏感信息记录:
|
||||
- 需登录认证
|
||||
- 根据ID删除敏感信息记录
|
||||
- 返回删除成功信息
|
||||
@ -251,14 +251,14 @@ async def delete_sensitive(
|
||||
except MySQLError as e:
|
||||
if conn:
|
||||
conn.rollback()
|
||||
raise Exception(f"删除敏感信息记录失败:{str(e)}") from e
|
||||
raise Exception(f"删除敏感信息记录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
|
||||
def get_all_sensitive_words() -> list[str]:
|
||||
"""
|
||||
获取所有敏感词,返回字符串数组
|
||||
获取所有敏感词、返回字符串数组
|
||||
|
||||
返回:
|
||||
list[str]: 包含所有敏感词的数组
|
||||
@ -273,7 +273,7 @@ def get_all_sensitive_words() -> list[str]:
|
||||
conn = db.get_connection()
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
# 执行查询,只获取敏感词字段
|
||||
# 执行查询、只获取敏感词字段
|
||||
query = "SELECT name FROM sensitives ORDER BY id"
|
||||
cursor.execute(query)
|
||||
sensitive_records = cursor.fetchall()
|
||||
@ -283,7 +283,7 @@ def get_all_sensitive_words() -> list[str]:
|
||||
|
||||
except MySQLError as e:
|
||||
# 数据库错误处理
|
||||
raise MySQLError(f"查询敏感词失败:{str(e)}") from e
|
||||
raise MySQLError(f"查询敏感词失败: {str(e)}") from e
|
||||
finally:
|
||||
# 确保资源正确释放
|
||||
db.close_connection(conn, cursor)
|
@ -27,7 +27,7 @@ router = APIRouter(
|
||||
@router.post("/register", response_model=APIResponse, summary="用户注册")
|
||||
async def user_register(request: UserRegisterRequest):
|
||||
"""
|
||||
用户注册:
|
||||
用户注册:
|
||||
- 校验用户名是否已存在
|
||||
- 加密密码后插入数据库
|
||||
- 返回注册成功信息
|
||||
@ -67,7 +67,7 @@ async def user_register(request: UserRegisterRequest):
|
||||
)
|
||||
except MySQLError as e:
|
||||
conn.rollback() # 数据库错误时回滚事务
|
||||
raise Exception(f"注册失败:{str(e)}") from e
|
||||
raise Exception(f"注册失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
@ -78,7 +78,7 @@ async def user_register(request: UserRegisterRequest):
|
||||
@router.post("/login", response_model=APIResponse, summary="用户登录(获取 Token)")
|
||||
async def user_login(request: UserLoginRequest):
|
||||
"""
|
||||
用户登录:
|
||||
用户登录:
|
||||
- 校验用户名是否存在
|
||||
- 校验密码是否正确
|
||||
- 生成 JWT Token 并返回
|
||||
@ -89,7 +89,7 @@ async def user_login(request: UserLoginRequest):
|
||||
conn = db.get_connection()
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
# 修复:SQL查询添加 created_at 和 updated_at 字段
|
||||
# 修复: SQL查询添加 created_at 和 updated_at 字段
|
||||
query = """
|
||||
SELECT id, username, password, created_at, updated_at
|
||||
FROM users
|
||||
@ -129,7 +129,7 @@ async def user_login(request: UserLoginRequest):
|
||||
}
|
||||
)
|
||||
except MySQLError as e:
|
||||
raise Exception(f"登录失败:{str(e)}") from e
|
||||
raise Exception(f"登录失败: {str(e)}") from e
|
||||
finally:
|
||||
db.close_connection(conn, cursor)
|
||||
|
||||
@ -142,8 +142,8 @@ async def get_current_user_info(
|
||||
current_user: UserResponse = Depends(get_current_user) # 依赖认证中间件
|
||||
):
|
||||
"""
|
||||
获取当前登录用户信息:
|
||||
- 需在请求头携带 Token(格式:Bearer <token>)
|
||||
获取当前登录用户信息:
|
||||
- 需在请求头携带 Token(格式: Bearer <token>)
|
||||
- 认证通过后返回用户信息
|
||||
"""
|
||||
return APIResponse(
|
||||
|
Reference in New Issue
Block a user