图书管理系统

from flask import Flask, request, render_template,flash
from flask import redirect
from flask import url_for
from flask_wtf import FlaskForm
from wtforms import SubmitField, StringField
# 验证表单的函数
from wtforms.validators import DataRequired
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import  Migrate,MigrateCommand
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)


# 配置
app.secret_key = 'sdfghjk'
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:mysql@127.0.0.1/books'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
app.debug = True


db = SQLAlchemy(app)

# 增加db 命令到命令行
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)

# 创建表模型

class Author(db.Model):
    __tablename = 'authors'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)
    bok = db.relationship('Book',backref='books')

class Book(db.Model):
    __tablename__='books'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)
    author_id = db.Column(db.Integer,db.ForeignKey(Author.id))

# 自定义表单类
class Book_Form(FlaskForm):
    book_name = StringField("书名:", validators=[DataRequired()])
    author_name = StringField("作者名:", validators=[DataRequired()])
    submit = SubmitField("提交")

"""
处理逻辑:前提:书籍不能同名
1.查询书名否存在,
1.1存在,返回
1.2不存在,查询作者是否存在:1存在,添加,2不存在,先添加作者,再添加书籍



"""
# 删除书籍
@app.route('/delete_book<bok_id>')
def delete_book(bok_id):
    print(bok_id)

    delete_book = Book.query.filter_by(id=bok_id).first()
    try:
        db.session.delete(delete_book)
        db.session.commit()
    except Exception as e:
        print(e)
        flash('删除失败')
        db.session.rollback()
    return redirect(url_for('index'))

# 删除作者
@app.route('/del_author<au_id>')
def del_author(au_id):
    print(au_id)
    # 先删除作者对应的所有书籍,再删作者
    del_author = Author.query.filter_by(id=au_id).first()

    # 删除书
    try:
        #  关键代码
        Book.query.filter_by(author_id=au_id).delete()
        db.session.commit()
    except Exception as e:
        print(e)
        db.session.rollback()
        return redirect(url_for('index'))

    # 删除作者
    try:
        db.session.delete(del_author)
        db.session.commit()
    except Exception as e:
        print(e)
        db.session.rollback()
    return redirect(url_for('index'))


@app.route('/', methods=['POST', 'GET'])
def index():
    # 查询所有的作者
    authors = Author.query.all()
    # 查询每个作者的书名
    # 直接再模板中利用一对多模型特点查询
    # 创建一个表单实例
    book_form = Book_Form()
    # 验证表单
    if request.method == 'POST':
    #     # 获取请求参数`
    #     print(book_form.validate_on_submit())
        if book_form.validate_on_submit():
            book_name = request.form.get('book_name')
            author_name = request.form.get('author_name')
            # flash('提交成功')
            '''逻辑处理'''
            if Book.query.filter_by(name=book_name).first():
                flash('同名书籍已存在')
                return redirect(url_for('index'))

            old_author = Author.query.filter_by(name=author_name).first()
            if old_author:
                # 若存在,则添加书籍
                new_book = Book(name=book_name, author_id=old_author.id)
                try:
                    db.session.add(new_book)
                    db.session.commit()
                    return redirect(url_for('index'))
                except Exception as e:
                    print(e)
                    flash('添加书籍失败')
                    db.session.rollback()
                    return redirect(url_for('index'))

            # 若作者不存在,则先添加作者,再添加书籍
            # 添加作者
            new_author = Author(name=author_name)
            try:
                db.session.add(new_author)
                db.session.commit()
            except Exception as e:
                print(e)
                flash('添加作者失败')
                db.session.rollback()
                return redirect(url_for('index'))

            # 添加书籍
            new_book1 = Book(name=book_name, author_id=new_author.id)
            try:
                db.session.add(new_book1)
                db.session.commit()
                return redirect(url_for('index'))
            except Exception as e:
                print(e)
                flash('添加书籍失败')
                db.session.rollback()
                return redirect(url_for('index'))
        else:
            flash('不能为空')
            return redirect(url_for('index'))

    return render_template('book.html',form=book_form,authors = authors)


if __name__ == '__main__':
    # db.drop_all()
    # db.create_all()
    # # 添加数据
    # au1 = Author(name='老王')
    # au2 = Author(name='老尹')
    # au3 = Author(name='老刘')
    # # 把数据提交给用户会话
    # db.session.add_all([au1, au2, au3])
    # # 提交会话
    # db.session.commit()
    # bk1 = Book(name='老王回忆录', author_id=au1.id)
    # bk2 = Book(name='我读书少,你别骗我', author_id=au1.id)
    # bk3 = Book(name='如何才能让自己更骚', author_id=au2.id)
    # bk4 = Book(name='怎样征服美丽少女', author_id=au3.id)
    # bk5 = Book(name='如何征服英俊少男', author_id=au3.id)
    # # 把数据提交给用户会话
    # db.session.add_all([bk1, bk2, bk3, bk4, bk5])
    # # 提交会话
    # db.session.commit()

    manager.run()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>book</title>
</head>
<body>

<form method="post">
    {{form.author_name.label}}{{form.author_name}} <br>
    {{form.book_name.label}}{{form.book_name}} <br>

    {{form.submit}} <br>

    {% for message in get_flashed_messages() %}
        {{ message }}
    {% endfor %}
</form>

<hr>



<ul>
    {% for author in authors %}

        <li>
        {{ author.name }} <a href="{{ url_for('del_author',au_id=author.id) }}">删除</a>
        <ul>

        {% for bok in author.bok %}
            <li>{{ bok.name }} <a href="{{ url_for('delete_book',bok_id=bok.id) }}">删除</a></li>


        {% else %}
            <li>无</li>
        {% endfor %}

        </ul>

        </li>

    {% endfor %}
</ul>


{#{% for author in authors %}#}
{#    <ul>{{ author.name }}</ul>#}
{#        {% for bok in author.bok %}#}
{#            <li>{{ bok.name }}</li>#}
{#        {% endfor %}#}
{##}
{#{% endfor %}#}



</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值