python实现图书管理系统

一、系统概述 使用 Python 实现的图书馆借阅系统,此系统支持图书信息的录入、借阅、归 还、查询以及借阅记录的查询等功能。

二、功能要求

1. 图书信息录入: o 管理员可以录入图书的基本信息,包括书名、作者、ISBN 号、出 版社和入库时间等。 o 系统自动为每本图书分配一个唯一的标识符(图书 ID)。

2. 图书借阅: o 读者可以借阅图书,借阅时需提供有效的身份证明(如读者证 号)。 o 系统记录借阅时间、借阅者信息和所借图书的详细信息。 o 若图书已被借出,系统提示读者该图书当前不可用。

3. 图书归还: o 读者在借阅期满后归还图书。 o 系统更新图书的归还状态,并记录归还时间。 o 若图书逾期未还,系统能自动计算并显示逾期费用(如有此规 定)。

4. 图书查询: o 用户可以通过书名、作者、ISBN 号等关键词查询图书的借阅状态 和位置(如在馆、已借出等)。 o 查询结果应清晰明了,便于用户快速了解图书的当前状态。

5. 借阅记录查询: o 管理员可以查询某本图书的借阅历史记录,包括借阅者信息、借 阅时间和归还时间等。

三、实现方式

1. 数据结构: o 使用 Python 的字典(dict)或自定义类(class)来定义图书和借 阅记录等数据结构。 o 字典或类中的属性可以包括图书 ID、书名、作者、ISBN 号、出版 社、入库时间、借阅状态、借阅者信息等。

2. 数据存储: o 图书信息可以保存在内存中,通过 Python 的变量或数据结构进行 管理。 o 借阅和归还记录可以保存到文本文件或数据库中,以便后续查询 和分析。

3. 用户界面: o 提供命令行界面(CLI),通过终端与用户进行交互。 o 设计友好的交互提示和错误处理机制,确保用户能够方便地进行 操作。

4. 稳定性和安全性: o 注意异常处理,确保系统在遇到错误时能够妥善处理并给出提 示。 o 考虑数据备份和恢复机制,防止数据丢失或被篡改。

以下是代码细节(可以直接移植):

