diff --git a/book_manager.py b/book_manager.py new file mode 100644 index 0000000..07a5b8d --- /dev/null +++ b/book_manager.py @@ -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())}")