使用flask框架写一个简单的图书馆管理系统的demo,数据库使用postgresql——简易版

当我们需要管理一些书籍时,我们可以利用Python和PostgreSQL来创建一些简单的操作系统,这样我们就可以轻松地管理我们的书籍库存了。

在这篇博客中,我将向您展示如何使用Python Flask框架和psycopg2库来创建一个简单的书籍库存管理系统。该系统可以实现以下操作:

显示所有书籍
添加一本书籍
删除一本书籍
借出一本书籍
还回一本书籍

首先,我们需要创建一个名为book的数据库来存储所有书籍的信息。我们可以使用以下代码在PostgreSQL中创建这个数据库:

CREATE DATABASE book;

现在,我们需要创建一个名为book的表来存储书籍的信息。表格将需要包含以下信息:书籍ID,书籍名称,书籍作者和书籍库存量。在PostgreSQL中,我们可以使用以下代码来创建这个表:

CREATE TABLE book(
    bookid integer primary key, 
    bookname varchar(40) not null, 
    bookauther varchar(40) not null,
    booksurplus integer not null
); 

这个表格包含了书籍的ID、名称、作者和库存量。我们将使用这些信息来管理库存,并对书籍进行增加、删除、借出和还回的操作。

接下来,我们需要使用psycopg2库来连接到PostgreSQL数据库。我们需要创建一个名为connect_db()的函数,该函数将读取数据库的参数并返回一个数据库连接对象。

import psycopg2

def connect_db():
    conn = psycopg2.connect(
        host='localhost',
        port='5432',
        dbname='book',
        user='postgres',
        password='123456'
    )
    return conn

接下来,我们需要使用Flask框架来构建一个Web应用程序。我们将需要创建以下路由,以便能够与我们的数据库进行交互:

/: 显示主页
/show_all_book: 显示所有书籍
/del_book0: 显示删除书籍的页面
/del_book1: 执行删除书籍操作
/add_book0: 显示添加书籍的页面
/add_book1: 执行添加书籍操作
/out_book0: 显示借出书籍的页面
/out_book1: 执行借出书籍操作
/in_book0: 显示还回书籍的页面
/in_book1: 执行还回书籍操作
现在,让我们开始编写这些路由。首先,我们需要在app.py中导入Flask和render_template和request函数,这些函数将帮助我们构建Web应用程序。

from flask import Flask, render_template, request
app = Flask(__name__)
接下来,让我们创建主页路由。

@app.route('/')
def index():
    return render_template('index.html')
<!doctype html>
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<html>
<body>
    <p><a href="{{ url_for('show_all_book') }}">展示所有藏书</a></p>
    <p><a href="{{ url_for('out_book0') }}">借出图书</a></p>
    <p><a href="{{ url_for('in_book0') }}">还回图书</a></p>
    <p><a href="{{ url_for('del_book0') }}">删除图书</a></p>
    <p><a href="{{ url_for('add_book0') }}">增加图书</a></p>

</body>
</html>

我们将在templates文件夹中创建一个名为index.html的模板文件,该文件将在我们访问主页时被渲染。

接下来,让我们创建一个路由来显示所有的书籍。

@app.route('/show_all_book')
def show_all_book():
    conn = connect_db()
    cur = conn.cursor()
    cur.execute("SELECT * FROM book")
    rows = cur.fetchall()
    return render_template('show_all_book.html',rows=rows)
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style>
        table {
            border-collapse: collapse;
            width: 100%;
        }
        th, td {
            text-align: left;
            padding: 8px;
            border-bottom: 1px solid #ddd;
        }
        th {
            background-color: #4CAF50;
            color: white;
        }
    </style>
</head>
<body>
    <h1>图书馆所有藏书</h1>
    <table>
        <tr>
            <th>图书ID</th>
            <th>图书名称</th>
            <th>作者</th>
            <th>余量</th>
        </tr>
        {% for row in rows %}
        <tr>
            <td>{{ row[0] }}</td>
            <td>{{ row[1] }}</td>
            <td>{{ row[2] }}</td>
            <td>{{ row[3] }}</td>
        </tr>
        {% endfor %}
    </table>
     <p><a href="{{ url_for('index') }}">返回首页</a></p>
