目录
课题背景
一、主要研究内容
二、需求分析
1.功能性需求分析
2.非功能性需求分析
三、系统整体架构设计
四、相关代码
1.文件存储
1.1.存储用户信息
1.2.存储图书信息
2.密码保护
五、完整代码
1.图书借阅管理系统.py
2.user.py
3.manager.py
课题背景
基于Python开发的一款图书借阅管理系统。
一、主要研究内容
本文的主要研究内容包括下面两个部分。
(1)文件存储
利用文件实现对用户信息和图书信息进行存储,管理员可以更直观的了解到用户信息,而用户也可以查询到每本图书的动向。
(2)管理员
对管理员的密码进行了保护,在管理员输入密码的时候,可以实现一边输入密码,一边将输入的密码显示为星号。
二、需求分析
1.功能性需求分析
图书借阅管理系统有用户和管理员两个角色。这两个角色共用一个登录模块,这个登录模块会自动识别登录者的身份。
管理员角色只能有一个,用户角色可以有多个。
在登录成功后,如果角色是管理员,可以对用户信息进行增删查改;退出程序。
在登录成功后,如果角色是用户,可以借阅图书,查看图书,归还图书;退出程序。
图书借阅管理系统可以将系统使用过程中产生的数据保存到文件中。
如果登录失败,则重新尝试登录。
(1)管理员
可以增加用户信息,删除用户信息,修改用户信息,查询用户信息。
(2)用户
可以借阅图书,归还图书,查询图书。
2.非功能性需求分析
本系统只能进行简单的进行用户增删查改和图书的借阅归还查看,而不能精确到具体那个人借了那本书。
三、系统整体架构设计
(1)登录
管理员和用户都可以进行登录,并且系统会对管理员密码进行加密处理,而用户密码则会不会被加密。
(2)注册
只能注册新用户而不能注册管理员,如果是该用户第一次使用该系统,那么该用户可以通过注册相关信息从而实现登录系统。
(3)管理员登录
只有管理员才可以使用该功能,登录进去可以实现对用户信息的增删查改
(4)图书界面
用户登录该界面后,可以在该界面选择相应的功能来实现借阅图书,归还图书和查看图书。
(5)用户界面
管理员登录到该界面后,可以选择在该界面选择相应的功能来实现增加用户信息,删除用户信息,修改用户信息,查看用户信息。
四、相关代码
1.文件存储
1.1.存储用户信息
代码如下(示例):
# 登录
class DL:
@staticmethod
def EntryInfo():
flag = 3
while flag:
print("----------登录界面:----------")
name = input("账号:")
pwd = input("密码:")
q = 0
userlist.append(readallusers())
pwdlist.append(readallusers())
for a in range(len(userlist)):
if name == userlist[a]:
a1 = 1
for a2 in range(len(pwdlist)):
if pwd == pwdlist[a]:
b2 = 1
if a1 == 1 and b2 == 1:
q += 1
print("登录成功!")
user.YCD.menu2()
return CD.menu()
if q == 0:
print("错误的账号或密码")
flag -= 1
print("你还有", flag, "次机会")
if flag == 0:
sys.exit()
# 注册
class ZC:
@staticmethod
def register():
global userlist
name_data = ['傻', '蠢', '笨', '呆', '愚']
print("------------------注册界面------------------")
name = str(input("注册的账号:"))
# 检测账号中是否出现敏感词汇!
while 1:
a = 0
for p in name_data:
for j in name:
if j in p:
newname = name.replace(j, '*')
a += 1
print("账号", newname, "出现敏感词汇,请重新输入:")
name = str(input("注册的账号:"))
else:
break
# 检测密码是否符合要求!
pwd = input("注册的密码:")
while 1:
# 检测密码长度是否合格!
n = 0
if len(pwd) <= 6:
d = 0
print("密码应不少于六位数!", end='')
else:
d = 1
# 检测密码的强度!
for m in range(len(pwd)):
if '0' <= pwd[m] <= '9':
n += 1
if n < len(pwd):
n = 0
else:
print("密码强度不够!")
k = pwd.isalpha()
l = 0
if k:
print("密码强度不够!")
else:
l += 1
if d == 1 and n == 0 and l != 0:
with open('./yh.txt', 'a+', encoding='utf-8') as fp:
fp.write(f'{name}:{pwd}\n')
fp.close()
print(f'注册成功:用户名:{name}')
CD.menu()
pwd = input("注册的密码:")
1.2.存储图书信息
代码如下(示例):
class GH:
@staticmethod
def GuiHuan():
h = str(input("请用户输入要归还的图书名称:"))
with open('book.txt', 'a+', encoding='utf-8') as yhfile:
yhfile.write(h + '\n')
print("添加成功!")
2.密码保护
代码如下(示例):
class GL:
@staticmethod
def manager1():
global userlist
name1 = str(input("请输入管理员账号:"))
print('请输入管理员密码:', end='', flush=True)
li = []
while 1:
ch = msvcrt.getch()
# 回车
if ch == b'\r':
msvcrt.putch(b'\n')
# print('输入的密码是:%s' % b''.join(li).decode())
break
# 退格
elif ch == b'\x08':
if li:
li.pop()
msvcrt.putch(b'\b')
msvcrt.putch(b' ')
msvcrt.putch(b'\b')
# Esc
elif ch == b'\x1b':
break
else:
li.append(ch)
msvcrt.putch(b'*')
# os.system('pause')
while 1:
if name1 == '张三' and li == [b'1', b'2', b'3', b'4', b'5', b'6']:
print("登录成功!")
if manager.GCD.menu1():
return CD.menu()
else:
print("登录页面调用出错")
else:
print("账号或密码错误,请重新输入:")
return GL.manager1()
五、完整代码
1.图书借阅管理系统.py
import sys
import msvcrt
# import os
import manager
import user
userlist = [] # 存放所有的用户名
pwdlist = [] # 存放所有的用户密码
# 读取所有数据的方法
def readallusers():
# 读取所有的注册信息 使用a+模式打开文件,在调整指针位置,防止文件不存在时报错
with open('./yh.txt', 'a+', encoding='utf-8') as fp:
fp.seek(0) # 调整当前的的指针位置到文件头部
res = fp.readlines() # 按照每一行读取所有的用户数据
for i in res: # 循环读取的每一行数据
r = i.strip() # 处理每一个换行 admin:123\n ==> admin:123
arr = r.split(':') # admin:123 ==> ['admin','123']
userlist.append(arr[0]) # 把用户名追加到 用户名列表中
pwdlist.append(arr[1]) # 把用户对应的密码 追加到 用户密码 列表中
fp.close()
# 登录
class DL:
@staticmethod
def EntryInfo():
flag = 3
while flag:
print("----------登录界面:----------")
name = input("账号:")
pwd = input("密码:")
q = 0
userlist.append(readallusers())
pwdlist.append(readallusers())
for a in range(len(userlist)):
if name == userlist[a]:
a1 = 1
for a2 in range(len(pwdlist)):
if pwd == pwdlist[a]:
b2 = 1
if a1 == 1 and b2 == 1:
q += 1
print("登录成功!")
user.YCD.menu2()
return CD.menu()
if q == 0:
print("错误的账号或密码")
flag -= 1
print("你还有", flag, "次机会")
if flag == 0:
sys.exit()
# 注册
class ZC:
@staticmethod
def register():
global userlist
name_data = ['傻', '蠢', '笨', '呆', '愚']
print("------------------注册界面------------------")
name = str(input("注册的账号:"))
# 检测账号中是否出现敏感词汇!
while 1:
a = 0
for p in name_data:
for j in name:
if j in p:
newname = name.replace(j, '*')
a += 1
print("账号", newname, "出现敏感词汇,请重新输入:")
name = str(input("注册的账号:"))
else:
break
# 检测密码是否符合要求!
pwd = input("注册的密码:")
while 1:
# 检测密码长度是否合格!
n = 0
if len(pwd) <= 6:
d = 0
print("密码应不少于六位数!", end='')
else:
d = 1
# 检测密码的强度!
for m in range(len(pwd)):
if '0' <= pwd[m] <= '9':
n += 1
if n < len(pwd):
n = 0
else:
print("密码强度不够!")
k = pwd.isalpha()
l = 0
if k:
print("密码强度不够!")
else:
l += 1
if d == 1 and n == 0 and l != 0:
with open('./yh.txt', 'a+', encoding='utf-8') as fp:
fp.write(f'{name}:{pwd}\n')
fp.close()
print(f'注册成功:用户名:{name}')
CD.menu()
pwd = input("注册的密码:")
# 退出
class TC:
@staticmethod
def exit1():
print("退出成功!")
sys.exit()
# 管理员登录
class GL:
@staticmethod
def manager1():
global userlist
name1 = str(input("请输入管理员账号:"))
print('请输入管理员密码:', end='', flush=True)
li = []
while 1:
ch = msvcrt.getch()
# 回车
if ch == b'\r':
msvcrt.putch(b'\n')
# print('输入的密码是:%s' % b''.join(li).decode())
break
# 退格
elif ch == b'\x08':
if li:
li.pop()
msvcrt.putch(b'\b')
msvcrt.putch(b' ')
msvcrt.putch(b'\b')
# Esc
elif ch == b'\x1b':
break
else:
li.append(ch)
msvcrt.putch(b'*')
# os.system('pause')
while 1:
if name1 == '张三' and li == [b'1', b'2', b'3', b'4', b'5', b'6']:
print("登录成功!")
if manager.GCD.menu1():
return CD.menu()
else:
print("登录页面调用出错")
else:
print("账号或密码错误,请重新输入:")
return GL.manager1()
# 菜单
class CD:
@staticmethod
def menu():
print("----------图书借阅管理系统----------")
print("--------------1.登录--------------")
print("--------------2.注册--------------")
print("--------------3.退出--------------")
print("------------4.管理员登录-----------")
choice = int(input("请用户选择操作:"))
if choice == 1:
DL.EntryInfo()
elif choice == 2:
ZC.register()
elif choice == 3:
TC.exit1()
else:
GL.manager1()
CD.menu()
2.user.py
# 用户菜单
class YCD:
@staticmethod
def menu2():
print("--------%图书借阅界面%--------")
print("--------1.借阅已有书籍--------")
print("--------2.归还借阅书籍--------")
print("--------3.查看现有书籍--------")
print("--------4.退出用户界面--------")
choice = int(input("请用户选择操作:"))
if choice == 1:
JY.borrow()
return YCD.menu2()
elif choice == 2:
GH.GuiHuan()
return YCD.menu2()
elif choice == 3:
CK.Check()
return YCD.menu2()
else:
pass
# 借阅
class JY:
@staticmethod
def borrow():
f = open('book.txt', 'r', encoding='utf-8')
q = f.read()
print(q)
q = str(input("\n请用户选择要借阅的图书:"))
with open("book.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
# print(lines)
with open("book.txt", "w", encoding="utf-8") as f_w:
for line in lines:
if q in line:
continue
f_w.write(line)
# 归还
class GH:
@staticmethod
def GuiHuan():
h = str(input("请用户输入要归还的图书名称:"))
with open('book.txt', 'a+', encoding='utf-8') as yhfile:
yhfile.write(h + '\n')
print("添加成功!")
# 查看
class CK:
@staticmethod
def Check():
f = open('book.txt', 'r', encoding='utf-8')
q = f.read()
print(q)
print("查询成功!")
# YCD.menu2()
3.manager.py
list1 = {'张三', '李四', '王五'}
# 管理员菜单
class GCD:
@staticmethod
def menu1():
s2 = "欢迎使用图书馆借阅管理系统V2.10"
print(s2.center(32, '-'))
s3 = "--用户信息维护页--"
print(s3.center(36, ' '))
s4 = "1.添加用户信息"
print(s4.center(35, ' '))
s5 = "2.删除用户信息"
print(s5.center(35, ' '))
s6 = "3.修改用户信息"
print(s6.center(35, ' '))
s7 = "4.显示用户信息"
print(s7.center(35, ' '))
s8 = "5.退出系统"
print(s8.center(36, ' '))
chose = int(input("请管理员选择操作:"))
if chose == 1:
TJ.Add()
return GCD.menu1()
elif chose == 2:
SC.Delete()
return GCD.menu1()
elif chose == 3:
XG.Alter()
return GCD.menu1()
elif chose == 4:
XS.Show()
return GCD.menu1()
else:
pass
return True
# 添加
class TJ:
@staticmethod
def Add():
print("------------添加用户信息界面------------")
a1 = str(input("请输入用户姓名:"))
with open('yh1.txt', 'a+', encoding='utf-8') as yhfile:
yhfile.write(a1 + '\n')
print("添加成功!")
# 删除
class SC:
@staticmethod
def Delete():
print("------------删除用户信息界面------------")
a2 = str(input("请输入要删除的用户姓名:"))
with open("yh1.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
# print(lines)
with open("yh1.txt", "w", encoding="utf-8") as f_w:
for line in lines:
if a2 in line:
continue
f_w.write(line)
# 修改
class XG:
@staticmethod
def Alter():
print("------------添加修改信息界面------------")
a3 = str(input("请输入要修改的用户姓名:"))
a4 = str(input("请输入修改后的用户姓名:"))
with open("yh1.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
# print(lines)
with open("yh1.txt", "w", encoding="utf-8") as f_w:
f_w.write(a4 + '\n')
for line in lines:
if a3 in line:
continue
f_w.write(line)
print("修改成功!")
# 显示
class XS:
@staticmethod
def Show():
print("------------查询用户信息界面------------")
f = open('yh1.txt', 'r', encoding='utf-8')
q = f.read()
print(q)
print("查询成功!")
# GCD.menu1()