refactor(api): 统一响应格式迁移 + 异步任务系统 + 状态码体系完善

- 将全部路由文件(12个)的 jsonify 响应迁移至 success_response/error_response 统一格式
- 修复 sync_routes.py error_response 参数错误(P0)
- 新增异步任务系统:task_registry + task_routes
- 新增状态码:TASK_NOT_FOUND(4014)、TASK_CONFLICT(4015)、REINDEX_ERROR(5040)
- 修正 task_routes/exam_pkg 中语义不匹配的状态码
- 更新 curl 测试手册、后端对接规范文档
- 添加缓存性能报告和 Redis 迁移计划
This commit is contained in:
lacerate551
2026-06-05 22:56:00 +08:00
parent 54a6815ad4
commit 183a57e7f1
19 changed files with 2659 additions and 548 deletions

View File

@@ -10,6 +10,8 @@
from flask import Blueprint, request, jsonify
from auth.gateway import require_gateway_auth, require_role, get_user_permissions, MOCK_USERS
from core.status_codes import SUCCESS, BAD_REQUEST, UNAUTHORIZED, FORBIDDEN, PERMISSION_DENIED, INTERNAL_ERROR
from api.response_utils import success_response, error_response
import os
from pathlib import Path
from dotenv import load_dotenv
@@ -52,7 +54,7 @@ def mock_login():
"""
# 默认开启开发模式(生产环境需设置 DEV_MODE=false
if os.environ.get('DEV_MODE', 'true').lower() == 'false':
return jsonify({"error": "仅开发环境可用,请设置 DEV_MODE=true"}), 403
return error_response("FORBIDDEN", FORBIDDEN, "仅开发环境可用,请设置 DEV_MODE=true", http_status=403)
data = request.json or {}
username = data.get('username')
@@ -60,9 +62,9 @@ def mock_login():
user = MOCK_USERS.get(username)
if not user or user['password'] != password:
return jsonify({"error": "用户名或密码错误"}), 401
return error_response("UNAUTHORIZED", UNAUTHORIZED, "用户名或密码错误", http_status=401)
return jsonify({
return success_response(data={
"token": f"mock-token-{username}",
"user": {
"user_id": user['user_id'],
@@ -80,7 +82,7 @@ def get_stats():
"""获取系统统计信息(仅管理员)"""
from flask import current_app
session_manager = current_app.config['SESSION_MANAGER']
return jsonify(session_manager.get_stats())
return success_response(data=session_manager.get_stats())
@auth_bp.route('/health', methods=['GET'])
@@ -103,7 +105,7 @@ def get_current_user():
开发模式下支持模拟用户,生产模式下用户信息由后端控制。
"""
user = request.current_user
return jsonify({
return success_response(data={
"user_id": user["user_id"],
"username": user["username"],
"role": user["role"],
@@ -133,7 +135,7 @@ def get_users():
"""
dev_mode = os.environ.get('DEV_MODE', 'true').lower() != 'false'
if not dev_mode:
return jsonify({"error": "仅开发环境可用"}), 403
return error_response("FORBIDDEN", FORBIDDEN, "仅开发环境可用", http_status=403)
users = []
for username, info in MOCK_USERS.items():
@@ -145,7 +147,7 @@ def get_users():
"is_active": True # 模拟用户默认都是活跃状态
})
return jsonify({"users": users})
return success_response(data={"users": users})
@auth_bp.route('/auth/users/<user_id>', methods=['PUT'])
@@ -161,10 +163,10 @@ def update_user(user_id):
"""
dev_mode = os.environ.get('DEV_MODE', 'true').lower() != 'false'
if not dev_mode:
return jsonify({"error": "仅开发环境可用"}), 403
return error_response("FORBIDDEN", FORBIDDEN, "仅开发环境可用", http_status=403)
# 模拟用户不支持真正的状态切换,直接返回成功
return jsonify({"message": "操作成功(模拟)", "user_id": user_id})
return success_response(data={"message": "操作成功(模拟)", "user_id": user_id})
@auth_bp.route('/auth/change-password', methods=['POST'])
@@ -181,17 +183,17 @@ def change_password():
"""
dev_mode = os.environ.get('DEV_MODE', 'true').lower() != 'false'
if not dev_mode:
return jsonify({"error": "仅开发环境可用"}), 403
return error_response("FORBIDDEN", FORBIDDEN, "仅开发环境可用", http_status=403)
data = request.json or {}
old_password = data.get('old_password')
new_password = data.get('new_password')
if not old_password or not new_password:
return jsonify({"error": "请提供旧密码和新密码"}), 400
return error_response("MISSING_PARAMS", BAD_REQUEST, "请提供旧密码和新密码", http_status=400)
if len(new_password) < 6:
return jsonify({"error": "新密码至少6位"}), 400
return error_response("INVALID_PARAMS", BAD_REQUEST, "新密码至少6位", http_status=400)
# 模拟环境直接返回成功
return jsonify({"message": "密码修改成功(模拟)"})
return success_response(message="密码修改成功(模拟)")