Project

General

Profile

Files » book_manager_system.py

UserName LastName, 06/16/2025 04:46 PM

 
# 定义一个图书类
import atexit
import os

import yaml


class Book:

# 使用构造函数,接收实例化类时需要传入的参数
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:

def __init__(self, filename='D:\\python脚本\\project_book\\book_data.yaml'):
# 定义一个实例变量,用来保存图书的信息,方便各个方法之间进行访问
# 把这个实例变量设置为私有,只能让类中方法对其进行操作
self.filename = filename
self.__books = []
atexit.register(self.save_data)
self.load_data()

def __menu(self):
'''
菜单函数:展示图书管理系统菜单信息,并获取用户输入
:return: 用户输入的编号字符串
'''
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 __get_bid(self):
'''
获取用户输入的图书编号
:return: 返回编号字符串
'''
bid = input("请输入图书编号:")
return bid

def __get_name(self):
'''
获取用户输入的名字
:return: 返回名字字符串
'''
name = input("请输入图书名字:")
return name

def __get_price(self):
'''
获取用户输入的价格
:return: 返回价格字符串
'''
while True:
price = input("请输入图书价格:")
if price.isdigit():
return int(price)
else:
print("输入价格不合法,请输入数字")

def __get_summary(self):
'''
获取用户输入的简介
:return: 返回简介字符串
'''
summary = input("请输入图书简介:")
return summary

def add_book(self, bid, name, price, summary):
'''
添加图书
:param bid: 图书编号 id
:param name: 图书名字
:param price: 图书价格
:param summary: 图书简介
:return: 操作提示信息
'''
for s in self.__books:
if s["bid"] == bid:
print("图书编号已存在,添加失败")
return "添加失败"
else:
book = Book(bid, name, price, summary)
self.__books.append({
'bid': bid,
'name': name,
'price': price,
'summary': summary
})
print(f"添加图书{book}成功")
return '添加成功'

def modify_book_by_id(self, bid, name, price, summary):
'''
通过编号修改图书信息
:param bid: 图书编号
:return: 操作提示信息
'''
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 "修改失败"

def delete_book_by_id(self, bid):
'''
通过ID删除图书信息
:param bid: 图书编号
:return: 操作提示信息
'''
for s in self.__books:
if s["bid"] == bid:
self.__books.remove(s)
print("删除成功")
return "删除成功"
else:
print(f'没有 {bid} 对应的学生信息')
return "删除失败"

def delete_book_by_name(self, name):
'''
通过图书名称 删除所有符合的图书
:param name: 图书名称
:return: 操作提示信息
'''
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 query_book_by_id(self, bid):
'''
通过编号查询图书信息
:param bid: 图书编号
:return: 操作提示信息
'''
for s in self.__books:
if s["bid"] == bid:
print(f"图书编号 {bid} 的图书信息如下:")
print(f"编号:{s['bid']},名字:{s['name']},价格:{s['price']},简介:{s['summary']}")
return "查询成功"
else:
print(f"图书编号 {bid} 的图书不存在")
return "查询失败"

def query_book_by_name(self, name):
'''
通过名字查询图书信息
:param name:
:return: 操作提示信息
'''
exist_s = []
for s in self.__books:
if s["name"] == name:
exist_s.append(s)

if len(exist_s) > 0:
print(f"名字为 {name} 的图书共 {len(exist_s)} 本,信息如下:")
for s in exist_s:
print(f"编号:{s['bid']},名字:{s['name']},价格:{s['price']},简介:{s['summary']}")
return "查询成功"
else:
print(f"名字为 {name} 的图书不存在")
return "查询失败"

def show(self):
'''
显示所有图书信息
:return: 格式化的图书信息
'''
print("所有图书信息如下:")
for s in self.__books:
print(f"编号:{s['bid']},姓名:{s['name']},价格:{s['price']},简介:{s['summary']}")

def save_data(self):
with open(self.filename, 'w') as f:
yaml.dump(self.__books, f)
print(f"数据已保存至 {self.filename}")

def load_data(self):
if os.path.exists(self.filename):
with open(self.filename) as f:
self.__books = yaml.safe_load(f) or []
print(f"成功从 {self.filename} 加载数据")
else:
self.__books = []
print("数据文件不存在,已初始化空列表")

def manager(self):
'''
管理方法
:return:
'''
while True:
select_op = self.__menu()
if len(select_op) == 1 and select_op in "12345678":
if select_op == "1":
bid = self.__get_bid()
name = self.__get_name()
age = self.__get_price()
gender = self.__get_summary()
self.add_book(bid, name, age, gender)
elif select_op == "2":
bid = self.__get_bid()
name = self.__get_name()
age = self.__get_price()
gender = self.__get_summary()
self.modify_book_by_id(bid, name, age, gender)
elif select_op == "3":
bid = self.__get_bid()
self.delete_book_by_id(bid)
elif select_op == "4":
name = self.__get_name()
self.delete_book_by_name(name)
elif select_op == "5":
bid = self.__get_bid()
self.query_book_by_id(bid)
elif select_op == "6":
name = self.__get_name()
self.query_book_by_name(name)
elif select_op == "7":
self.show()
else:
break
else:
print("输入的数据不合法,请输入在合法范围内的操作编号!!!")


# 程序入口
if __name__ == '__main__':
# 获取图书管理系统实例
bm = BookManagement()
# 通过实例调用实例方法
bm.manager()
(404-404/437)