</body>
</html>

该路由将连接到数据库并获取所有书籍的信息。在获取所有的书籍信息后,我们将把它们传递到一个名为show_all_book.html的模板文件中,该模板文件将渲染所有书籍的信息。

接下来,让我们创建一个路由来删除一本书籍。

@app.route('/del_book0',methods=['POST','GET'])
def del_book0():
    return render_template('del_book.html')

@app.route('/del_book1',methods=['POST','GET'])
def del_book1():
    del_bookid = request.form.get('del_bookid')
    del_bookname = request.form.get('del_bookname')

    sql = f"DELETE FROM book WHERE bookid={del_bookid} "

    conn = connect_db()
    cur = conn.cursor()
    cur.execute(sql)

    conn.commit()
    return render_template('del_book.html', msg=f"{del_bookname}删除成功!")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>删除书籍</title>
</head>

    <form action = "/del_book1" method = "POST">
         请输入删除书籍的Id :<input type="text" name="del_bookid" ><br/>
         请输入删除书籍的名称:<input type="text" name="del_bookname" ><br/>
            <input type="submit" value="提交"><br/>
        {{msg}}
    </form>
   <p><a href="{{ url_for('del_book0') }}">继续删除</a></p>
   <p><a href="{{ url_for('index') }}">返回首页</a></p>

<body>
</body>
</html>

该路由将显示一个名为del_book.html的模板文件,该文件将要求用户输入要删除的书籍的信息。然后,当用户提交要删除的书籍信息时,我们将连接到数据库并执行一个名为DELETE FROM的SQL语句,从而删除该书籍。最后,我们将向用户显示一个成功或失败的消息。

接下来,让我们创建一个路由来添加一本书籍。

@app.route('/add_book0',methods=['POST','GET'])
def add_book0():
    return render_template('add_book.html')

@app.route('/add_book1',methods=['POST','GET'])
def add_book1():

    add_bookid = request.form.get('add_bookid')
    add_bookname = request.form.get('add_bookname')
    add_bookauther = request.form.get('add_bookauther')
    add_booksurplus= request.form.get('add_booksurplus')

    sql=f"INSERT INTO book VALUES ({add_bookid},'{add_bookname}','{add_bookauther}',{add_booksurplus})"
    conn=connect_db()
    cur=conn.cursor()
    cur.execute(sql)
    conn.commit()
    return render_template('add_book.html',msg=f"{add_bookname}添加成功!")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加书籍</title>
</head>

    <form action = "/add_book1" method = "POST">
        请输入增加书籍的Id :<input type="text" name="add_bookid" ><br/>
        请输入增加书籍的名称:<input type="text" name="add_bookname" ><br/>
        请输入增加书籍的作者:<input type="text" name="add_bookauther" ><br/>
        请输入增加书籍的数量:<input type="text" name="add_booksurplus" ><br/>
            <input type="submit" value="提交"><br/>
        {{msg}}
        <p><a href="{{ url_for('add_book0') }}">继续添加书籍</a></p>

    </form>
   <p><a href="{{ url_for('index') }}">返回首页</a></p>

<body>
</body>
</html>

该路由将显示一个名为add_book.html的模板文件。在该文件中,用户可以输入一本书籍的信息,并提交表单以将信息添加到数据库中。当用户提交表单时,我们将连接到数据库并执行一个名为INSERT INTO的SQL语句,以将书籍添加到数据库中。最后,我们将向用户显示一个成功或失败的消息。

接下来,让我们创建一个路由来借出一本书籍。

@app.route('/out_book0',methods=['POST','GET'])
def out_book0():
    return render_template('out_book.html')

