****
图书管理
文中有不恰当出望各位给出宝贵意见
联系邮箱: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)
偏向练手项目,希望能帮到您,谢谢