125 lines
4.0 KiB
Python
125 lines
4.0 KiB
Python
from flask import Flask, render_template, session, g
|
||
from app.models.user import db, User
|
||
from app.controllers.user import user_bp
|
||
from app.controllers.book import book_bp # 引入图书蓝图
|
||
import os
|
||
|
||
|
||
def create_app():
|
||
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', # 这是你的SMTP授权码,不是邮箱密码
|
||
EMAIL_FROM='3399560459@qq.com',
|
||
EMAIL_FROM_NAME='BOOKSYSTEM_OFFICIAL'
|
||
)
|
||
|
||
# 实例配置,如果存在
|
||
app.config.from_pyfile('config.py', silent=True)
|
||
|
||
# 初始化数据库
|
||
db.init_app(app)
|
||
|
||
# 注册蓝图
|
||
app.register_blueprint(user_bp, url_prefix='/user')
|
||
app.register_blueprint(book_bp, url_prefix='/book') # 注册图书蓝图
|
||
|
||
# 创建数据库表
|
||
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 g.user:
|
||
return render_template('login.html')
|
||
return render_template('index.html', current_user=g.user)
|
||
|
||
# 错误处理
|
||
@app.errorhandler(404)
|
||
def page_not_found(e):
|
||
return render_template('404.html'), 404
|
||
|
||
# 模板过滤器
|
||
@app.template_filter('nl2br')
|
||
def nl2br_filter(s):
|
||
if not s:
|
||
return s
|
||
return s.replace('\n', '<br>')
|
||
|
||
return app
|