使用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()
作者:liguochun
出处:https://www.cnblogs.com/liguochun0304/p/17997909
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现