本文的图书馆管理系统架构如下:
其中,学生信息表为student_info.xlsx,图书信息表为book_info.xlsx,图书借阅信息表为borrow_info.xlsx。
下表为各个表中的数据信息:
表名 | 表中信息 | ||
---|---|---|---|
学生信息表 | 姓名 | 专业 | 学院 |
性别 | 年级 | 密码 | |
年龄 | 学号 | ||
图书信息表 | 索引号 | 书名 | 作者 |
国家 | 类型 | 出版时间 | |
价格 | ISBN | 出版社 | |
入库时间 | 库存状态 | 已借时间 | |
库存数量 | |||
图书借阅信息表 | 学号 | 书名 | 已借时间 |
到期时间 |
下面为该系统的具体代码实现:
首先,定义一个学生类,用于验证学生登陆系统和注册系统,并保存信息。
# 定义学生信息系统
import pandas as pd
from datetime import datetime
class Student:
student_name = '小都林'
def __init__(self,student_id,password):
# 初始化 学号、密码
self.student_id = student_id
self.password = password
# 验证系统
def verify(self):
student_info = pd.read_excel('student_info.xlsx') # 打开学生信息表
# 如果学号存在,且密码匹配,则进入系统;如果不存在,则显示是否进入注册系统
if self.student_id in student_info['学号'].values.tolist():
if self.password == student_info[student_info['学号'] == self.student_id]['密码'].values[0]:
print('验证成功,等待进入系统页面!')
# 接入登录系统
book = Book(self.student_id) # 初始化图书系统的实例
book.main() # 图书系统的主界面
else:
print('密码错误!')
else:
print('未注册,请注册后再登陆')
v = input('是否开启注册系统?是,请输入y;否,请输入n')
if v == 'y':
self.register() # 进入注册系统
# 注册系统
def register(self):
ls = [] # 用于接收注册输入的信息
student_info = pd.read_excel('student_info.xlsx') # 打开学生信息表
for i in ['姓名','性别','年龄','专业','年级','学号','学院','密码']:
ipt = input('请输入您的' + i)
# 用于验证学号是否已经存在,保证学号的唯一性
while True:
if i == '学号':
if int(ipt) in student_info['学号'].values:
print('您输入的学号已经存在,请重新确认您的学号!')
ipt = input('请输入你的学号:')
else:
try:
ls.append(int(ipt))
except:
ls.append(int)
break
else:
try:
ls.append(int(ipt))
except:
ls.append(ipt)
break
# 将数据进行转置,保证与表中的结果一致,方便后续数据添加
ls_df = pd.DataFrame(ls).T
# 建立列名字典
dic = {}
for i in range(len(student_info.columns)):
dic.update({i: student_info.columns[i]})
# 对准备添加进表中的数据进行重命名
ls_df.rename(columns=dic, inplace=True)
# 数据拼接,按行!
concat_info = pd.concat([student_info,ls_df],axis = 0)
concat_info.reset_index(drop = True,inplace = True) # 重置索引
concat_info.to_excel('student_info.xlsx',index = None) # 数据存入文件中
v = input('是否登录系统?是,请输入y;否,请输入n')
if v == 'y':
self.student_id = int(ls[5]) # 索引位置为5是学号,可以数一下列表中的索引位置
self.password = int(ls[7]) # 索引位置为7是密码
# 上面两行修改了初始化中的值,并再一次验证!
self.verify()
其次, 定义图书系统,用于实现各个系统的功能。
class Book:
def __init__(self,s_id):
self.book_info = pd.read_excel('book_info.xlsx') # 打开图书信息表
self.student_id = s_id # 将之前输入的学号,传入到这里
下面代码是为了用户展示这个系统有什么功能,且输入对应数字即可实现对应功能。
def main(self):
print('本图书管理系统有如下功能:')
print('1、查询操作')
print('2、归还操作')
print('3、催还')
print('4、信息查询')
print('5、退出系统操作')
print('按照上述序号输入,即可执行对应的操作')
ipt = input('请输入执行的功能序号:')
# 查询、借阅操作
if ipt == '1':
self.inquire()
# 归还操作
elif ipt == '2':
self.Return()
# 催还操作
elif ipt == '3':
self.recall_book()
# 信息查询
elif ipt == '4':
self.display_info()
# 系统退出操作
elif ipt == '5':
pass
def inquire(self):
# book_info = pd.read_excel('book_info.xlsx') # 打开图书信息表
book_name = input('请输入您需要查询的书名:')
# 对表中的信息进行匹配查询
book_exist = self.book_info[self.book_info['书名'] == book_name]
if len(book_exist.values) == 0: # 如果book_exist没有数据,则值的长度为0
print('您所查询的书籍不存在!!!')
ipt = input('是否继续查询书籍?是,请输入y;否,请输入n')
if ipt == 'y':
self.inquire()
else:
self.main()
else:
# 如果图书存在,则显示是否借阅图书;是,则调用借阅系统,否则,回到主界面
print(book_exist)
ipt = input('是否借阅该本图书?是,请输入y;否,请输入n')
if ipt == 'y':
self.Borrow(book_name)
else:
self.main()
def Borrow(self,book_name):
# 检验对应查询图书中的库存状态,
if self.book_info[self.book_info['书名'] == book_name]['库存状态'].values[0] == '可借':
print('图书已借出,请及时归还')
# 借阅后,需要将借阅信息添加进借阅信息表中
borrow_info = pd.read_excel('borrow_info.xlsx')
# 学号 书名 借书时间 归还时间
borrow_time = datetime.now().strftime('%Y-%m-%d') # 输出借阅时的当前时间
# 下面是输出当前时间的年、月、日;
# 本文的借阅时间是以一个月为限,为了方便计算,则直接将月份加1即可
year = borrow_time.split('-')[0],month = borrow_time.split('-')[1],day = borrow_time.split('-')[2]
# 如果月份等于12,则月份变为1月,年份加1;不然,就是月份加1,年份不变
if int(month) == 12:
year = str(int(year) + 1)
month = '01'
else:
month = str(int(month) + 1)
return_time = year + '-' + month + '-' + day
# 将借阅信息添加进表中!
pd.concat([borrow_info,
pd.DataFrame([[self.student_id],[book_name],[borrow_time],[return_time]])],
axis = 0).reset_index(drop = True).T.to_excel('borrow_info.xlsx',index = None)
# 对图书信息表中的信息进行变更,需要变更库存数量,以此来确认库存状态,保证图书是否可借;
# 同时,添加进本次的借阅时间
Index = self.book_info[self.book_info['书名'] == book_name].index.values[0]
self.book_info.loc[Index,'库存数量'] -= 1
self.book_info.loc[Index,'已借时间'] = borrow_time
if self.book_info.loc[Index,'库存数量'] == 0:
self.book_info.loc[Index, '库存状态'] = '不可借'
self.book_info.to_excel('book_info.xlsx',index = None)
else:
self.book_info.to_excel('book_info.xlsx', index=None)
def Return(self):
borrow_info = pd.read_excel('borrow_info.xlsx') # 打开图书借阅信息表
stu_borrow_info = borrow_info[borrow_info['学号'] == self.student_id] # 筛选出匹配学号的借阅信息
print(stu_borrow_info)
# 查询相关的归还书籍名,如果存在,则归还;否则,显示不存在该书籍的借阅
return_book_name = input('请输入您要归还的书籍名称:')
if return_book_name in borrow_info['书名'].values.tolist():
print('图书已归还!!!欢迎下次再借')
# 定位该书籍在借阅信息表中的位置,方便删掉这个数据
index = borrow_info[(borrow_info['学号'] == self.student_id) & (borrow_info['书名'] == return_book_name)].index
# 按行删除指定行数的图书借阅信息
borrow_info.drop(index = index,axis = 0,inplace=True)
# 重置索引,最好每次做完数据删除后,都做索引重置操作
borrow_info.reset_index(drop = True,inplace=True)
borrow_info.to_excel('borrow_info.xlsx',index = None)
else:
print('您所要归还的图书并未借,请重新确认书籍名称!')
def display_info(self):
# 书表中有 书名
# 人表中有 学号
# 借表中有 书名加学号
book_info = pd.read_excel('book_info.xlsx')
borrow_info = pd.read_excel('borrow_info.xlsx')
stu_info = pd.read_excel('student_info.xlsx')
b_info = borrow_info[borrow_info['学号'] == self.student_id]
# 简单的三表连接查询操作,可以增加一个输入指定查询字段的input控制语句
print(pd.merge(
pd.merge(stu_info, b_info, on='学号'),
book_info,
on = '书名'
))
def recall_book(self):
borrow_info = pd.read_excel('borrow_info.xlsx')
# 和上述的查询一样,如果匹配的数据为空,则值的长度为0
if len(borrow_info[borrow_info['到期时间'] < datetime.now()].values) == 0:
print('不存在需要催还书籍的人员名单')
else:
print('————————以下是需要催还的人员名单及其信息——————')
print(borrow_info[borrow_info['到期时间'] < datetime.now()])
最后,对上述程序进行实例化,并展示结果!
# 初始化实例对象
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
student_id = int(input('请输入您的学号:'))
password = int(input('请输入您的密码:'))
std = Student(student_id,password)
std.verify()
如果对您有帮助,希望能够获得您的关注、点赞和收藏!!!
如有其他问题,也可私信我!!!