在Python的期末大作业中,各种管理系统是非常常见的,如学生管理系统、图书管理系统等。无论是什么管理系统,其核心无非就是“数据操作+用户交互”的组合,现在作者通过一篇文章来讲清如何用python来实现这类项目。
1.实现思路
1.1 管理系统的核心
不管是什么管理系统,本质都是对一类“数据对象”做“CRUD操作”(增、删、改、查),同时确保数据不会丢失。
首先,什么是数据对象?学生管理系统中的“学生”、图书管理系统中的“书”都是数据对象。
所谓的CRUD操作就是对数据对象中的某个属性进行增、删、改、查四个操作。如在图书管理系统中增加一本书,或者修改某本书的数量、价格等。
当管理系统完成了一次CRUD操作后当然需要将数据保存到一个文件中,不然关掉程序后数据会丢失,总不能每次打开都要重新录入数据,所以这里还涉及到了文件操作。
1.2明确需求
这里作者使用图书管理系统为例来讲解。
首先我们来列清需要实现的功能:
对于借阅者来说,应该实现以下基础功能:
- 借阅
- 归还
- 查询
对于管理人员来说,应该实现以下基础功能:
- 增加图书
- 删除图书
- 修改图书信息(数量等)
这里因为仅用于讲解这类项目如何实现,所以只实现基本功能。
1.3 框架搭建
在明确了系统功能需求后,我们进入代码实现的设计阶段。核心思路是采用面向对象编程(OOP)来组织代码,确保结构清晰、可扩展性强。具体框架设计如下:
-
用户角色划分:系统用户分为借阅者和管理员两类。借阅者负责图书借阅、归还和查询操作;管理员负责增加图书、删除图书和修改图书信息操作。
-
核心类设计:
- Book类:用于封装图书数据对象,属性包括图书ID、名称、作者、数量等,并实现基本的数据操作方法(如更新数量)。
- Borrower类(借阅者):实现借阅、归还和查询功能。
- Admin类(管理员):实现增加图书、删除图书和修改图书信息功能。
-
数据持久化:所有操作后的数据需保存到文件(如JSON或CSV格式),避免数据丢失。
这种框架设计不仅符合CRUD操作逻辑,还便于后续功能扩展(如添加日志或权限管理)。
2.代码实现
- Book类
class Book: def __init__(self, isbn, name, author, quantity): self.isbn = isbn # 书的唯一编号 self.name = name # 书名 self.author = author # 作者 self.quantity = quantity # 数量 def to_dict(self): """转换为字典,用于JSON序列化,返回一个包含图书信息的字典""" return { "isbn": self.isbn, "name": self.name, "author": self.author, "quantity": self.quantity } @classmethod def from_dict(cls, data): """从字典创建对象,用于JSON反序列化,从字典创建Book对象""" return cls( isbn=data["isbn"], name=data["name"], author=data["author"], quantity=data["quantity"] ) - Borrower类
class Borrower: def __init__(self, books): self.books = books # 直接操作内存中的图书列表(后续保存到文件) def query_book(self, isbn=None, name=None): # 遍历所有图书,找到id或书名符合条件的所有结果 results = [] for book in self.books: match_id = (isbn is None) or (book.isbn == isbn) match_name = (name is None) or (book.name == name) if match_id and match_name: results.append(book) return results def borrow_book(self, isbn, num=1): # 首先遍历所有图书,然后找到isbn字段相同的图书 for book in self.books: if book.isbn == isbn: # 借出时需要防止数量不足 if book.quantity >= num and book.quantity > 0: book.quantity -= num save_books(self.books) print(f"成功借阅 {num} 本《{book.name}》") return True else: print("图书库存不足,无法借阅") return False print("未找到指定ID的图书") return False def return_book(self, isbn, num=1): # 归还时同样遍历所有图书,确定是否是该系统内存在的书,然后再进行归还操作 for book in self.books: if book.isbn == isbn: book.quantity += num save_books(self.books) print(f"成功归还 {num} 本《{book.name}》") return True print("未找到指定ID的图书") return False - Admin类
class Admin: def __init__(self, books): self.books = books def add_book(self, isbn, name, author, quantity): for book in self.books: # 如果新书的id已经存在,说明这本书已经被收录,不能实现添加操作 if book.isbn == isbn: print("该图书ID已存在,无法添加") return False new_book = Book(isbn, name, author, quantity) self.books.append(new_book) save_books(self.books) print("图书添加成功") return True def delete_book(self, isbn): # 删除时需要确认这个id的书是否存在 for book in self.books: if book.isbn == isbn: # 如果存在则执行删除操作 self.books.remove(book) save_books(self.books) print("图书删除成功") return True print("未找到指定ID的图书") return False def modify_book(self, isbn, name=None, author=None, quantity=None): """修改图书信息""" for book in self.books: if book.isbn == isbn: if name: book.name = name if author: book.author = author if quantity is not None: # 允许数量为0,所以用is not None判断 book.quantity = quantity save_books(self.books) print("图书信息修改成功") return True print("未找到指定ID的图书") return False
基本的几个类实现后,创建用于保存和加载数据的函数:
DATA_FILE = "books.json" # 设置一个用于存放数据的json文件路径
def load_books():
"""加载图书数据,无文件时返回空列表"""
try:
with open(DATA_FILE, "r", encoding="utf-8") as f:
return [Book.from_dict(book_dict) for book_dict in json.load(f)]
except FileNotFoundError:
return []
def save_books(books):
"""保存图书数据到JSON文件"""
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(
[book.to_dict() for book in books],
f,
ensure_ascii=False,
indent=2
)
然后写一个主函数用于启动程序,这里我们使用一个while循环来实现持续操作,进入系统后给用户一个选择身份的菜单,然后通过用户的选择进入子循环,然后在子循环中实现不同用户的具体操作。
# 主函数的大致框架
def main():
while True:
# 输出菜单
# 1 借阅者;2 管理者;3 退出
# 接收用户的选择(1/2/3)
choice = input()
if choice == '1':
while True:
# 输出对应的菜单
# 接收用户的选择
# 根据选择进入不同的分支完成对应的操作
pass
elif choice == '2':
while True:
# 输出对应的菜单
# 接收用户的选择
# 根据选择进入不同的分支完成对应的操作
pass
elif choice == '3':
exit()
else:
print("选择错误")
下面是完整代码:
def main():
books = load_books() # 加载初始数据
while True:
print("\n======================")
print(" 图书管理系统菜单 ")
print("======================")
print("1. 以借阅者身份登录")
print("2. 以管理员身份登录")
print("3. 退出系统")
choice = input("请输入选择(1/2/3):")
if choice == "1":
borrower = Borrower(books)
while True:
print("\n------ 借阅者操作 ------")
print("1. 查询图书(按ID/名称)")
print("2. 借阅图书")
print("3. 归还图书")
print("4. 返回上一级")
sub_choice = input("请输入操作(1/2/3/4):")
if sub_choice == "1":
# 查询功能:支持ID和名称模糊查询(空输入则忽略)
book_id = input("图书ID(可选,回车跳过):").strip() or None
name = input("图书名称(可选,回车跳过):").strip() or None
results = borrower.query_book(book_id, name)
if results:
print("\n查询结果:")
for book in results:
print(f"ID: {book.isbn} | 名称: {book.name} | 作者: {book.author} | 库存: {book.quantity}")
else:
print("未找到符合条件的图书")
elif sub_choice == "2":
# 借阅功能
book_id = input("要借阅的图书ID:")
num = input("借阅数量(默认1):").strip()
num = int(num) if num else 1 # 空输入则默认借1本
borrower.borrow_book(book_id, num)
elif sub_choice == "3":
# 归还功能
book_id = input("要归还的图书ID:")
num = input("归还数量(默认1):").strip()
num = int(num) if num else 1 # 空输入则默认还1本
borrower.return_book(book_id, num)
elif sub_choice == "4":
break # 返回上一级菜单
else:
print("无效选项,请重新输入")
elif choice == "2":
admin = Admin(books)
while True:
print("\n------ 管理员操作 ------")
print("1. 新增图书")
print("2. 删除图书")
print("3. 修改图书信息")
print("4. 查看所有图书")
print("5. 返回上一级")
sub_choice = input("请输入操作(1/2/3/4/5):")
if sub_choice == "1":
# 新增图书
book_id = input("图书ID:")
name = input("图书名称:")
author = input("作者:")
quantity = input("库存数量:")
try:
quantity = int(quantity)
admin.add_book(book_id, name, author, quantity)
except ValueError:
print("库存数量必须为整数,请重新输入")
elif sub_choice == "2":
# 删除图书
book_id = input("要删除的图书ID:")
admin.delete_book(book_id)
elif sub_choice == "3":
# 修改图书(支持部分字段更新)
book_id = input("要修改的图书ID:")
name = input("新名称(可选,回车跳过):").strip() or None
author = input("新作者(可选,回车跳过):").strip() or None
quantity = input("新库存(可选,回车跳过):").strip()
quantity = int(quantity) if quantity else None # 空输入则不修改数量
admin.modify_book(book_id, name, author, quantity)
elif sub_choice == "4":
# 查看所有图书
print("\n当前图书列表:")
for book in books:
print(f"ID: {book.isbn} | 名称: {book.name} | 作者: {book.author} | 库存: {book.quantity}")
elif sub_choice == "5":
# 返回上一级菜单
break
else:
print("无效选项,请重新输入")
elif choice == "3":
# 退出系统
print("系统已退出!")
break
else:
print("无效选择,请重新输入")
3.总结
到这里,已经完成了基本功能,并实现了基于控制台的用户交互模式。现实中的管理系统功能更复杂,涉及用户的权限分级、数据加密、多端同步等,交互界面不再是控制台,而是网页或GUI程序,数据的存储是通过数据库来完成,同时程序还需要考虑高并发等需求,但核心依旧是围绕CRUD和用户交互展开的。
962



被折叠的 条评论
为什么被折叠?



