From 2453bb05eae35ecbab8dc45daf9d4c4d0cf6f63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E5=8F=B8git?= <240241002@qq.com> Date: Tue, 20 Jan 2026 16:01:58 +0800 Subject: [PATCH] feat: Implement core API endpoints for AI content generation, user management, and Alipay payment processing. --- blueprints/api.py | 2 +- blueprints/payment.py | 5 ++--- services/generation_service.py | 6 +++--- services/task_service.py | 31 ++++++++++++++----------------- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/blueprints/api.py b/blueprints/api.py index 1ea786e..cf72d0a 100644 --- a/blueprints/api.py +++ b/blueprints/api.py @@ -95,7 +95,7 @@ def generate(): # 5. 启动异步生图任务 app = current_app._get_current_object() - task_id = start_async_image_task(app, user_id, payload, api_key, target_api, cost, data.get('mode'), model_value) + task_id = start_async_image_task(app, user_id, payload, api_key, target_api, cost, data.get('mode'), model_value, use_trial) return jsonify({ "task_id": task_id, diff --git a/blueprints/payment.py b/blueprints/payment.py index ae426a2..2bc2910 100644 --- a/blueprints/payment.py +++ b/blueprints/payment.py @@ -4,7 +4,7 @@ from models import Order, User, to_bj_time, get_bj_now from services.alipay_service import AlipayService from services.logger import system_logger import uuid -from datetime import timedelta +from datetime import datetime, timedelta payment_bp = Blueprint('payment', __name__, url_prefix='/payment') @@ -102,8 +102,7 @@ def payment_history(): ) ).order_by(Order.created_at.desc()).all() - import datetime as dt_module - return render_template('recharge_history.html', orders=orders, modules={'datetime': dt_module}) + return render_template('recharge_history.html', orders=orders, modules={'datetime': datetime}) @payment_bp.route('/api/history', methods=['GET']) def api_payment_history(): diff --git a/services/generation_service.py b/services/generation_service.py index 821a9c9..9a5380f 100644 --- a/services/generation_service.py +++ b/services/generation_service.py @@ -117,7 +117,7 @@ def handle_chat_generation_sync(user_id, api_key, model_value, prompt, use_trial refund_points(user_id, cost) return {"error": str(e)}, 500 -def start_async_image_task(app, user_id, payload, api_key, target_api, cost, mode, model_value): +def start_async_image_task(app, user_id, payload, api_key, target_api, cost, mode, model_value, use_trial=False): """启动异步生图任务""" task_id = str(uuid.uuid4()) @@ -126,7 +126,7 @@ def start_async_image_task(app, user_id, payload, api_key, target_api, cost, mod threading.Thread( target=process_image_generation, - args=(app, user_id, task_id, payload, api_key, target_api, cost) + args=(app, user_id, task_id, payload, api_key, target_api, cost, use_trial) ).start() return task_id @@ -153,7 +153,7 @@ def start_async_video_task(app, user_id, payload, cost, model_value): threading.Thread( target=process_video_generation, - args=(app, user_id, task_id, payload, api_key, cost) + args=(app, user_id, task_id, payload, api_key, cost, True) # 视频目前默认为积分模式 ).start() return task_id diff --git a/services/task_service.py b/services/task_service.py index e873356..a216a66 100644 --- a/services/task_service.py +++ b/services/task_service.py @@ -90,7 +90,7 @@ def sync_images_background(app, record_id, raw_urls): except Exception as e: print(f"❌ 更新记录失败: {e}") -def process_image_generation(app, user_id, task_id, payload, api_key, target_api, cost): +def process_image_generation(app, user_id, task_id, payload, api_key, target_api, cost, use_trial=False): """异步执行图片生成并存入 Redis""" with app.app_context(): try: @@ -99,10 +99,9 @@ def process_image_generation(app, user_id, task_id, payload, api_key, target_api resp = requests.post(target_api, json=payload, headers=headers, timeout=1000) if resp.status_code != 200: - user = db.session.get(User, user_id) - if user and "sk-" in api_key: - user.points += cost - db.session.commit() + if use_trial: + from services.generation_service import refund_points + refund_points(user_id, cost) # 记录详细的失败上下文 system_logger.error(f"生图任务失败: {resp.text}", user_id=user_id, task_id=task_id, prompt=payload.get('prompt'), model=payload.get('model')) @@ -135,10 +134,9 @@ def process_image_generation(app, user_id, task_id, payload, api_key, target_api except Exception as e: # 异常处理:退还积分 - user = db.session.get(User, user_id) - if user and "sk-" in api_key: - user.points += cost - db.session.commit() + if use_trial: + from services.generation_service import refund_points + refund_points(user_id, cost) system_logger.error(f"生图任务异常: {str(e)}", user_id=user_id, task_id=task_id, prompt=payload.get('prompt'), model=payload.get('model')) redis_client.setex(f"task:{task_id}", 3600, json.dumps({"status": "error", "message": str(e)})) @@ -203,7 +201,7 @@ def sync_video_background(app, record_id, raw_url, internal_task_id=None): except Exception as dbe: system_logger.error(f"更新视频记录失败: {str(dbe)}") -def process_video_generation(app, user_id, internal_task_id, payload, api_key, cost): +def process_video_generation(app, user_id, internal_task_id, payload, api_key, cost, use_trial=True): """异步提交并查询视频任务状态""" with app.app_context(): try: @@ -273,13 +271,12 @@ def process_video_generation(app, user_id, internal_task_id, payload, api_key, c except Exception as e: system_logger.error(f"视频生成执行异常: {str(e)}", user_id=user_id, task_id=internal_task_id, prompt=payload.get('prompt')) # 尝试退费 - try: - user = db.session.get(User, user_id) - if user: - user.points += cost - db.session.commit() - except Exception as re: - system_logger.error(f"退费失败: {str(re)}") + if use_trial: + try: + from services.generation_service import refund_points + refund_points(user_id, cost) + except Exception as re: + system_logger.error(f"退费失败: {str(re)}") # 确保 Redis 状态一定被更新,防止前端死循环 redis_client.setex(f"task:{internal_task_id}", 3600, json.dumps({"status": "error", "message": str(e)}))