2026-01-16 22:24:14 +08:00
|
|
|
|
from flask import Flask, render_template, jsonify
|
2026-01-12 00:53:31 +08:00
|
|
|
|
from config import Config
|
2026-01-16 22:24:14 +08:00
|
|
|
|
from extensions import db, redis_client, migrate
|
2026-01-12 00:53:31 +08:00
|
|
|
|
from blueprints.auth import auth_bp
|
|
|
|
|
|
from blueprints.api import api_bp
|
|
|
|
|
|
from blueprints.admin import admin_bp
|
2026-01-14 17:00:43 +08:00
|
|
|
|
from blueprints.payment import payment_bp
|
2026-01-12 00:53:31 +08:00
|
|
|
|
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)
|
2026-01-16 22:24:14 +08:00
|
|
|
|
migrate.init_app(app, db)
|
2026-01-12 00:53:31 +08:00
|
|
|
|
|
|
|
|
|
|
# 注册蓝图
|
|
|
|
|
|
app.register_blueprint(auth_bp)
|
|
|
|
|
|
app.register_blueprint(api_bp)
|
|
|
|
|
|
app.register_blueprint(admin_bp)
|
2026-01-14 17:00:43 +08:00
|
|
|
|
app.register_blueprint(payment_bp)
|
2026-01-12 00:53:31 +08:00
|
|
|
|
|
2026-01-16 22:24:14 +08:00
|
|
|
|
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,
|
2026-01-17 23:15:58 +08:00
|
|
|
|
'created_at': log.created_at_bj.strftime('%Y-%m-%d %H:%M:%S')
|
2026-01-16 22:24:14 +08:00
|
|
|
|
} for log in logs])
|
|
|
|
|
|
|
2026-01-12 00:53:31 +08:00
|
|
|
|
@app.route('/')
|
|
|
|
|
|
def index():
|
|
|
|
|
|
return render_template('index.html')
|
|
|
|
|
|
|
2026-01-14 00:00:23 +08:00
|
|
|
|
@app.route('/ocr')
|
|
|
|
|
|
def ocr():
|
|
|
|
|
|
return render_template('ocr.html')
|
|
|
|
|
|
|
2026-01-15 21:42:03 +08:00
|
|
|
|
@app.route('/visualizer')
|
|
|
|
|
|
def visualizer():
|
|
|
|
|
|
return render_template('kongzhiqi.html')
|
|
|
|
|
|
|
2026-01-16 22:24:14 +08:00
|
|
|
|
@app.route('/video')
|
|
|
|
|
|
def video_page():
|
|
|
|
|
|
return render_template('video.html')
|
|
|
|
|
|
|
2026-01-12 00:53:31 +08:00
|
|
|
|
# 自动创建数据库表
|
|
|
|
|
|
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)
|