当前位置:   article > 正文

flask实现简单的图书管理系统_基于flask的图书管理系统的设计与实现

基于flask的图书管理系统的设计与实现

简单的图书管理系统

实现功能:

图书管理系统:

  1. 实现图书和作者的添加功能
  2. 实现动态查询显示图书信息
  3. 实现删除功能
1.创建作者和书籍模型
    # 作者表
class Author(db.Model):
    __tablename__ = "authors"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(48), unique=True)
    books = db.relationship("Book", backref="author")  # 关系属性


# 书籍表
class Book(db.Model):
    __tablename__ = "books"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(48), unique=True)
    author_id = db.Column(db.Integer, db.ForeignKey("authors.id"))  # 设置外键
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
2.显示界面

2.1 python代码

from flask import Flask, render_template, request, flash, redirect, url_for
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.secret_key = 'test'
# 设置数据库的连接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@127.0.0.1:3306/db_books"
# 是否监听数据库变化  一般不打开, 比较消耗性能
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 创建数据库操作对象(建立了数据库连接)
db = SQLAlchemy(app)


# 作者表
class Author(db.Model):
    __tablename__ = "authors"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(48), unique=True)
    books = db.relationship("Book", backref="author")  # 关系属性


# 书籍表
class Book(db.Model):
    __tablename__ = "books"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(48), unique=True)
    author_id = db.Column(db.Integer, db.ForeignKey("authors.id"))  # 设置外键


@app.route("/", methods=['GET', 'POST'])
def index()
    # 查询出所有的作者和书籍信息
    authors = Author.query.all()
	return render_template('book_test.html', authors=authors)

