当前位置:   article > 正文

用Python来简单实现图书管理系统程序设计_图书信息管理系统设计python

图书信息管理系统设计python

一、对问题进行需求分析

1、功能需求:

(1)借书、还书

(2)实现增删查改

(3)根据作者名称或专业领域检索书籍

(4)找出借走某本书的读者

2、质量需求:
根据上述描述,可以确定以下质量需求
(1)安全性:系统对数据进行安全存储和传输,不受任何非法访问、修改、破坏等安全威胁。
(2)可靠性:系统能够长时间连续运行,不会频繁崩溃、死机,能够及时响应用户请求,保证数据处理!的准确性和完整性。
(3)可用性:系统界面友好、操作简单、响应迅速能够满足用户日常使用的要求,提升用户体验。

3、约束需求:
根据上述描述,可以确定以下约束需求:
(1)未借出的书籍必须能够供读者随时借阅。
(2)同一时刻,一本书不能既被借出,又可供借阅

(3)一个读者一次借出的书籍数目不能超过预定值。

(叠个buff:笨人普通大学生,如有不完善的地方轻喷)

二、代码实现

    一、导入需要的库     

      首先可以肯定的是,我们需要创建一个交互界面,来实现对功能的实现,这就需要tkinter库来实现设计交互界面的功能。同时,借阅书籍需要对时间进行记录,我们导入datetime库来进行对时间的记录。

  1. import tkinter as tk
  2. from tkinter import simpledialog, messagebox, ttk
  3. import datetime

    二、设立类         

      图书管理系统,并且拥有管理员和读者身份,需要一个User与Library,作为后续设立Library GUI的前置条件。

  1. class User:
  2. def __init__(self, name, role):
  3. self.name = name
  4. self.role = role # "admin" 或 "reader"

     这样我们就建立好了使用者的名称与角色,并根据角色的不同来拥有不同的权限。

  1. class Library:
  2. def __init__(self):
  3. self.books = {}
  4. self.borrowed_books = {}
  5. self.max_borrow_limit = 3
  6. self.users = {"admin": User("admin", "admin"), "reader": User("reader", "reader")}
  7. self.current_user = None

     在这里,我们定义了最大的借书数量是3本,并且设定了两个使用者的角色,分别是admin和reader,并且令当前用户不存在,来实现后续的登录功能。

    一、登录界面的设计

  1. def login(self, username):
  2. if username in self.users:
  3. self.current_user = self.users[username]
  4. return True
  5. return False

      设定一个login函数,当输入的用户名存在我们设置的self.users当中,将current_user替换为我们登录的用户,允许进行接下来的操作,否则报错。

    二、退出界面的设计

  1. def logout(self):
  2. self.current_user = None
  3. return True

       直接把当前用户置空,并返回真值,回到登录界面

   三、实现增删查改的设计

       不进行过多赘述,直接上代码(笨人会写但是讲不明白QvQ)

  1. def add_book(self, title, quantity, author="", field=""):
  2. if title not in self.books:
  3. self.books[title] = {"quantity": 0, "author": author, "field": field}
  4. self.books[title]["quantity"] += quantity
  5. def remove_book(self, title, quantity=1):
  6. if title in self.books and self.books[title]["quantity"] >= quantity:
  7. self.books[title]["quantity"] -= quantity
  8. if self.books[title]["quantity"] == 0:
  9. del self.books[title]
  10. return True
  11. return False
  12. def borrow_book(self, title, reader):
  13. if title in self.books and self.books[title]["quantity"] > 0:
  14. if len([b for b in self.borrowed_books if self.borrowed_books[b]["reader"] == reader]) >= self.max_borrow_limit:
  15. return False
  16. self.books[title]["quantity"] -= 1
  17. self.borrowed_books[title] = {"reader": reader, "date": datetime.date.today()}
  18. return True
  19. return False
  20. def return_book(self, title, reader):
  21. if title in self.borrowed_books and self.borrowed_books[title]["reader"] == reader:
  22. self.books[title]["quantity"] += 1
  23. del self.borrowed_books[title]
  24. return True
  25. return False
  26. def get_stock_info(self):
  27. if not self.books:
  28. return "当前图书库存为空。"
  29. message = "当前图书库存总量:\n"
  30. for title in self.books:
  31. message += f"《{title}》:{self.books[title]['quantity']} 本\n"
  32. return message.strip()
  33. def search_books(self, author="", field=""):
  34. result = {}
  35. for title, details in self.books.items():
  36. if author and details["author"].lower() == author.lower() or field and details["field"].lower() == field.lower():
  37. result[title] = details
  38. return result
  39. def get_books_by_reader(self, reader):
  40. return [title for title, borrow_details in self.borrowed_books.items() if borrow_details['reader'] == reader]

   四、设置LibraryGUI类

    在这里我们要设置交互界面,并设置实现我们刚刚在Library中创建的函数,用ttk.Button来创建功能按钮。

  1. class LibraryGUI:
  2. def __init__(self, root, library):
  3. self.library = library
  4. self.root = root
  5. self.root.title("图书管理系统")
  6. self.root.geometry("800x600")
  7. self.login_screen()
  8. def login_screen(self):
  9. self.clear_ui()
  10. username = simpledialog.askstring("登录", "请输入您的用户名:")
  11. if username and self.library.login(username):
  12. self.init_ui()
  13. else:
  14. messagebox.showerror("登录失败", "用户名不正确。")
  15. # 登录失败后,再次显示登录界面
  16. self.login_screen()
  17. def init_ui(self):
  18. # 根据当前用户角色初始化UI
  19. if self.library.current_user.role == "admin":
  20. # 为管理员显示的按钮
  21. ttk.Button(self.root, text="添加图书", command=self.add_book).pack(fill=tk.X, pady=5)
  22. ttk.Button(self.root, text="删除图书", command=self.remove_book_gui).pack(fill=tk.X, pady=5)
  23. ttk.Button(self.root, text="借书", command=self.borrow_book).pack(fill=tk.X, pady=5)
  24. ttk.Button(self.root, text="还书", command=self.return_book).pack(fill=tk.X, pady=5)
  25. ttk.Button(self.root, text="库存统计", command=self.count_books).pack(fill=tk.X, pady=5)
  26. ttk.Button(self.root, text="显示所有借书记录", command=self.show_all_borrows).pack(fill=tk.X, pady=5)
  27. ttk.Button(self.root, text="退出", command=self.logout).pack(fill=tk.X, pady=5)
  28. # 为所有用户显示的按钮
  29. if self.library.current_user.role == "reader":
  30. ttk.Button(self.root,text="我的借书记录",command=self.show_my_borrows).pack(fill=tk.X, pady=5)
  31. ttk.Button(self.root, text="搜索图书", command=self.search_books).pack(fill=tk.X, pady=5)
  32. ttk.Button(self.root, text="退出", command=self.logout).pack(fill=tk.X, pady=5)
  33. def add_book(self):
  34. title = simpledialog.askstring("添加图书", "书名:")
  35. if title:
  36. author = simpledialog.askstring("添加图书", "作者:")
  37. field = simpledialog.askstring("添加图书", "领域:")
  38. quantity = simpledialog.askinteger("添加图书", "数量:", minvalue=1)
  39. self.library.add_book(title, quantity, author, field)
  40. messagebox.showinfo("成功", "成功添加图书。")
  41. def remove_book_gui(self):
  42. title = simpledialog.askstring("删除图书", "书名:")
  43. if title:
  44. quantity = simpledialog.askinteger("删除图书", "数量:", minvalue=1)
  45. if self.library.remove_book(title, quantity):
  46. messagebox.showinfo("成功", "图书删除成功。")
  47. else:
  48. messagebox.showerror("失败", "图书删除失败,请检查书名和数量是否正确。")
  49. def borrow_book(self):
  50. title = simpledialog.askstring("借书", "书名:")
  51. if title:
  52. reader = simpledialog.askstring("借书", "读者姓名:")
  53. if reader and self.library.borrow_book(title, reader):
  54. messagebox.showinfo("成功", "借书成功。")
  55. else:
  56. messagebox.showerror("失败", "借书失败。")
  57. def return_book(self):
  58. title = simpledialog.askstring("还书", "书名:")
  59. if title:
  60. reader = simpledialog.askstring("还书", "读者姓名:")
  61. if reader and self.library.return_book(title, reader):
  62. messagebox.showinfo("成功", "还书成功。")
  63. else:
  64. messagebox.showerror("失败", "还书失败。")
  65. def count_books(self):
  66. info = self.library.get_stock_info()
  67. messagebox.showinfo("库存统计", info)
  68. def show_all_borrows(self):
  69. message = "当前借书记录:\n"
  70. for title, details in self.library.borrowed_books.items():
  71. message += f"书名:{title}, 借阅者:{details['reader']}, 借阅日期:{details['date']}\n"
  72. messagebox.showinfo("借书记录", message or "当前没有借书记录。")
  73. def show_my_borrows(self):
  74. message = "当前借书记录:\n"
  75. for title, details in self.library.borrowed_books.items():
  76. message += f"书名:{title}, 借阅者:{details['reader']}, 借阅日期:{details['date']}\n"
  77. messagebox.showinfo("借书记录", message or "当前没有借书记录。")
  78. def search_books(self):
  79. title = simpledialog.askstring("搜索图书","书名(可留空):")
  80. author = simpledialog.askstring("搜索图书", "作者(可留空):")
  81. field = simpledialog.askstring("搜索图书", "领域(可留空):")
  82. result = self.library.search_books(author, field)
  83. if result:
  84. message = "搜索结果:\n"
  85. for title, details in result.items():
  86. message += f"《{title}》:{details['quantity']} 本,作者:{details['author']},领域:{details['field']}\n"
  87. messagebox.showinfo("搜索结果", message)
  88. else:
  89. messagebox.showinfo("搜索结果", "没有找到匹配的图书。")
  90. def logout(self):
  91. # 清除界面
  92. self.clear_ui()
  93. # 调用library的logout方法重置用户状态
  94. self.library.logout()
  95. # 重新显示登录界面
  96. self.login_screen()
  97. def clear_ui(self):
  98. # 清除当前root上的所有widget
  99. for widget in self.root.winfo_children():
  100. widget.destroy()

     我们最后用logout与clear_ui函数来实现返回到登录界面,用messagebox函数来实现对话框的内容提示,simpledialog函数来获取我们输入的信息

五、最后的实现

  1. def main():
  2. root = tk.Tk()
  3. library = Library()
  4. app = LibraryGUI(root, library)
  5. root.mainloop()
  6. if __name__ == "__main__":
  7. main()

三、功能视频

屏幕录制 2024-05-05 224631

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/827923
推荐阅读
相关标签
  

闽ICP备14008679号