fix: 修复课程权限和添加409冲突统一处理
Some checks failed
continuous-integration/drone/push Build is failing

1. 课程权限修复:
   - 创建课程: require_admin -> require_admin_or_manager
   - 更新课程: require_admin -> require_admin_or_manager
   - 现在manager角色也可以创建和编辑课程

2. 全局409冲突处理:
   - 添加IntegrityError异常处理器
   - 自动识别常见冲突类型(用户名/邮箱/手机号/名称/编码)
   - 返回友好的中文错误提示
This commit is contained in:
yuliang_guo
2026-02-02 16:21:02 +08:00
parent 6317eb2479
commit 659f60e765
2 changed files with 44 additions and 4 deletions

View File

@@ -81,11 +81,11 @@ async def get_courses(
async def create_course(
course_in: CourseCreate,
request: Request,
current_user: User = Depends(require_admin),
current_user: User = Depends(require_admin_or_manager),
db: AsyncSession = Depends(get_db),
):
"""
创建课程(需要管理员权限)
创建课程(需要管理员或经理权限)
- **name**: 课程名称
- **description**: 课程描述
@@ -144,11 +144,11 @@ async def get_course(
async def update_course(
course_id: int,
course_in: CourseUpdate,
current_user: User = Depends(require_admin),
current_user: User = Depends(require_admin_or_manager),
db: AsyncSession = Depends(get_db),
):
"""
更新课程(需要管理员权限)
更新课程(需要管理员或经理权限)
- **course_id**: 课程ID
- **course_in**: 更新的课程数据(所有字段都是可选的)

View File

@@ -188,6 +188,46 @@ async def http_exception_handler(request: Request, exc: HTTPException):
)
# 数据库唯一约束冲突处理 (409)
from sqlalchemy.exc import IntegrityError
@app.exception_handler(IntegrityError)
async def integrity_error_handler(request: Request, exc: IntegrityError):
"""处理数据库唯一约束冲突错误"""
error_msg = str(exc.orig) if exc.orig else str(exc)
logger.warning(f"数据库冲突 [{request.method} {request.url.path}]: {error_msg}")
# 解析常见的冲突类型,提供友好的错误信息
friendly_message = "数据冲突,该记录可能已存在"
if "Duplicate entry" in error_msg:
# MySQL 唯一约束冲突
if "username" in error_msg.lower():
friendly_message = "用户名已存在,请使用其他用户名"
elif "email" in error_msg.lower():
friendly_message = "邮箱已被注册,请使用其他邮箱"
elif "phone" in error_msg.lower():
friendly_message = "手机号已被注册,请使用其他手机号"
elif "name" in error_msg.lower():
friendly_message = "名称已存在,请使用其他名称"
elif "code" in error_msg.lower():
friendly_message = "编码已存在,请使用其他编码"
else:
friendly_message = "该记录已存在,不能重复创建"
elif "FOREIGN KEY" in error_msg.upper():
friendly_message = "关联的数据不存在或已被删除"
elif "cannot be null" in error_msg.lower():
friendly_message = "必填字段不能为空"
return JSONResponse(
status_code=409,
content={
"code": 409,
"message": friendly_message,
"detail": error_msg if settings.DEBUG else None,
},
)
# 全局异常处理
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):