141 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from flask import Flask, render_template, session, g, Markup, redirect, url_for
 | 
						||
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 app.controllers.inventory import inventory_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')
 | 
						||
    app.register_blueprint(inventory_bp)
 | 
						||
 | 
						||
    # 创建数据库表
 | 
						||
    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 redirect(url_for('user.login'))
 | 
						||
        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', '<br>'))
 | 
						||
        return s
 | 
						||
 | 
						||
    return app
 | 
						||
 | 
						||
    @app.context_processor
 | 
						||
    def inject_now():
 | 
						||
        return {'now': datetime.datetime.now()}
 |