1. 程式人生 > >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")) # 設定外來鍵
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:[email protected]: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)

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>

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'))
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'))
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'))

這樣就完成了一個簡單的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:[email protected]: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)

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>