基于Flask框架的图书管理项目

在这里插入图片描述****

图书管理


文中有不恰当出望各位给出宝贵意见
联系邮箱:xiaokangk1@gmail.com

前端部分

此段代码可添加在当前文件夹templates下,注意设置文件夹模式templates为jinja2

<!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?bookid={{ book.id }}"> 删除</a></li>
            {% endfor %}

        </ul>
    {% endfor %}


</ul>

<script>
    {% for message in get_flashed_messages() %}
        alert("{{ message }}")
    {% endfor %}
</script>

</body>
</html>

后端部分

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

# 1. 创建web应用
app = Flask(__name__)
# 对sqlalchemy进行设置
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@127.0.0.1:3306/book21"

app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

# 设置密钥
app.secret_key = "test"

# 创建数据库连接对象
db = SQLAlchemy(app)


# 作者表  一
class Author(db.Model):
    __tablename__ = "t_author"
    # 主键
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40), unique=True)

    # 关系属性
    books = db.relationship('Book')


# 书籍表   多
class Book(db.Model):
    __tablename__ = "t_book"
    # 主键
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    # 多表设置外键
    author_id = db.Column(db.Integer, db.ForeignKey("t_author.id"))


# 展示页面与增加数据
# 增加post的方法。可以提交数据
@app.route("/", methods=["GET", "POST"])
def index():
    # 对请求方式进行判断
    if request.method == "GET":  # 展示页面
        # 查询作者数据
        authors = Author.query.all()
        # 将数据传入模板渲染
        return render_template("book_test.html", authors=authors)

    # post 获取前端传入的请求数据
    author_name = request.form.get("author_name")
    book_name = request.form.get("book_name")
    # 参数校验
    # all([])只有当列表里的元素都有值(不为none/0/空字符串)的时候,才会返回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:
            book = Book(name=book_name)
            # 关联数据
            author.books.append(book)
            # 添加数据库并提交
            db.session.add(book)
            db.session.commit()

        else:  # 没有作者,添加作者和书籍
            author = Author(name=author_name)
            book = Book(name=book_name)

            # 关联数据
            author.books.append(book)
            # 添加数据库并提交
            db.session.add_all([author, book])
            db.session.commit()

    except BaseException as e:
        flash("数据库操作失败")
        # 操作失败回滚
        db.session.rollback()

        # 增加数据后刷新一下页面
        return redirect(url_for("index"))

    # 添加完 也刷新页面(重定像)
    return redirect(url_for("index"))


# 删除书籍  需要从前端传递过来书籍的id  查询字符串
@app.route('/delete_book')  # 只删书籍,不删作者
def delete_book():
    # 获取书籍的id
    bookid = request.args.get("bookid")
    try:
        # 防止前端传入的数据不符合
        bookid = int(bookid)

    except BaseException as e:
        flash("参数错误了")
        return redirect(url_for("index"))

    # 查询该书籍
    try:
        book = Book.query.get(bookid)
        # 删除该书籍
        db.session.delete(book)
        db.session.commit()

    except BaseException as e:
        flash("数据库操作失败")
        db.session.rollback()
        return redirect(url_for("index"))

    return redirect(url_for("index"))


# 删除作者 株连其作品 需要传递作者id 动态URL
@app.route('/delete_author/<int:authorid>')
def delete_author(authorid):
    # 根据作者的id查询作者的模型
    try:
        author = Author.query.get(authorid)

        # 先删除作者的书籍,否则书籍会被保存数据库

        for book in author.books:
            db.session.delete(book)

        # 删除作者模型
        db.session.delete(author)
        db.session.commit()

    except BaseException as e:
        flash("数据库操作失败")
        db.session.rollback()
        return redirect(url_for("index"))

    return redirect(url_for("index"))


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()
    app.run(debug=True)

偏向练手项目,希望能帮到您,谢谢

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值