refactor: P4a 服务层改造地基(BizError + base_repository + base_service)

- src/core/exceptions.py:BizError/NotFoundError/PermissionDeniedError
- 全局异常处理器接入 BizError → R.failed(含事务回滚语义)
- src/common/base_repository.py:泛型 CRUD 仓储基类
- src/common/base_service.py:服务基类(入参数据/出参数据范式)

【验收】BizError 端到端转换为 R.failed(code=403/ok=false);应用启动

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
DjangoAdmin Dev
2026-08-07 14:29:07 +08:00
co-authored by Claude
parent d33dc1fc34
commit a6e094378c
4 changed files with 154 additions and 0 deletions
+12
View File
@@ -22,6 +22,7 @@ from flask import request
from werkzeug.exceptions import HTTPException
from utils import R
from src.core.exceptions import BizError
logger = logging.getLogger(__name__)
@@ -66,6 +67,17 @@ def register_error_handlers(app):
msg = f"服务器内部错误: {str(e)}" if app.debug else "服务器内部错误"
return R.failed(msg=msg, code=500), 500
@app.errorhandler(BizError)
def handle_biz_error(e):
"""
业务异常处理器
业务代码 raise BizError(...) 时统一转换为 R.failed 响应,
并回滚当前事务(teardown_request 处理)。
"""
logger.info(f"业务异常: {e.msg} (code={e.code})")
return R.failed(msg=e.msg, code=e.code, data=e.data, **e.kwargs)
@app.errorhandler(Exception)
def handle_exception(e):
# HTTPException 子类(如 abort(403))已有专用 handler,不重复处理