import json
import os
# 文件路径
USER_FILE = "users.json"
BOOK_FILE = "books.json"
# ========== 数据初始化与读写 ==========
def load_data(file_path):
"""加载json文件,文件不存在则返回空列表"""
if not os.path.exists(file_path):
return []
with open(file_path, "r", encoding="utf-8") as f:
return json.load(f)
def save_data(file_path, data):
"""保存数据到json文件"""
with open(file_path, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 初始化默认账号(首次运行自动创建)
def init_default_user():
users = load_data(USER_FILE)
if len(users) == 0:
# 管理员账号
users.append({"username": "admin", "password": "123456", "role": "admin"})
# 普通读者账号
users.append({"username": "reader", "password": "123", "role": "reader"})
save_data(USER_FILE, users)
# ========== 用户登录模块 ==========
def login():
print("=" * 30)
print(" 图书管理系统 登录")
print("=" * 30)
username = input("请输入账号:")
password = input("请输入密码:")
user_list = load_data(USER_FILE)
for user in user_list:
if user["username"] == username and user["password"] == password:
print(f"\n登录成功!欢迎你,{username}")
return user
print("账号或密码错误!")
return None
# ========== 管理员功能 ==========
def admin_menu():
while True:
print("\n===== 管理员菜单 =====")
print("1. 添加图书")
print("2. 修改图书信息")
print("3. 删除图书")
print("4. 查询所有图书")
print("5. 返回登录界面")
choice = input("请输入操作序号:")
if choice == "1":
add_book()
elif choice == "2":
edit_book()
elif choice == "3":
del_book()
elif choice == "4":
show_all_books()
elif choice == "5":
break
else:
print("输入无效,请重新选择!")
def add_book():
books = load_data(BOOK_FILE)
book_id = input("输入图书编号:")
# 检查编号是否重复
for b in books:
if b["id"] == book_id:
print("该图书编号已存在,添加失败!")
return
book_name = input("输入图书名称:")
author = input("输入作者:")
category = input("输入图书分类:")
num = int(input("输入库存数量:"))
new_book = {
"id": book_id,
"name": book_name,
"author": author,
"category": category,
"stock": num,
"borrow_user": None # 当前借阅人,无人借阅为None
}
books.append(new_book)
save_data(BOOK_FILE, books)
print("✅ 图书添加成功!")
def show_all_books():
books = load_data(BOOK_FILE)
if not books:
print("暂无图书数据!")
return
print("\n编号\t书名\t作者\t分类\t库存\t借阅人")
print("-" * 60)
for b in books:
user = b["borrow_user"] if b["borrow_user"] else "无"
print(f"{b['id']}\t{b['name']}\t{b['author']}\t{b['category']}\t{b['stock']}\t{user}")
def edit_book():
books = load_data(BOOK_FILE)
bid = input("输入要修改的图书编号:")
for book in books:
if book["id"] == bid:
book["name"] = input("输入新书名:")
book["author"] = input("输入新作者:")
book["category"] = input("输入新分类:")
book["stock"] = int(input("输入新库存:"))
save_data(BOOK_FILE, books)
print("✅ 修改完成!")
return
print("未找到该编号的图书!")
def del_book():
books = load_data(BOOK_FILE)
bid = input("输入要删除的图书编号:")
for i, book in enumerate(books):
if book["id"] == bid:
books.pop(i)
save_data(BOOK_FILE, books)
print("✅ 删除成功!")
return
print("图书不存在!")
# ========== 读者功能(借阅/归还) ==========
def reader_menu(current_user):
while True:
print("\n===== 读者菜单 =====")
print("1. 查看全部图书")
print("2. 借阅图书")
print("3. 归还图书")
print("4. 返回登录界面")
choice = input("请选择操作:")
if choice == "1":
show_all_books()
elif choice == "2":
borrow_book(current_user["username"])
elif choice == "3":
return_book(current_user["username"])
elif choice == "4":
break
else:
print("输入错误!")
def borrow_book(username):
books = load_data(BOOK_FILE)
bid = input("输入要借阅的图书编号:")
for book in books:
if book["id"] == bid:
if book["stock"] <= 0:
print("库存不足,无法借阅!")
return
if book["borrow_user"] is not None:
print("这本书已被别人借走!")
return
book["stock"] -= 1
book["borrow_user"] = username
save_data(BOOK_FILE, books)
print(f"✅ {username} 借阅成功!")
return
print("找不到这本图书!")
def return_book(username):
books = load_data(BOOK_FILE)
bid = input("输入归还图书编号:")
for book in books:
if book["id"] == bid:
if book["borrow_user"] != username:
print("你没有借阅这本书,无法归还!")
return
book["stock"] += 1
book["borrow_user"] = None
save_data(BOOK_FILE, books)
print("✅ 归还成功!")
return
print("图书不存在!")
# ========== 程序主入口 ==========
def main():
# 初始化管理员与读者账号
init_default_user()
while True:
current_user = login()
if not current_user:
continue
# 根据角色进入不同菜单
if current_user["role"] == "admin":
admin_menu()
else:
reader_menu(current_user)
if __name__ == "__main__":
main()
11-22
4467
4467

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