import datetime
import json
from typing import List, Dict# 图书类
class Book:def __init__(self, title: str, author: str, isbn: str, publisher: str, entry_date: str):self.id = None  # 书的唯一IDself.title = titleself.author = authorself.isbn = isbnself.publisher = publisherself.entry_date = entry_dateself.is_borrowed = Falseself.borrower_id = Noneself.borrow_date = None# 借阅记录类
class BorrowRecord:def __init__(self, book_id: int, borrower_id: str, borrow_date: str):self.book_id = book_idself.borrower_id = borrower_idself.borrow_date = borrow_dateself.return_date = None# 图书馆系统类
class LibrarySystem:def __init__(self):self.books: Dict[int, Book] = {}self.borrow_records: List[BorrowRecord] = []self.next_book_id = 1def add_book(self, title: str, author: str, isbn: str, publisher: str, entry_date: str):book = Book(title, author, isbn, publisher, entry_date)book.id = self.next_book_idself.books[self.next_book_id] = bookself.next_book_id += 1print(f"该书被添加以及其ID: {book.id}")def borrow_book(self, book_id: int, borrower_id: str):if book_id not in self.books:print("该书ID并未存在.")returnbook = self.books[book_id]if book.is_borrowed:print("很抱歉,此书已经被借阅.")returnbook.is_borrowed = Truebook.borrower_id = borrower_idbook.borrow_date = datetime.date.today().isoformat()borrow_record = BorrowRecord(book_id, borrower_id, book.borrow_date)self.borrow_records.append(borrow_record)print(f"该书被借阅: {book.title}")def return_book(self, book_id: int):if book_id not in self.books:print("该书ID并未存在.")returnbook = self.books[book_id]if not book.is_borrowed:print("该书未被借阅.")returnbook.is_borrowed = Falsefor record in self.borrow_records:if record.book_id == book_id and record.return_date is None:record.return_date = datetime.date.today().isoformat()breakprint(f"图书已被归还: {book.title}")def search_books(self, query: str):results = [book for book in self.books.values() if query.lower() in book.title.lower() or query.lower() in book.author.lower() or query.lower() in book.isbn]if results:for book in results:status = "已被借阅" if book.is_borrowed else "可以借阅"print(f"本书ID: {book.id}, 书名: {book.title}, 作者: {book.author}, 借阅状态: {status}")else:print("没有找到此书.")def query_borrow_records(self, book_id: int):if book_id not in self.books:print("抱歉,该书ID未存在.")returnrecords = [record for record in self.borrow_records if record.book_id == book_id]if records:for record in records:return_date = record.return_date if record.return_date else "抱歉,该书仍然未归还"print(f"借阅者 ID: {record.borrower_id}, 借阅时间: {record.borrow_date}, 归还日期: {return_date}")else:print("没有找到该书的借阅记录.")def save_data(self, filename: str):data = {"books": {book_id: book.__dict__ for book_id, book in self.books.items()},"borrow_records": [record.__dict__ for record in self.borrow_records]}with open(filename, 'w') as f:json.dump(data, f, indent=4)def load_data(self, filename: str):try:with open(filename, 'r') as f:data = json.load(f)self.books = {int(book_id): Book(**book_data) for book_id, book_data in data["books"].items()}self.borrow_records = [BorrowRecord(**record_data) for record_data in data["borrow_records"]]self.next_book_id = max(self.books.keys(), default=0) + 1except FileNotFoundError:print("未找到图书馆该类似文件,依旧空缺")class Visitor:def __init__(self, name, visitor_type):self.name = nameself.visitor_type = visitor_typedef __str__(self):return f"名字: {self.name}, 类型: {self.visitor_type}"# 继承借阅者类
class Borrower(Visitor):def __init__(self, name, borrowed_books=None):super().__init__(name, "借阅者")self.borrowed_books = borrowed_books if borrowed_books is not None else []def borrow_book(self, book):self.borrowed_books.append(book)def __str__(self):return super().__str__() + f", 借阅书籍: {', '.join(self.borrowed_books)}"# 管理者类
class Manager(Visitor):def __init__(self, name, responsibilities=None):super().__init__(name, "管理员")self.responsibilities = responsibilities if responsibilities is not None else []def add_responsibility(self, responsibility):self.responsibilities.append(responsibility)def __str__(self):return super().__str__() + f", 职责: {', '.join(self.responsibilities)}"class PeopleSystem:def __init__(self):self.visitors = []def add_visitor(self, visitor):self.visitors.append(visitor)def show_visitors(self):for visitor in self.visitors:print(visitor)def Login():People = PeopleSystem()ma = int(input("请问您是否为借阅者(1 是 / 0 否 ):"))if ma == 1:borrower = Borrower(name=input("请输入您的名字:"))People.add_visitor(borrower)else:manager = Manager(name=input("请输入您的名字:"))manager.add_responsibility(input("输入您的工作职责:"))People.add_visitor(manager)print("欢迎您的登录")def Books():ma = int(input("请问您是否为借阅者(1 是 / 0 否 ):"))print("""
------------------图书借阅系统v1.0-----------------------*1. 图书信息录入(管理员进行操作)     *2. 图书借阅*3. 图书归还*4. 图书查询*5. 借阅记录查询*6. 登录*7. 退出系统
--------------------------------------------------------""")choice = int(input("请输入您的选择:"))lib = LibrarySystem()if choice == 7:print("感谢您的使用")exit()if ma == 0:if choice == 1:print("""
--------------正在加入图书----------------------           """)title = input("请输入书名:")author = input("请输入作者名字:")isbn = input("请输入图书的ISBN号")publisher = input("请输入出版社:")entry_date = input("进入日期(例如:2024-4-26):")lib.add_book(title,author,isbn,publisher,entry_date)print("图书加入成功")else:print("操作失误哦")else:if choice == 1:print("您的操作越界哦")if choice == 2:book_id = int(input("请输入图书的ID号:"))borrower_id = input("请输入ID:")lib.borrow_book(book_id,borrower_id)elif choice == 3:book_id = int(input("请输入图书的ID号"))lib.return_book(book_id)print("感谢您的及时归还,祝您生活愉快")elif choice == 4:query = input("请输入您要查找的书籍名称")lib.search_books(query)elif choice == 5:filename = input("请输入您要查询的书的借阅记录")lib.save_data(filename)if __name__ == '__main__':Login()while(1):library = LibrarySystem()library.load_data('library_data.json')Books()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理后台

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 定义好数据模型,就可以配置管理后台了,按照如下代码编辑app1下面的admin.py文件: from django.contrib import a…

