from flask import Flask, render_template, jsonify from config import Config from extensions import db, redis_client, migrate from blueprints.auth import auth_bp from blueprints.api import api_bp from blueprints.admin import admin_bp from blueprints.payment import payment_bp import threading import time # 导入模型(必须在 db.create_all() 之前导入) import models def create_app(): app = Flask(__name__) app.config.from_object(Config) # 初始化扩展 db.init_app(app) redis_client.init_app(app) migrate.init_app(app, db) # 注册蓝图 app.register_blueprint(auth_bp) app.register_blueprint(api_bp) app.register_blueprint(admin_bp) app.register_blueprint(payment_bp) from flask import g, session from models import User, SystemLog @app.before_request def load_user(): """在每个请求前加载用户信息到 g,供日志系统使用""" user_id = session.get('user_id') if user_id: g.user_id = user_id g.user = db.session.get(User, user_id) else: g.user_id = None g.user = None @app.context_processor def inject_menu(): """将导航菜单注入所有模板,实现服务端渲染,解决闪烁问题""" from blueprints.auth import get_user_menu menu = get_user_menu(g.user) if hasattr(g, 'user') else [] return dict(nav_menu=menu) @app.route('/api/system_logs') def get_system_logs(): """获取系统日志数据 (供后台管理界面使用)""" # 这里可以加入权限检查 logs = SystemLog.query.order_by(SystemLog.created_at.desc()).limit(100).all() return jsonify([{ 'id': log.id, 'user_id': log.user_id, 'level': log.level, 'module': log.module, 'message': log.message, 'extra': log.extra, 'ip': log.ip, 'path': log.path, 'method': log.method, 'user_agent': log.user_agent, 'created_at': log.created_at_bj.strftime('%Y-%m-%d %H:%M:%S') } for log in logs]) @app.route('/') def index(): return render_template('index.html') @app.route('/ocr') def ocr(): return render_template('ocr.html') @app.route('/visualizer') def visualizer(): return render_template('kongzhiqi.html') @app.route('/video') def video_page(): return render_template('video.html') # 自动创建数据库表 with app.app_context(): print("🔧 正在检查并创建数据库表...") db.create_all() print("✅ 数据库表已就绪") return app app = create_app() if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)