@app.route('/out_book1',methods=['POST','GET'])
def out_book1():
    out_bookid=request.form.get('out_bookid')
    out_bookname = request.form.get('out_bookname')

    sql=f"select book.booksurplus from book where bookid={out_bookid}"
    conn=connect_db()
    cur=conn.cursor()
    cur.execute(sql)
    surplus=cur.fetchall()
    conn.commit()
    if surplus[0][0] >0:
        sql=f"update book set  booksurplus=booksurplus-1 where bookid={out_bookid}"

        conn=connect_db()
        cur=conn.cursor()
        cur.execute(sql)
        conn.commit()
        return render_template('out_book.html',msg=f"{out_bookname}成功借出,{out_bookname}还剩下{surplus[0][0]}本。")
    else:
        return render_template('out_book.html',msg=f"抱歉!{out_bookname}库存不足!")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>借出书籍</title>
</head>

    <form action = "/out_book1" method = "POST">
         请输入借出书籍的Id  :<input type="text" name="out_bookid" ><br/>
         请输入借出书籍的名称 :<input type="text" name="out_bookname" ><br/>
            <input type="submit" value="提交"><br/>
        {{msg}}
    </form>
   <p><a href="{{ url_for('out_book0') }}">继续借书</a></p>
   <p><a href="{{ url_for('index') }}">返回首页</a></p>

<body>
</body>
</html>

该路由将显示一个名为out_book.html的模板文件,该文件将要求用户输入要借出的书籍的信息。当用户提交表单时,我们将连接到数据库并首先检查该书籍库存是否足够。如果库存充足,我们将执行一个名为update book set的SQL语句,将该书籍的库存减1,并向用户显示一个成功消息。如果库存不足,我们将向用户显示一个失败消息。

最后,让我们创建一个路由来还回一本书籍。

@app.route('/in_book0',methods=['POST','GET'])
def in_book0():
    return render_template('in_book.html')

@app.route('/in_book1',methods=['POST','GET'])
def in_book1():
    in_bookid=request.form.get('in_bookid')
    in_bookname = request.form.get('in_bookname')
    sql=f"update book set  booksurplus=booksurplus+1 where bookid={in_bookid}"
    conn=connect_db()
    cur=conn.cursor()
    cur.execute(sql)
    conn.commit()

    sql = f"select book.booksurplus from book where bookid={in_bookid}"
    conn = connect_db()
    cur = conn.cursor()
    cur.execute(sql)
    surplus = cur.fetchall()
    conn.commit()

    return render_template('in_book.html',msg=f"{in_bookname}成功还回,{in_bookname}还剩下{surplus[0][0]}本。")


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>还回书籍</title>
</head>

    <form action = "/in_book1" method = "POST">
         请输入还回书籍的Id :<input type="text" name="in_bookid" ><br/>
         请输入还回书籍的名称:<input type="text" name="in_bookname" ><br/>
            <input type="submit" value="提交"><br/>
        {{msg}}
    </form>
   <p><a href="{{ url_for('in_book0') }}">继续还书</a></p>
   <p><a href="{{ url_for('index') }}">返回首页</a></p>

<body>
</body>
</html>

在这篇博客中,我们学习了如何使用Python Flask和PostgreSQL实现基本的书籍库存管理系统。我们分别实现了展示所有书籍、删除书籍、添加书籍、借出书籍和归还书籍等功能的路由。

在实现这些功能之前,我们首先创建了一个名为book的数据库并设计了一个包含书籍ID、书名、作者名和库存数量的book表。然后,我们实现了一个connect_db函数来连接到这个数据库。

接下来,我们实现了展示所有书籍、删除书籍和添加书籍的路由。在这些路由中,我们使用了SQL语句并通过connect_db函数连接到了database。
在借出书籍和还回书籍的路由中,我们也使用了SQL语句,但除了执行UPDATE和SELECT语句之外,我们还使用了request.form.get函数来获取表单中用户输入的数据,并使用render_template函数来渲染包含成功消息的HTML模板。

总之,通过这篇博客,我们可以了解到使用Python Flask与数据库结合,可以很容易地创建一个简单易用的书籍库存管理系统,帮助用户快速处理图书馆等场合的库存管理问题。