AI入门系列:工具篇之ChatGPT的优秀的国内替代品

文章目录 一,智谱清言(ChatGLM)1,智谱清言简介2,[智谱清言地址,点我开始用吧](https://chatglm.cn/) 二,Kimi智能助手1,Kimi简介2,[Kimi地址,点我开始用吧](https://kimi.moonshot.c…

.s文件的解析(AC78406芯片)

文章目录 1.堆栈初始化(1)2.预留字节,设置指令集架构THUMB3.RESET区域存储中断向量表3.1 Reset_Handler中断函数3.2 NMI_Handler等中断函数 4.堆栈初始化(2)是否使用MICROLIB库 1.堆栈初始化(1)…

vite开启主动暴露在ip地址(开启ip地址访问项目)

0.0.0.0是开启监听所有端口,可以配置成监听暴露指定端口如:10.10.10.54

小山菌_代码随想录算法训练营第三十三天| 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

452. 用最少数量的箭引爆气球 文档讲解:代码随想录.用最少数量的箭引爆气球 视频讲解:贪心算法,判断重叠区间问题 | LeetCode:452.用最少数量的箭引爆气球 状态:已完成 代码实现 class Solution { public:static bool…

Java技术栈总结:数据库MySQL篇

一、慢查询 1、常见情形 聚合查询 多表查询 表数据量过大查询 深度分页查询 2、定位慢查询 方案一、开源工具 调试工具:Arthas运维工具:Prometheus、Skywalking 方案二、MySQL自带慢日志 在MySQL配置文件 /etc/my.conf 中配置: # …

C++01

本专栏记录重读《C primer》的一些随笔&#xff0c;随便写写..... /*标准库的头文件使用<> &#xff0c;非标准库的头文件使用""。申明写在.h文件&#xff0c;定义实现写在.cpp文件 */ #include<iostream> using namespace std; int main() {int v1;st…

Javascript高级程序设计(第四版)--学习记录之集合引用类型(上)

Object 显示的创建Object的实例方法&#xff1a; new操作符和Object构造函数 let person new Object(); person.name Jason; person.age 42 对象字面量 let person { name:Jason, age:42} 存取属性的方法一般有两种&#xff1a;点语法和中括号。 let person { name:Jason,…

智能制造装备业项目数字化管理之多项目管理

在智能制造装备业中&#xff0c;多项目管理已经成为行业发展的核心驱动力。这种管理方式从全局的视角出发&#xff0c;对企业内同时推进的多个项目进行精细化的全生命周期管控。这不仅仅涉及单一项目的管理&#xff0c;还包括项目集和项目组合管理。 根据客户需求&#xff0c;一…

怎么区分Boombap 制作Boombap曲子教学 boombap音乐出现的时间

Boombap音乐作为嘻哈音乐文化的重要组成部分&#xff0c;具有独特的音乐节奏、样式和情感。要理解和区分Boombap音乐&#xff0c;需要从其音乐的历史渊源、音乐特征和文化影响入手。接下来给大家介绍怎么区分Boombap&#xff0c;制作Boombap曲子教学的具体内容。 一、怎么区分B…

c语言常用易错记录

c语言常用易错记录 文章目录 c语言常用易错记录1.for循环 1.for循环 示例&#xff1a; #include <stdio.h>int main() {int i;for (i 0; i < 10; i) {printf("%d\n", i);}return 0; }执行顺序 备注&#xff1a;此图来源于b站鹏哥C语言视频课截图&#xf…

python异常处理2

异常堆栈跟踪 有时需要知道更多异常信息时&#xff0c;可以打印堆栈跟踪信息。堆栈跟踪信息可以通过python内置模块 traceback 提供的 print_exc() 函数实现&#xff0c;print_exc() 函数的语法格式如下&#xff1a; traceback.print_exc(limit None, file None,chain Tru…

mailbox驱动框架设计

文章目录 mailbox 驱动设计一、mailbox控制器/client驱动设计二、编译实例三、测试总结 mailbox 驱动设计 Mailbox&#xff08;邮箱&#xff09;是一种在多核系统中用于处理器间通信的机制。它允许不同的核心或处理器之间发送和接收消息&#xff0c;通常用于协调任务、同步状态…

【学一点儿前端】iOS微信小程序在密码input框中使用系统保存的密码后,密码v-model绑定值不更新的问题

碰到问题 又双叕碰到阴间bug&#xff0c;这回碰到了一生之敌iOS产生的兼容性问题 在iOS11中&#xff0c;支持密码的快速填充。这让iOS用户在微信小程序进行登录的时候&#xff0c;可以把当前账号密码保存进系统密码箱&#xff0c;之后再次登录时&#xff0c;输入账号后点击密码…

【软件工程】【22.04】p2

关键字&#xff1a; 软件开发分本质及涉及问题、需求规约与项目需求不同、用况图概念包含模型元素及其关系、创建系统的用况模型RUP进行活动、软件生存周期&软件生存周期模型&软件项目过程管理关系、CMMI基本思想 模块结构图&#xff1a;作用域、控制域&#xff1b;语…

【Linux命令】top linux下的任务管理器

一、概述 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。top是一个动态显示过程&#xff0c;即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令&#xff0c;它将独占前台&#…

kafka 和Zookeeper 集群架构设计对比分析

kafka 和Zookeeper 集群架构设计对比分析 Kafka 和 Zookeeper 是两个关键的分布式系统组件,它们在集群架构设计上有显著的差异。 下面是对它们在集群架构设计方面的对比分析。 1. Kafka 集群架构设计 1.1 基本架构 Kafka 是一个分布式消息系统,由多个 Broker 组成。每个 …

rust 引用了Trait的实现,为什么还需要引入Trait 才能调用实现的方法

文章目录 1. Rust中结构体实现trait与方法调用的关系2. 要调用trait方法,有几种方式:3. code 1. Rust中结构体实现trait与方法调用的关系 在Rust中,当一个结构体实现了某个trait时,不能直接通过结构体调用trait中定义的方法。这是因为: trait方法不是结构体的固有方法。它们是…

文献阅读(307)AccelWattch

题目&#xff1a;AccelWattch: A Power Modeling Framework for Modern GPUs时间&#xff1a;2021会议&#xff1a;MICRO研究机构&#xff1a;西北大学 本篇论文的主要贡献&#xff1a; 提出了一个GPU功耗模型&#xff0c;考虑了DVFS, thread divergence, intra-warp function…

关于PHP中删除JSON指定元素unset和array_splice的区别

1. unset(mixed $var, mixed ...$vars): void unset 不会改变原有索引顺序 ------------------------- 2. array_splice( array &$array, int $offset, ?int $length null, mixed $replacement [] ): array array_splice 删除后&#xff0c;会重新排序…