图书管理系统 作业 OOP
图书管理系统
项目简介
随着图书馆的规模变大,管理的图书越来越多,相应的管理越来越难。
图书管理系统旨在提供一个简洁、高效的解决方案,用于管理图书馆中图书信息。该系统将支持图书数据的增删改查操作,并以科学化、系统化和规范化的方式维护信息。
实现方式
以面向对象思想及方式完成代码开发。
知识点
- 输入和输出
- 变量
- 列表
- 字符串
- 流程控制
- 面向对象概念
- 类和对象
- 实例属性
- 实例方法
- 访问控制权限
- 初始化方法
- 对象描述方法
- 文件处理
实战思路
项目要求
-
定义图书类
Book
,图书信息包含:- 编号:
bid
- 书名:
name
- 价格:
price
- 简介:
summary
- 编号:
-
实现构造方法及对象描述方法
__init__
: 初始化方法,接收对应参数初始化对象属性__str__
: 实现对象描述方法,输出图书信息
-
定义管理类
BookManagement
,用来实现整体业务逻辑。- 使用列表做为属性保存图书对象信息
-
定义
manager
方法管理业务逻辑- 对用户输入内容进行输入校验
- 根据用户输入内容选择不同功能执行
-
实现菜单方法
__menu
,输出下列菜单信息,并返回用户输入的编号print("*****************************") print("* 图书管理系统 *") print("* 1. 添加新图书信息 *") print("* 2. 通过编号修改图书信息 *") print("* 3. 通过编号删除图书信息 *") print("* 4. 通过书名删除图书信息 *") print("* 5. 通过编号查询图书信息 *") print("* 6. 通过书名查询图书信息 *") print("* 7. 显示所有图书信息 *") print("* 8. 退出系统 *") print("*****************************")
-
因程序中需要多次对编号及书名进行输入,故抽取方法获取对应的数据。
- 获取编号方法
__getBid
, 输入编号并返回(字符串类型)eg. b01
- 获取书名方法
__getName
, 输入书名并返回(字符串类型) - 获取书名方法
__getPrice
, 输入价格并返回(整型) - 获取书名方法
__getSummary
, 输入简介并返回(字符串类型)
- 获取编号方法
-
实现添加图书方法
addBook
- 方法参数为
编号
,书名
,价格
,简介
四个参数 - 输出添加操作的结果提示信息
- 返回对应结果信息
- 要求编号不可重复。
- 方法参数为
-
实现通过编号修改图书信息方法
modifyBookByID
- 参数为
编号
- 如果图书存在,则进行修改,不存在输出提示信息
- 返回是否修改成功
- 参数为
-
实现通过编号删除图书方法
deleteBookByID
- 参数为
编号
- 如果图书存在,则进行删除并输出提示信息,不存在则仅输出提示
- 返回是否删除成功
- 参数为
-
实现通过书名删除图书方法
deleteBookByName
- 参数为
书名
- 如果图书存在,则进行删除(同名图书全部删除)并输出提示信息,不存在则仅输出提示
- 返回是否删除成功
- 参数为
-
实现通过编号查询图书方法
queryBookByID
- 参数为
编号
- 如果图书存在,则输出图书信息,不存在输出提示信息
- 返回是否查询成功
- 参数为
-
实现通过书名查询图书方法
queryBookByName
- 参数为
书名
- 如果图书存在,则输出图书信息(同名图书全部输出),不存在输出提示信息
- 返回是否查询成功
- 参数为
-
实现显示所有图书信息方法
__show
- 输出所有图书信息
-
实现数据存储方法
save_data
- 在退出系统时,将数据保存到
data.txt
文件中 - 数据保存格式自定义
- 在退出系统时,将数据保存到
-
实现数据加载方法
load_data
- 如果数据文件
data.txt
存在,则从文件中加载数据 - 如果文件不存在则初始为空
- 如果数据文件
实现代码
# 定义一个图书类
class Book(object):
def __init__(self, bid, name, price, summary):
self.bid = bid
self.name = name
self.price = price
self.summary = summary
# 重写对象的显示格式 方法
def __str__(self):
return f"BID: {self.bid} --- Name: {self.name} --- Price: {self.price} --- Summary: {self.summary}"
# 封装管理类
class BookManagement(object):
def __init__(self):
# 定义一个全局变量,用来保存图书的信息,方法各个方法之间进行访问
self.books = []
self.load_data()
# 菜单方法
def __menu(self):
print("****************************************")
print("* 图书管理系统 *")
print("* 1. 添加新图书信息 *")
print("* 2. 通过图书编号修改图书信息 *")
print("* 3. 通过图书编号删除图书信息 *")
print("* 4. 通过图书名称删除图书信息 *")
print("* 5. 通过图书编号查询图书信息 *")
print("* 6. 通过图书名称查询图书信息 *")
print("* 7. 显示所有图书信息 *")
print("* 8. 退出系统 *")
print("****************************************")
select_op = input("输入编号选择操作:")
return select_op
# 获取图书编号
def __getBid(self):
bid = input("请输入图书ID:")
return bid
# 获取名称
def __getName(self):
name = input("请输入图书名称:")
return name
# 获取价格
def __getPrice(self):
while True:
price = input("请输入图书价格:")
if price.isdigit():
return int(price)
else:
print("输入价格不合法,请输入数字")
# 获取简介
def __getSummary(self):
summary = input("请输入图书简介:")
return summary
# 添加图书
def addBook(self, bid, name, price, summary):
for s in self.books:
if s.bid == bid:
print("图书编号已存在,添加失败")
return "添加失败"
else:
book = Book(bid, name, price, summary)
self.books.append(book)
print("添加图书信息成功")
return '添加成功'
# 通过图书编号修改图书信息
def modifyBookByID(self, bid, name, price, summary):
for s in self.books:
if s.bid == bid:
s.name = name
s.price = price
s.summary = summary
print("修改成功")
return "修改成功"
else:
print(f'没有 {bid} 对应的图书信息')
return "修改失败"
# 通过ID删除图书信息
def deleteBookByID(self, bid):
for s in self.books:
if s.bid == bid:
self.books.remove(s)
print("删除成功")
return "删除成功"
else:
print(f'没有 {bid} 对应的图书信息')
return "删除失败"
# 通过图书名称 删除所有符合的图书
def deleteBookByName(self, name):
exist_s = []
# 找出所有要删除的图书
for s in self.books:
if s.name == name:
exist_s.append(s)
# 开始删除
if len(exist_s) > 0:
for s in exist_s:
self.books.remove(s)
print(f"名称为 { name } 的图书删除成功")
else:
print(f"成功删除 {len(exist_s)} 个图书")
return "删除成功"
else:
print(f"图书【{name}】不存在,无法删除")
return "删除失败"
# 通过图书编号查询图书信息
def queryBookByID(self, bid):
for s in self.books:
if s.bid == bid:
print(f"图书编号 {bid} 的图书信息如下:")
print(s)
return "查询成功"
else:
print(f"图书编号 {bid} 的图书不存在")
return "查询失败"
# 通过名称查询图书信息
def queryBookByName(self, name):
result = []
for s in self.books:
if s.name == name:
result.append(s)
if len(result) > 0:
print(f"名称为 {name} 的图书共 {len(result)} 名,信息如下:")
for s in result:
print(s)
return "查询成功"
else:
print(f"名称为 {name} 的图书不存在")
return "查询失败"
# 显示所有图书信息
def __show(self):
print("所有图书信息如下:")
for s in self.books:
print(s)
# 加载文件
def load_data(self):
print("数据从文件加载完毕!!")
# 判断文件是否存在
if os.path.exists("books.txt"):
with open("books.txt", "r") as file:
content = file.read()
content = content.split("\n")
content.remove("")
for line in content:
line = line.split("-")
book = {}
book["bid"] = line[0]
book["name"] = line[1]
book["price"] = int(line[2])
book["summary"] = line[3]
self.books.append(book)
# 保存文件
def save_data(self):
print("将数据写入文件保存完毕!!")
with open("books.txt", "w") as file:
for book in self.books:
# 使用 - 做为间隔符拼接所有的数据
book = list(book.values())
book = [str(el) for el in book]
bookStr = "-".join(book) + '\n'
file.write(bookStr)
# 管理方法
def manpricer(self):
while True:
select_op = self.__menu()
if len(select_op) == 1 and select_op in "12345678":
if select_op == "1":
bid = self.__getBid()
name = self.__getName()
price = self.__getPrice()
summary = self.__getSummary()
self.addBook(bid, name, price, summary)
elif select_op =="2":
bid = self.__getBid()
name = self.__getName()
price = self.__getPrice()
summary = self.__getSummary()
self.modifyBookByID(bid, name, price, summary)
elif select_op =="3":
bid = self.__getBid()
self.deleteBookByID(bid)
elif select_op =="4":
name = self.__getName()
self.deleteBookByName(name)
elif select_op =="5":
bid = self.__getBid()
self.queryBookByID(bid)
elif select_op =="6":
name = self.__getName()
self.queryBookByName(name)
elif select_op =="7":
self.__show()
else:
self.save_data()
break
else:
print("输入的数据不合法,请输入在合法范围内的操作编号!!!")
# 程序入口
if __name__ == '__main__':
BookManpricement().manpricer()