目录结构:

├── app.py
├── static
│   ├── css
│   └── js
└── templates
    ├── add_book.html
    ├── del_book.html
    ├── index.html
    ├── in_book.html
    ├── out_book.html
    └── show_all_book

完整代码:

import psycopg2
from flask import Flask, render_template, request
app = Flask(__name__)


def connect_db():
    conn = psycopg2.connect(
        host='localhost',
        port='5432',
        dbname='book',
        user='postgres',   
        password='123456'
    )
    return conn


@app.route('/')
def index():
    return render_template('index.html')




@app.route('/show_all_book')
def show_all_book():
    conn = connect_db()
    cur = conn.cursor()
    cur.execute("SELECT * FROM book")
    rows = cur.fetchall()
    return render_template('show_all_book.html',rows=rows)

@app.route('/del_book0',methods=['POST','GET'])
def del_book0():
    return render_template('del_book.html')

@app.route('/del_book1',methods=['POST','GET'])
def del_book1():
    del_bookid = request.form.get('del_bookid')
    del_bookname = request.form.get('del_bookname')


    sql = f"DELETE FROM book WHERE bookid={del_bookid} "

    conn = connect_db()
    cur = conn.cursor()
    cur.execute(sql)

    conn.commit()
    return render_template('del_book.html', msg=f"{del_bookname}删除成功!")

@app.route('/add_book0',methods=['POST','GET'])
def add_book0():
    return render_template('add_book.html')

@app.route('/add_book1',methods=['POST','GET'])
def add_book1():

    add_bookid = request.form.get('add_bookid')
    add_bookname = request.form.get('add_bookname')
    add_bookauther = request.form.get('add_bookauther')
    add_booksurplus= request.form.get('add_booksurplus')

    sql=f"INSERT INTO book VALUES ({add_bookid},'{add_bookname}','{add_bookauther}',{add_booksurplus})"
    conn=connect_db()
    cur=conn.cursor()
    cur.execute(sql)
    conn.commit()
    return render_template('add_book.html',msg=f"{add_bookname}添加成功!")


@app.route('/out_book0',methods=['POST','GET'])
def out_book0():
    return render_template('out_book.html')

@app.route('/out_book1',methods=['POST','GET'])
def out_book1():
    out_bookid=request.form.get('out_bookid')
    out_bookname = request.form.get('out_bookname')

    sql=f"select book.booksurplus from book where bookid={out_bookid}"
    conn=connect_db()
    cur=conn.cursor()
    cur.execute(sql)
    surplus=cur.fetchall()
    conn.commit()
    if surplus[0][0] >0:
        sql=f"update book set  booksurplus=booksurplus-1 where bookid={out_bookid}"

        conn=connect_db()
        cur=conn.cursor()
        cur.execute(sql)
        conn.commit()
        return render_template('out_book.html',msg=f"{out_bookname}成功借出,{out_bookname}还剩下{surplus[0][0]}本。")
    else:
        return render_template('out_book.html',msg=f"抱歉!{out_bookname}库存不足!")


@app.route('/in_book0',methods=['POST','GET'])
def in_book0():
    return render_template('in_book.html')

@app.route('/in_book1',methods=['POST','GET'])
def in_book1():
    in_bookid=request.form.get('in_bookid')
    in_bookname = request.form.get('in_bookname')
    sql=f"update book set  booksurplus=booksurplus+1 where bookid={in_bookid}"
    conn=connect_db()
    cur=conn.cursor()
    cur.execute(sql)
    conn.commit()

    sql = f"select book.booksurplus from book where bookid={in_bookid}"
    conn = connect_db()
    cur = conn.cursor()
    cur.execute(sql)
    surplus = cur.fetchall()
    conn.commit()

    return render_template('in_book.html',msg=f"{in_bookname}成功还回,{in_bookname}还剩下{surplus[0][0]}本。")



if __name__ == '__main__':
    app.run()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值