|
|
|
|
@ -0,0 +1,180 @@
|
|
|
|
|
import json
|
|
|
|
|
import os
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
class BookManager:
|
|
|
|
|
"""图书管理类,负责图书信息的增删改查操作"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, data_file='books.json'):
|
|
|
|
|
"""初始化图书管理器,加载已有图书数据"""
|
|
|
|
|
self.data_file = data_file
|
|
|
|
|
self.books = self._load_books()
|
|
|
|
|
|
|
|
|
|
def _load_books(self):
|
|
|
|
|
"""从文件加载图书数据"""
|
|
|
|
|
if os.path.exists(self.data_file):
|
|
|
|
|
try:
|
|
|
|
|
with open(self.data_file, 'r', encoding='utf-8') as f:
|
|
|
|
|
return json.load(f)
|
|
|
|
|
except (json.JSONDecodeError, IOError) as e:
|
|
|
|
|
print(f"加载图书数据失败: {e}")
|
|
|
|
|
return []
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
def _save_books(self):
|
|
|
|
|
"""将图书数据保存到文件"""
|
|
|
|
|
try:
|
|
|
|
|
with open(self.data_file, 'w', encoding='utf-8') as f:
|
|
|
|
|
json.dump(self.books, f, ensure_ascii=False, indent=2)
|
|
|
|
|
return True
|
|
|
|
|
except IOError as e:
|
|
|
|
|
print(f"保存图书数据失败: {e}")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def add_book(self, isbn, title, author, category, quantity=1):
|
|
|
|
|
"""
|
|
|
|
|
添加新图书
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
isbn (str): 图书ISBN编号
|
|
|
|
|
title (str): 图书标题
|
|
|
|
|
author (str): 图书作者
|
|
|
|
|
category (str): 图书分类
|
|
|
|
|
quantity (int): 图书数量,默认为1
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
bool: 添加成功返回True,失败返回False
|
|
|
|
|
"""
|
|
|
|
|
# 检查ISBN是否已存在
|
|
|
|
|
for book in self.books:
|
|
|
|
|
if book['isbn'] == isbn:
|
|
|
|
|
print(f"错误: ISBN为 {isbn} 的图书已存在")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
new_book = {
|
|
|
|
|
'isbn': isbn,
|
|
|
|
|
'title': title,
|
|
|
|
|
'author': author,
|
|
|
|
|
'category': category,
|
|
|
|
|
'quantity': quantity,
|
|
|
|
|
'available': quantity, # 可借阅数量
|
|
|
|
|
'added_date': datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.books.append(new_book)
|
|
|
|
|
return self._save_books()
|
|
|
|
|
|
|
|
|
|
def search_books(self, keyword=None, category=None, author=None):
|
|
|
|
|
"""
|
|
|
|
|
搜索图书
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
keyword (str): 标题或ISBN中的关键词
|
|
|
|
|
category (str): 图书分类
|
|
|
|
|
author (str): 作者名
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
list: 符合条件的图书列表
|
|
|
|
|
"""
|
|
|
|
|
results = []
|
|
|
|
|
|
|
|
|
|
for book in self.books:
|
|
|
|
|
match = True
|
|
|
|
|
|
|
|
|
|
if keyword and keyword not in book['title'] and keyword not in book['isbn']:
|
|
|
|
|
match = False
|
|
|
|
|
if category and book['category'] != category:
|
|
|
|
|
match = False
|
|
|
|
|
if author and author not in book['author']:
|
|
|
|
|
match = False
|
|
|
|
|
|
|
|
|
|
if match:
|
|
|
|
|
results.append(book)
|
|
|
|
|
|
|
|
|
|
return results
|
|
|
|
|
|
|
|
|
|
def update_book(self, isbn, **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
更新图书信息
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
isbn (str): 图书ISBN编号
|
|
|
|
|
** kwargs: 要更新的字段,如title, author, category, quantity等
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
bool: 更新成功返回True,失败返回False
|
|
|
|
|
"""
|
|
|
|
|
for book in self.books:
|
|
|
|
|
if book['isbn'] == isbn:
|
|
|
|
|
# 计算可借阅数量的变化
|
|
|
|
|
if 'quantity' in kwargs:
|
|
|
|
|
quantity_change = kwargs['quantity'] - book['quantity']
|
|
|
|
|
book['available'] += quantity_change
|
|
|
|
|
|
|
|
|
|
# 更新字段
|
|
|
|
|
for key, value in kwargs.items():
|
|
|
|
|
if key in book:
|
|
|
|
|
book[key] = value
|
|
|
|
|
|
|
|
|
|
return self._save_books()
|
|
|
|
|
|
|
|
|
|
print(f"错误: 未找到ISBN为 {isbn} 的图书")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def delete_book(self, isbn):
|
|
|
|
|
"""
|
|
|
|
|
删除图书
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
isbn (str): 图书ISBN编号
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
bool: 删除成功返回True,失败返回False
|
|
|
|
|
"""
|
|
|
|
|
initial_count = len(self.books)
|
|
|
|
|
self.books = [book for book in self.books if book['isbn'] != isbn]
|
|
|
|
|
|
|
|
|
|
if len(self.books) < initial_count:
|
|
|
|
|
return self._save_books()
|
|
|
|
|
|
|
|
|
|
print(f"错误: 未找到ISBN为 {isbn} 的图书")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def get_book_details(self, isbn):
|
|
|
|
|
"""获取图书详细信息"""
|
|
|
|
|
for book in self.books:
|
|
|
|
|
if book['isbn'] == isbn:
|
|
|
|
|
return book
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def list_all_books(self):
|
|
|
|
|
"""列出所有图书"""
|
|
|
|
|
return self.books
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 示例用法
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
manager = BookManager()
|
|
|
|
|
|
|
|
|
|
# 添加示例图书
|
|
|
|
|
manager.add_book("9780134685991", "Effective Python", "Brett Slatkin", "Programming", 5)
|
|
|
|
|
manager.add_book("9780596007126", "Head First Design Patterns", "Eric Freeman", "Programming", 3)
|
|
|
|
|
manager.add_book("9780141988511", "Sapiens: A Brief History of Humankind", "Yuval Noah Harari", "History", 4)
|
|
|
|
|
|
|
|
|
|
print("所有图书:")
|
|
|
|
|
for book in manager.list_all_books():
|
|
|
|
|
print(f"{book['title']} by {book['author']} (ISBN: {book['isbn']}) - 可借: {book['available']}/{book['quantity']}")
|
|
|
|
|
|
|
|
|
|
print("\n搜索编程类图书:")
|
|
|
|
|
programming_books = manager.search_books(category="Programming")
|
|
|
|
|
for book in programming_books:
|
|
|
|
|
print(f"- {book['title']}")
|
|
|
|
|
|
|
|
|
|
print("\n更新图书数量:")
|
|
|
|
|
manager.update_book("9780134685991", quantity=7)
|
|
|
|
|
book = manager.get_book_details("9780134685991")
|
|
|
|
|
print(f"更新后数量: {book['available']}/{book['quantity']}")
|
|
|
|
|
|
|
|
|
|
print("\n删除图书:")
|
|
|
|
|
manager.delete_book("9780596007126")
|
|
|
|
|
print(f"删除后剩余图书数量: {len(manager.list_all_books())}")
|