excel+ python实现图书馆管理系统

本文的图书馆管理系统架构如下:

        其中,学生信息表为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()

如果对您有帮助,希望能够获得您的关注、点赞和收藏!!!

如有其他问题,也可私信我!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值