from flask import Flask, render_template, session, g, Markup from flask_login import LoginManager from app.models.user import db, User from app.controllers.user import user_bp from app.controllers.book import book_bp from app.controllers.borrow import borrow_bp from flask_login import LoginManager, current_user import os login_manager = LoginManager() def create_app(config=None): app = Flask(__name__) # 配置应用 app.config.from_mapping( SECRET_KEY=os.environ.get('SECRET_KEY', 'dev_key_replace_in_production'), SQLALCHEMY_DATABASE_URI='mysql+pymysql://book20250428:booksystem@27.124.22.104/book_system', SQLALCHEMY_TRACK_MODIFICATIONS=False, PERMANENT_SESSION_LIFETIME=86400 * 7, # 7天 # 邮件配置 EMAIL_HOST='smtp.qq.com', EMAIL_PORT=587, EMAIL_ENCRYPTION='starttls', EMAIL_USERNAME='3399560459@qq.com', EMAIL_PASSWORD='fzwhyirhbqdzcjgf', EMAIL_FROM='3399560459@qq.com', EMAIL_FROM_NAME='BOOKSYSTEM_OFFICIAL' ) # 实例配置,如果存在 app.config.from_pyfile('config.py', silent=True) # 初始化数据库 db.init_app(app) # 初始化 Flask-Login login_manager.init_app(app) login_manager.login_view = 'user.login' @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) # 注册蓝图 app.register_blueprint(user_bp, url_prefix='/user') app.register_blueprint(book_bp, url_prefix='/book') app.register_blueprint(borrow_bp, url_prefix='/borrow') # 创建数据库表 with app.app_context(): # 先导入基础模型 from app.models.user import User, Role from app.models.book import Book, Category # 创建表 db.create_all() # 再导入依赖模型 - 但不在这里定义关系 from app.models.borrow import BorrowRecord from app.models.inventory import InventoryLog # 移除这些重复的关系定义 # Book.borrow_records = db.relationship('BorrowRecord', backref='book', lazy='dynamic') # Book.inventory_logs = db.relationship('InventoryLog', backref='book', lazy='dynamic') # Category.books = db.relationship('Book', backref='category', lazy='dynamic') # 创建默认角色 from app.models.user import Role if not Role.query.filter_by(id=1).first(): admin_role = Role(id=1, role_name='管理员', description='系统管理员') db.session.add(admin_role) if not Role.query.filter_by(id=2).first(): user_role = Role(id=2, role_name='普通用户', description='普通用户') db.session.add(user_role) # 创建管理员账号 if not User.query.filter_by(username='admin').first(): admin = User( username='admin', password='admin123', email='admin@example.com', role_id=1, nickname='系统管理员' ) db.session.add(admin) # 创建基础分类 from app.models.book import Category if not Category.query.first(): categories = [ Category(name='文学', sort=1), Category(name='计算机', sort=2), Category(name='历史', sort=3), Category(name='科学', sort=4), Category(name='艺术', sort=5), Category(name='经济', sort=6), Category(name='哲学', sort=7), Category(name='教育', sort=8) ] db.session.add_all(categories) db.session.commit() # 其余代码保持不变... @app.before_request def load_logged_in_user(): user_id = session.get('user_id') if user_id is None: g.user = None else: g.user = User.query.get(user_id) @app.route('/') def index(): if not current_user.is_authenticated: return render_template('login.html') return render_template('index.html') # 无需传递current_user,Flask-Login自动提供 @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @app.template_filter('nl2br') def nl2br_filter(s): if s: return Markup(s.replace('\n', '
')) return s return app