if __name__ == '__main__':
    # 会删除所有继承db.Model的表
    db.drop_all()
    # 会创建所有继承自db.Model的表
    db.create_all()

    # 生成数据
    au1 = Author(name='金庸')
    au2 = Author(name='古龙')
    au3 = Author(name='梁羽生')

    bk1 = Book(name='《神雕侠侣》')
    bk2 = Book(name='《天龙八部》')
    bk3 = Book(name='《鹿鼎记》')
    bk4 = Book(name='《浣花洗剑录》')
    bk5 = Book(name='《多情剑客无情剑》')
    bk6 = Book(name='《七剑下天山》')
    bk7 = Book(name='《白发魔女传》')

    au1.books.append(bk1)
    au1.books.append(bk2)
    au1.books.append(bk3)
    au2.books.append(bk4)
    au2.books.append(bk5)
    au3.books.append(bk6)
    au3.books.append(bk7)

    # 把数据提交给用户会话
    db.session.add_all([au1, au2, au3])
    db.session.add_all([bk1, bk2, bk3, bk4, bk5, bk6, bk7])
    # 提交会话
    db.session.commit()

    app.run(debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

2.2模板html代码

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


<body>

<h1>图书管理</h1>

<form method="post">
    <label>作者名: </label><input type="text" name="author_name" placeholder="请输入作者名"><br/>
    <label>书名: </label><input type="text" name="book_name" placeholder="请输入书名"><br/>
    <input type="submit" value="保存">

</form>

<hr>

<ul>
    {% for author in authors %}
        <li>{{ author.name }}<a href="/delete_author/{{ author.id }}"> 删除</a></li>
        <ul>
            {% for book in author.books %}
                <li>{{ book.name }} <a href="/delete_book/{{ book.id }}"> 删除</a></li>
            {% endfor %}
        </ul>
    {% endfor %}
</ul>

</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

2.3界面效果图

在这里插入图片描述

3. 增加数据
  • 数据库操作必须进行异常捕获
  • 数据库增删改操作失败, 需要回滚
@app.route("/", methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        try:
            # 查询出所有的作者和书籍信息
            authors = Author.query.all()
        except BaseException as e:
            flash("数据库查询失败")
            return redirect(url_for('index'))
        # 将数据传入模板,进行模板渲染
        return render_template('book_test.html', authors=authors)

    # POST处理
    author_name = request.form.get("author_name")
    book_name = request.form.get("book_name")
    # all([]) 如果列表中的元素都有值(不是0/NONE/空字符串),否则返回True
    if not all([author_name, book_name]):
        flash('参数不完整')
        return redirect(url_for('index'))
    try:
        # 判断作者是否存在
        author = Author.query.filter_by(name=author_name).first()
        if author:  # 有作者,创建书籍模型,建立关联,添加到数据库里
            # 设计表时书名设置为unique,所以判断书籍名是否存在
            book = Book.query.filter_by(name=book_name).first()
            if book:
                flash("书籍已存在")
                return redirect(url_for('index'))
            new_book = Book(name=book_name)
            author.books.append(new_book)
            db.session.add(new_book)
            db.session.commit()

        else:  # 无作者,创建作者书籍模型,建立关联,添加到数据库里
            # 设计表时书名设置为unique,所以判断书籍名是否存在
            book = Book.query.filter_by(name=book_name).first()
            if book:
                flash("书籍已存在")
                return redirect(url_for('index'))
            new_author = Author(name=author_name)
            new_book = Book(name=book_name)
            new_author.books.append(new_book)
            db.session.add_all([new_author, new_book])
            db.session.commit()
    except BaseException as e:
        print(e)
        flash('数据库操作失败')
        # 数据库增删改操作失败时,需要回滚
        db.session.rollback()
        return redirect(url_for('index'))

    return redirect(url_for('index'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
4. 删除数据
  • 删除书籍
    使用动态URL来传递书籍信息
    查询书籍模型, 从数据库中删除数据
@app.route('/delete_book/<int:book_id>')
def delete_book(book_id):
    try:
        # 根据传过来的book_id 查询到book对象进行删除
        book = Book.query.get(book_id)
        # 删除数据
        db.session.delete(book)
        db.session.commit()
        flash('删除成功')
    except BaseException as e:
        print(e)
        flash('数据库操作失败')
        db.session.rollback()
        return redirect(url_for('index'))

    return redirect(url_for('index'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
html部分

在这里插入图片描述

  • 删除作者
    使用查询字符串来传递作者信息
    删除作者和书籍 删除一对多关系数据时, 先删除多的一方
@app.route('/delete_author/<int:author_id>')
def delete_author(author_id):
    try:
        # 根据传过来的author_id 查询到author对象
        author = Author.query.get(author_id)
        # 查询作者名下的书籍模型
        books = author.books
        # 遍历删除
        for book in books:
            db.session.delete(book)
        # 删除数据
        db.session.delete(author)
        db.session.commit()
        flash('删除成功')
    except BaseException as e:
        print(e)
        flash('数据库操作失败')
        db.session.rollback()
        return redirect(url_for('index'))

    return redirect(url_for('index'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这样就完成了一个简单的flask的图书管理的实例.

完整代码
"""
图书管理系统:
1. 实现图书和作者的添加功能
2. 实现动态查询显示图书信息
3. 实现删除功能

"""
from flask import Flask, render_template, request, flash, redirect, url_for
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.secret_key = 'test'
# 设置数据库的连接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@127.0.0.1:3306/db_books"
# 是否监听数据库变化  一般不打开, 比较消耗性能
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 创建数据库操作对象(建立了数据库连接)
db = SQLAlchemy(app)


# 作者表
class Author(db.Model):
    __tablename__ = "authors"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(48), unique=True)
    books = db.relationship("Book", backref="author")  # 关系属性


# 书籍表
class Book(db.Model):
    __tablename__ = "books"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(48), unique=True)
    author_id = db.Column(db.Integer, db.ForeignKey("authors.id"))  # 设置外键


@app.route("/", methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        try:
            # 查询出所有的作者和书籍信息
            authors = Author.query.all()
        except BaseException as e:
            flash("数据库查询失败")
            return redirect(url_for('index'))
        # 将数据传入模板,进行模板渲染
        return render_template('book_test.html', authors=authors)

    # POST处理
    author_name = request.form.get("author_name")
    book_name = request.form.get("book_name")
    # all([]) 如果列表中的元素都有值(不是0/NONE/空字符串),否则返回True
    if not all([author_name, book_name]):
        flash('参数不完整')
        return redirect(url_for('index'))
    try:
        # 判断作者是否存在
        author = Author.query.filter_by(name=author_name).first()
        if author:  # 有作者,创建书籍模型,建立关联,添加到数据库里
            # 设计表时书名设置为unique,所以判断书籍名是否存在
            book = Book.query.filter_by(name=book_name).first()
            if book:
                flash("书籍已存在")
                return redirect(url_for('index'))
            new_book = Book(name=book_name)
            author.books.append(new_book)
            db.session.add(new_book)
            db.session.commit()

        else:  # 无作者,创建作者书籍模型,建立关联,添加到数据库里
            # 设计表时书名设置为unique,所以判断书籍名是否存在
            book = Book.query.filter_by(name=book_name).first()
            if book:
                flash("书籍已存在")
                return redirect(url_for('index'))
            new_author = Author(name=author_name)
            new_book = Book(name=book_name)
            new_author.books.append(new_book)
            db.session.add_all([new_author, new_book])
            db.session.commit()
    except BaseException as e:
        print(e)
        flash('数据库操作失败')
        # 数据库增删改操作失败时,需要回滚
        db.session.rollback()
        return redirect(url_for('index'))

    return redirect(url_for('index'))


@app.route('/delete_book/<int:book_id>')
def delete_book(book_id):
    try:
        # 根据传过来的book_id 查询到book对象进行删除
        book = Book.query.get(book_id)
        # 删除数据
        db.session.delete(book)
        db.session.commit()
        flash('删除成功')
    except BaseException as e:
        print(e)
        flash('数据库操作失败')
        db.session.rollback()
        return redirect(url_for('index'))

    return redirect(url_for('index'))


@app.route('/delete_author/<int:author_id>')
def delete_author(author_id):
    try:
        # 根据传过来的author_id 查询到author对象
        author = Author.query.get(author_id)
        # 查询作者名下的书籍模型
        books = author.books
        # 遍历删除
        for book in books:
            db.session.delete(book)
        # 删除数据
        db.session.delete(author)
        db.session.commit()
        flash('删除成功')
    except BaseException as e:
        print(e)
        flash('数据库操作失败')
        db.session.rollback()
        return redirect(url_for('index'))

    return redirect(url_for('index'))


if __name__ == '__main__':
    # 会删除所有继承db.Model的表
    db.drop_all()
    # 会创建所有继承自db.Model的表
    db.create_all()

    # 生成数据
    au1 = Author(name='金庸')
    au2 = Author(name='古龙')
    au3 = Author(name='梁羽生')

    bk1 = Book(name='《神雕侠侣》')
    bk2 = Book(name='《天龙八部》')
    bk3 = Book(name='《鹿鼎记》')
    bk4 = Book(name='《浣花洗剑录》')
    bk5 = Book(name='《多情剑客无情剑》')
    bk6 = Book(name='《七剑下天山》')
    bk7 = Book(name='《白发魔女传》')

    au1.books.append(bk1)
    au1.books.append(bk2)
    au1.books.append(bk3)
    au2.books.append(bk4)
    au2.books.append(bk5)
    au3.books.append(bk6)
    au3.books.append(bk7)

    # 把数据提交给用户会话
    db.session.add_all([au1, au2, au3])
    db.session.add_all([bk1, bk2, bk3, bk4, bk5, bk6, bk7])
    # 提交会话
    db.session.commit()

    app.run(debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
html代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>


<body>

<h1>图书管理</h1>

<form method="post">
    <label>作者名: </label><input type="text" name="author_name" placeholder="请输入作者名"><br/>
    <label>书名: </label><input type="text" name="book_name" placeholder="请输入书名"><br/>
    <input type="submit" value="保存">

</form>

<hr>

<ul>
    {% for author in authors %}
        <li>{{ author.name }}<a href="/delete_author/{{ author.id }}"> 删除</a></li>
        <ul>
            {% for book in author.books %}
                <li>{{ book.name }} <a href="/delete_book/{{ book.id }}"> 删除</a></li>
            {% endfor %}
        </ul>
    {% endfor %}
</ul>
{% for msg in get_flashed_messages() %}
<script>alert("{{ msg }}")</script>
{% endfor %}

</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/555970
推荐阅读
相关标签
  

闽ICP备14008679号