import sys from pathlib import Path from flask import Flask, render_template, jsonify, send_file, request from flask_socketio import SocketIO, emit import threading from datetime import datetime sys.path.insert(0, str(Path(__file__).parent)) from orchestrator import Orchestrator from loguru import logger base_dir = Path(__file__).parent template_dir = base_dir / "web" / "templates" app = Flask(__name__, template_folder=str(template_dir)) app.config['SECRET_KEY'] = 'ppt_manager_v2_secret!' socketio = SocketIO(app, cors_allowed_origins="*") @app.route('/') def index(): return render_template('index_v2.html') @app.route('/api/projects') def list_projects(): orch = Orchestrator() plugins = orch.plugin_manager.list_generators() return jsonify({ 'success': True, 'plugins': plugins, 'config': orch.config }) @app.route('/api/files') def list_files(): output_dir = base_dir.parent / "output" files = [] if output_dir.exists(): for f in sorted(output_dir.glob("*.pptx"), reverse=True): files.append({ 'name': f.name, 'size': round(f.stat().st_size / 1024 / 1024, 2), 'modified': datetime.fromtimestamp(f.stat().st_mtime).isoformat() }) return jsonify({'success': True, 'files': files}) @app.route('/download/') def download(filename): f = base_dir.parent / "output" / filename if f.exists(): return send_file(str(f), as_attachment=True) return jsonify(success=False, error="File not found"), 404 @socketio.on('start_generation') def handle_start_generation(data): params = data.get('params', {}) def progress_callback(message): socketio.emit('progress', message, room=request.sid) logger.debug(f"WebSocket进度: {message['percent']}% - {message['message']}") orch = Orchestrator() orch.set_progress_callback(progress_callback) try: socketio.emit('progress', { 'step': 'START', 'message': '开始执行PPT生成管线...', 'percent': 0 }, room=request.sid) output_path = orch.run_full_pipeline(params=params) socketio.emit('complete', { 'success': True, 'output_file': Path(output_path).name, 'download_url': f"/download/{Path(output_path).name}", 'results': {k: v.get('success', False) for k,v in orch.results.get('plugins', {}).items()} }, room=request.sid) except Exception as e: logger.exception("生成过程出错") socketio.emit('complete', { 'success': False, 'error': str(e) }, room=request.sid) def run_server(): print("\n" + "=" * 65) print(" 🚀 PPT智能管理系统 V2.0 - WebSocket实时日志版") print(" 请在浏览器打开: http://localhost:5001") print("=" * 65 + "\n") socketio.run(app, host='0.0.0.0', port=5001, debug=True) if __name__ == '__main__': run_server()