Python 测开28期 - WL - 学习笔记 - 后端开发作业

作业

'''
图书管理系统
项目简介
图书管理系统用于管理图书馆或图书收藏的软件系统。它帮助图书管理员和用户进行图书的管理。

实现方式
基于Flask框架,完成图书管理系统接口设计。

知识点
Flask 框架
接口路由技术
模板技术
请求与响应数据处理
蓝图与视图
数据库技术
项目需求
创建本地数据库 bms。
创建数据表 book, 包含如下字段:
bid(编号,主键自动增长)
name(书名,字符型)
price(单价,浮点型)
summary(概要,可变长度字符型)
quantity(库存,整型),
建库,建表的数据库语句,以注释形式保留在 bookBP.py 文件中
使用 Flask 完成图书管理系统后台设计
使用 蓝图 完成图书管理系统路由接口设计
实现 添加,修改,删除,列表显示,搜索等功能的对应接口
列表接口
GET 请求方式返回列表页面
POST 请求方式以 JSON 格式返回所有学生数据
添加接口
GET 请求方式返回添加页面
POST 请求方式以 JSON 格式返回所有学生数据,包含新添加的数据
修改接口
所有修改相关请求需要携带要修改学生的ID信息
GET 请求方式返回修改页面
POST 请求方式以 JSON 格式返回所有学生数据包含修改后的数据
GET 请求方式以 JSON 格式返回修改学生在修改页面回显的数据
删除接口
所有修改相关请求需要携带要删除学生的ID信息
GET 请求方式删除指定学生信息并在列表页显示删除后的结果
搜索接口
GET 请求方式以 JSON 格式返回搜索结果
搜索功能中可以在 name,和summary 字段进行模糊搜索
'''

from flask import Flask, Blueprint, render_template, request, redirect
import sqlite3  # 导入 sqlite3 库

# 建立mysql数据库连
# connection = pymysql.connect(host='mysql.hogwarts.ceshiren.com',port=3306,user='stu',password='hogwarts_stu',database='datebase')


# 定义蓝图对象
bookBP = Blueprint(name="book", import_name=__name__)
# 连接到SQLite数据库文件,名为 book,没有则创建,
# check_same_thread=False,允许sqlite同时被多个线程访问
connection = sqlite3.connect('book', check_same_thread=False)
# 创建图书管理表,
# if not exists 没有该表则创建此表,有则跳过
cursor = connection.cursor()
sql_str = '''create table if not exists book(bid integer PRIMARY KEY AUTOINCREMENT NOT NULL,name text,price real,summary text,quantity integer)'''
cursor.execute(sql_str)
connection.commit()
cursor.close()
# 定义一个首页
@bookBP.route("/")
def index():
    return render_template("index.html")


# 列表接口
# GET 请求方式返回列表页面
# POST 请求方式以 JSON 格式返回所有学生数据
# 定义返回所有书籍信息的接口
@bookBP.route("/list/", methods=["GET", "POST"])
def list():
    if request.method == "GET":
        return redirect("/")  # get 请求直接重定向到首页列表页面
    if request.method == "POST":
        # 获取游标对象
        cursor = connection.cursor()
        # 获取所有书籍信息的sql
        sql_str = '''select * from book'''
        # 执行sql
        cursor.execute(sql_str)
        # 获取所有查询数据
        data = cursor.fetchall()
        # 设置一个空list
        datas = []
        for item in data:
            s = {"bid": item[0], "name": item[1], "price": item[2], "summary": item[3], "quantity": item[4]}
            datas.append(s)
        cursor.close()
        return datas


# 添加接口
# GET 请求方式返回添加页面
# POST 请求方式以 JSON 格式返回所有学生数据,包含新添加的数据
@bookBP.route("/book_add/", methods=["GET", "POST"])
def book_add():
    if request.method == "GET":
        return render_template("book_add.html")
    elif request.method == "POST":
        name = request.values.get("name")
        price = request.values.get("price")
        summary = request.values.get("summary")
        quantity = request.values.get("quantity")
        cursor = connection.cursor()
        sql_str = f"insert into book (name,price,summary,quantity) values ('{name}',{price},'{summary}',{quantity})"
        cursor.execute(sql_str)
        connection.commit()
        cursor.close()
        return redirect("/")


# 修改接口 所有修改相关请求需要携带要修改学生的ID信息
# GET 请求方式返回修改页面
# POST 请求方式以 JSON 格式返回所有学生数据包含修改后的数据
# GET 请求方式以 JSON 格式返回修改学生在修改页面回显的数据
@bookBP.route("/change/<bid>", methods=["GET", "POST"])
def change(bid):
    if request.method == "GET":
        return render_template("change.html")
    elif request.method == "POST":
        name = request.values.get("name")
        price = request.values.get("price")
        summary = request.values.get("summary")
        quantity = request.values.get("quantity")
        cursor = connection.cursor()
        sql_str = f"update book set name='{name}',price={price},summary='{summary}',quantity={quantity} where bid={bid}"
        cursor.execute(sql_str)
        connection.commit()
        cursor.close()
        return redirect("/")


# 修改数据时获取的回填数据的接口
@bookBP.route("/change_date/<bid>")
def change_date(bid):
    cursor = connection.cursor()
    sql_str = f'''select * from book where bid={bid}'''
    cursor.execute(sql_str)
    data = cursor.fetchall()
    cursor.close()
    s = {"sid": data[0][0], "name": data[0][1], "price": data[0][2], "summary": data[0][3], "quantity": data[0][4]}

    return s


# 删除接口
# 所有修改相关请求需要携带要删除学生的ID信息
# GET 请求方式删除指定学生信息并在列表页显示删除后的结果
@bookBP.route("/delete_book/<bid>")
def delete_book(bid):
    cursor = connection.cursor()
    sql_str = f'''delete from book where bid={bid}'''
    cursor.execute(sql_str)
    connection.commit()
    cursor.close()
    return redirect("/")


# 搜索接口
# GET 请求方式以 JSON 格式返回搜索结果
# 搜索功能中可以在 name,和summary 字段进行模糊搜索
@bookBP.route("/find_book")
def find_book():
    name = request.values.get("name")
    summary = request.values.get("summary")
    cursor = connection.cursor()
    if (name !='' and name is not None) or (summary != '' and summary is not None):
        sql_str = f"select * from book where name like '%{name}%' or summary like '%{summary}%' "
    else:
        sql_str = f"select * from book"
    cursor.execute(sql_str)
    data = cursor.fetchall()
    datas = []
    for item in data:
        s = {"bid": item[0], "name": item[1], "price": item[2], "summary": item[3], "quantity": item[4]}
        datas.append(s)
    cursor.close()
    return datas