摘要:
本文基于python的图书馆管理系统和读者系统,实现了登录、注册、忘记密码、书籍查询、借阅、归还、修改等功能,通过csv文件将数据存储在本地。注册时采用了邮箱验证码,模拟了现实场景。(**全部源代码地址见文末**)如果有其他奇思妙想或者bug欢迎提出来!
一、效果图
主页面
选择编码
#选择编码
def Pick(number):
while True:
try:
pick = int(input('请输入需要的编号:'))
if pick not in [i for i in range(1,number+1)]:
print('编号无效!请重新输入!')
continue
else:
break
except:
print('请输入数字!')
return pick
主页面
#首页
def home_page():
print('\n')
print("* "*15,'图 书 馆 管 理 系 统',15*' *','\n')
print(' '*13,'1.管理员登录',' '*3,'2.读者登录\n')
print(' '*13,'3.管理员注册',' '*3,'4.读者注册\n')
print(' '*13,'5.退出系统\n')
print('* '*41)
print('\n')
pick = Pick(5)
return pick
管理员界面
def root_menu():
print('\n')
print("* "*12,'欢 迎 登 录 图 书 馆 管 理 员 系 统',11*' *','\n')
print(' '*13,'1.书籍录入',' '*3,'2.书籍查询\n')
print(' '*13,'3.书籍删除',' '*3,'4.书籍修改\n')
print(' '*13,'5.借阅登记',' '*3,'6.归还登记\n')
print(' '*13,'7.读者信息',' '*3,'8.退出登录\n')
# print(' '*13,'9.归还提醒',' '*3,'10.退出登录\n')
print('* '*41)
print('\n')
pick = Pick(8)
return pick
读者界面
def user_menu():
print('\n')
print("* "*13,'欢 迎 登 录 图 书 馆 读 者 系 统',13*' *','\n')
print(' '*13,'1.书籍查询',' '*3,'2.自主还书\n')
print(' '*13,'3.个人信息',' '*3,'4.自主借阅\n')
print(' '*13,'5.退出登录')
print('* '*41)
print('\n')
pick = Pick(5)
return pick
功能介绍:
1、登录
会判断账号是否存在和输入是否正确,密码错误可以进行忘记密码操作。
# 登录(记录操作者)
def Sign_in(x): #管理员账号表或读者账号表,0管理员,1读者
global administrators
global user
#判断学号密码是否正确
#学号必须是数字
while True:
try:
id = int(input('请输入学号:'))
break
except:
print('学号必须是数字!')
password = input('请输入密码:')
#查询学号是否存在,密码是否正确
if x==0:
sign_in_data = administrators
elif x==1:
sign_in_data = user
#print(sign_in_data)
while (id not in sign_in_data['学号'].values)or(sign_in_data[sign_in_data['学号']==id]['密码'].values[0] != password):
print('账号或密码输入错误!\n')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新尝试\n\t\t 2.忘记密码\n\t\t 3.退回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1:
return 11
elif pick == 2: #忘记密码操作
email = (sign_in_data.loc[sign_in_data['学号']==id]['邮箱'].values[0])
if email != 0: #账号存在
if x == 0:
return forget(email[0],0)
elif x==1:
return forget(email[0],1)
else:
print('账号不存在!')
return 0
elif pick == 3:
return 0
print("正在登录.......")
time.sleep(3)
print('登录成功!')
return id
2、注册
会判断账号是否存在,账号、密码格式是否正确,会向所填邮箱发送验证码,并将注册后的账号密码等信息记录起来。(QQ和QQ授权码需要换成自己的 )
发送验证码
#发验证码
def to_email(email,txt):
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = '自己的@qq.com'
password = '自己的邮箱授权码'
# 发信服务器
smtp_server = 'smtp.qq.com'
msg = MIMEMultipart()
msg['From'] = formataddr(["图书馆管理系统",from_addr])
msg['To'] = formataddr(['',email])
msg['Subject'] = Header('图书馆管理系统-邮箱验证')
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
#生成一个随机验证码
if txt == 0:
code = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(5))
txt='【图书馆管理系统】本次验证码为'+code+',您正在申请通过图书馆管理系统验证,如非本人操作,请忽略。'
msg.attach(MIMEText(txt, 'plain', 'utf-8'))
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server,465)
server.login(from_addr, password)
server.sendmail(from_addr, email, msg.as_string())
# 关闭服务器
server.quit()
print(f'验证码已发送至{email},请注意查收!')
return code
密码格式判断
# 密码格式判断
def count(s):
num, char, space, d ,count= 0, 0, 0, 0 ,0 # 分别统计数字、字母、空格、其他字符个数
for i in s:
if i.isdigit():
num += 1
elif i.isalpha():
char += 1
elif i == ' ':
space += 1
print('密码存在空格!')
return 0
else:
d += 1
for i in [num, char, d]:
if i >0:
count += 1
if count>=2:
return 1
else:
print('密码应该包含数字、字母、标点符号中的两种或两种以上!')
return 0
注册
#注册
def logon(x):
global administrators
global user
while True:
try:
id = int(input('请输入学号:'))
break
except:
print('请输入数字!')
name = input('请输入姓名:')
major = input('请输入专业名:')
#验证学号是否注册过
if x==0: #管理员
idlist = [administrators['学号'].values[0]]
elif x==1: #读者
idlist = [user['学号'].values[0]]
while id in idlist:
print('学号已注册过!\n')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新尝试\n\t\t 2.退回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
while True:
try:
id = int(input('请输入学号:'))
break
except:
print('请输入数字!')
break
else:
return 0
while True:
password = input('请输入密码:')
if (len(password)<6) or (len(password)>10):
print('密码应该长度大于6且小于10')
continue
else:
if count(password): #正确就退出
break
else:
continue
#发邮件
while True:
try:
email = input('请输入邮箱账号:')
code_x = to_email(email,0)
while True:
code_y = input('请输入验证码:')
if code_x == code_y:
pick = 0
break
else:
print('验证码输入错误!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入邮箱\n\t\t 2.重新输入验证码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick=Pick(3)
if pick == 1:
break
elif pick == 2:
continue
else:
return 0
except:
print('邮箱账号错误!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return 0
if pick == 2:
continue
elif pick ==0:
break
print('正在注册......')
time.sleep(3)
#存贮
if x==0:
administrators0 = pd.DataFrame([{
'学号':id,
'姓名':name,
'专业':major,
'邮箱':email,
'密码':password}])
administrators = pd.concat([administrators,administrators0],axis = 0).reset_index(drop=True)
administrators.to_csv(resource_path(os.path.join("res",'administrators.csv')),index=False)
else:
user0 = pd.DataFrame([{
'学号':id,
'姓名':name,
'专业':major,
'邮箱':email,
'密码':password}])
user = pd.concat([user,user0],axis = 0).reset_index(drop=True)
user.to_csv(resource_path(os.path.join("res",'user.csv')),index=False)
print('注册成功!\n')
return 0
忘记密码
#忘记密码
def forget(email,x): #0管理员,1读者
global administrators
global user
print('正在发送验证码....')
try:
code_x = to_email(email,0)
except:
print('邮箱错误!')
return desktop.home_page()
code_y =input('请输入验证码:')
count_ = 0 #计算次数
while code_x!=code_y:
print('验证码输入错误!')
count_+=1
if count_==5:
print('连续错误5次,需要重新发送验证码!')
code_x = to_email(email,0)
print(f'验证码已发送至{email},请注意查收!')
count_=0
else:
code_y = input('请输入验证码:')
print('验证码输入正确!')
while True:
newpassword = input('请输入新的密码:')
if (len(newpassword)<6) or (len(newpassword)>10):
print('密码应该长度大于6且小于10')
continue
else:
if count(newpassword): #正确就退出
break
else:
continue
print('正在修改........')
if x==0:
administrators.loc[administrators['邮箱']==email,'密码'] = newpassword
administrators.to_csv(resource_path(os.path.join("res",'administrators.csv')),index=False)
else:
user.loc[user['邮箱']==email,'密码'] = newpassword
user.to_csv(resource_path(os.path.join("res",'user.csv')),index=False)
print('密码修改成功!')
return desktop.home_page()
二、管理员系统
功能介绍:
1.书籍录入
判断书籍有没有存在,存在表现为书籍数量的增加,不存在为种类和数量的增加,记录操作者和操作时间。
#1.书籍录入
#填写日志
def book_add(id):
global books
global book_rework
while True:
books_name = input('书籍名称:')
books_author = input('作者:')
books_date1 = input('书籍出版日期:')
press = input('出版社:')
books_date2 = time.strftime("%Y-%m-%d %H:%M:%S") #获取当前时间
while True:
try:
books_count = int(input('书籍数量:'))
break
except:
print('请输入数字!')
#书籍编号,判断书籍是否存在
query = books[books['书籍名称']==books_name]
if len(query):
query = query[query['作者']==books_author]
if len(query):
query = query[query['出版日期']==books_date1]
if len(query):#说明书籍存在
print('正在录入.......')
#查找书籍编号
books_no = query.iloc[:1,0].values[0]
#馆藏和可借数量增加
books.loc[books['书籍编号']==books_no,'馆藏'] = books.loc[books['书籍编号']==books_no,'馆藏'] + books_count
books.loc[books['书籍编号']==books_no,'可借'] = books.loc[books['书籍编号']==books_no,'可借'] + books_count
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
#将修改记录保存起来
book_rework0 = pd.DataFrame([{
'姓名':administrators.loc[administrators['学号']==id]['姓名'][0],
'学号':administrators.loc[administrators['学号']==id]['学号'][0],
'书籍编号':books_no,
'修改列':'馆藏和可借',
'原来-现在':f'增加{books_count}',
'修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
book_rework = pd.concat([book_rework,book_rework0],axis = 0).reset_index(drop=True)
book_rework.to_csv(resource_path(os.path.join("res",'book_rework.csv')),index=False)
#不存在时(按编号最大的加1)
if len(query) == 0:
print('正在录入.......')
books_id = max(books['书籍编号']) + 1
books0 = pd.DataFrame([{
'书籍编号':books_id,
'书籍名称':books_name,
'作者':books_author,
'出版日期':books_date1,
'出版社':press,
'导入日期':books_date2,
'馆藏':books_count,
'可借':books_count
}])
books = pd.concat([books,books0],axis = 0).reset_index(drop=True) #合并并重置索引
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
#将修改记录保存起来
book_rework0 = pd.DataFrame([{
'姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
'学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
'书籍编号':books_id,
'修改列':'全部',
'原来-现在':f'增加《{books_name}》{books_count}本',
'修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
book_rework = pd.concat([book_rework,book_rework0]).reset_index(drop=True)
book_rework.to_csv(resource_path(os.path.join("res",'book_rework.csv')),index=False)
print('录入成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续录入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
num = Pick(2)
if num == 1:
continue
else:
return desktop.root_menu()
2.书籍查询
可以按编号、书籍名、作者进行模糊查询
#2.书籍查询
def book_query(id):
while True:
print('\n* * * * * * * * 请 选 择 查 询 方 式 * * * * * * * * \n\n\t\t 1.按书籍编号查询\n\t\t 2.按书籍名称查询\n\t\t 3.按作者查询\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
query_x = Pick(3)
if query_x==1:
while True:
try:
query_y = int(input('请输入查询信息:'))
break
except:
print('请输入数字!')
book_ = books.loc[books['书籍编号']==int(query_y)]
elif query_x==2:
query_y = input('请输入查询信息:')
book_ = books[books.书籍名称.str.contains(query_y,na=False)]
elif query_x==3:
query_y = input('请输入查询信息:')
book_ = books[books.作者.str.contains(query_y,na=False)]
if len(book_)==0:
print('查询书籍不存在!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新查询\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
num = Pick(2)
if num == 1:
continue
else:
return desktop.root_menu()
else:
print('\n')
print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新查询\n\t\t 2.书籍删除\n\t\t 3.借阅登记\n\t\t 4.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
num = Pick(4)
if num == 1:
continue
elif num == 2:
return book_delete(id)
elif num == 3:
return book_borrow()
else:
return desktop.root_menu()
3.书籍删除
删除对应书籍的全部信息,记录操作者和操作时间
#3.书籍删除
#会直接删除书籍的全部信息
def book_delete(id):
global books
global book_rework
while True:
while True:
try:
query_y = int(input('请输入书籍编号:'))
break
except:
print('请输入数字!')
book_ = books.loc[books['书籍编号']==query_y]
if len(book_)==0:
print('书籍不存在!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
else:
print(book_)
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.删除书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick ==1:
print('正在删除......')
#删除书籍
books = books.drop(books.loc[books['书籍编号']==query_y].index, axis=0)
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
#将修改记录保存起来
book_rework0 = pd.DataFrame([{
'姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
'学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
'书籍编号':query_y,
'修改列':'全部列',
'原来-现在':list(books.loc[books['书籍编号']==query_y].values),
'修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
book_rework = pd.concat([book_rework,book_rework0]).reset_index(drop=True)
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
print('删除成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续删除\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
elif pick == 2:
continue
else:
return desktop.root_menu()
4.书籍修改
修改书籍数据,记录操作者和操作时间
#4.书籍修改
#需要填写修改日志
def book_Rework(id):
global books
global book_rework
while True:
while True:
try:
query_y = int(input('请输入书籍编号:'))
break
except:
print('请输入数字!')
book_ = books.loc[books['书籍编号']==query_y]
if len(book_)==0:
print('书籍不存在!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
else:
print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.修改书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick ==1:
print('\n* * * * * * * * 请 选 择 修 改 字 段 * * * * * * * * \n\n\t\t 1.修改书籍名称\n\t\t 2.修改书籍作者\n\t\t 3.修改馆藏\n\t\t 4.修改可借\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1:
book_newname = input('请输入新的书籍名称:')
#将修改记录保存起来
old = books.loc[books['书籍编号'] == query_y,'书籍名称'].values
book_rework0 = pd.DataFrame([{
'姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
'学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
'书籍编号':query_y,
'修改列':'书籍名称',
'原来-现在':f'{old[0]}'+'-'+f'{book_newname}',
'修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
books.loc[books['书籍编号'] == query_y,'书籍名称'] = book_newname
elif pick == 2:
book_author = input('请输入新的作者:')
#将修改记录保存起来
old = books.loc[books['书籍编号'] == query_y,'作者'].values
book_rework0 = pd.DataFrame([{
'姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
'学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
'书籍编号':query_y,
'修改列':'作者',
'原来-现在':f'{old[0]}'+'-'+f'{book_author}',
'修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
books.loc[books['书籍编号'] == query_y,'作者'] = book_author
elif pick == 3:
while True:
try:
book_collection = int(input('请输入新的馆藏:'))
break
except:
print('请输入数字!')
#将修改记录保存起来
old = books.loc[books['书籍编号'] == query_y,'馆藏'].values
book_rework0 = pd.DataFrame([{
'姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
'学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
'书籍编号':query_y,
'修改列':'馆藏',
'原来-现在':f'{old[0]}'+'-'+f'{book_collection}',
'修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
books.loc[books['书籍编号'] == query_y,'馆藏'] = book_collection
else:
while True:
try:
book_borrow = int(input('请输入新的可借:'))
break
except:
print('请输入数字!')
#将修改记录保存起来
old = books.loc[books['书籍编号'] == query_y,'可借'].values
book_rework0 = pd.DataFrame([{
'姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
'学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
'书籍编号':query_y,
'修改列':'全部列',
'原来-现在':f'{old[0]}'+'-'+f'{book_borrow}',
'修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
books.loc[books['书籍编号'] == query_y,'可借'] = book_borrow
print('正在修改........')
book_rework = pd.concat([book_rework,book_rework0]).reset_index(drop=True)
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
book_rework.to_csv(resource_path(os.path.join("res",'book_rework.csv')),index=False)
print('修改成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续修改\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
elif pick == 2:
continue
else:
return desktop.root_menu()
5.借阅登记
记录借阅者和借阅数据
#5.借阅登记
def book_borrow():
global books
global readers
while True:
while True:
try:
query_y = int(input('请输入书籍编号:'))
break
except:
print('请输入数字!')
book_ = books.loc[books['书籍编号']==query_y]
if len(book_)==0:
print('书籍不存在!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
return book_borrow()
else:
return desktop.root_menu()
else:
print('\n')
print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
print('\n')
#可借为0
if book_['可借'].values==0 :
print('书籍数量为0,无法借阅!')
else:
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.借阅书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1:
while True:
try:
booknum = int(input('请输入借阅数量:'))
if booknum < 1:
print('借阅数量不能小于1!')
elif booknum > book_['可借'].values:
print('借阅数量不能多于可借书籍!')
else:
break
except:
print('请输入数字!')
while True:
try:
sno = int(input('请输入学号:'))
break
except:
print('请输入数字!')
name = input('请输入姓名:')
major = input('请输入专业名:')
#记录借阅 readers.csv
print('正在借阅......')
readers0 = pd.DataFrame([{
'学号':sno,
'姓名':name,
'专业':major,
'书籍编号':query_y,
'书籍名':(books.loc[books['书籍编号']==query_y]['书籍名称'].values)[0],
'作者':(books.loc[books['书籍编号']==query_y]['作者'].values)[0],
'数量':booknum,
'借阅/归还':'借阅',
'时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
readers = pd.concat([readers,readers0]).reset_index(drop=True)
readers.to_csv(resource_path(os.path.join("res",'readers.csv')),index=False)
#书籍表更改
books.loc[books['书籍编号'] == query_y,'可借'] -= booknum
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
elif pick == 2:
continue
else:
return desktop.root_menu()
print('借阅成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续借阅\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
6.归还登记
记录归还者和归还记录
#6.归还登记
def book_return():
global readers
global books
while True:
while True:
try:
sno = int(input('请输入学号:'))
break
except:
print('请输入数字!')
name = input('请输入姓名:')
major = input('请输入专业名:')
newdf = pd.DataFrame(readers[readers['学号']==sno].groupby(by=['书籍编号','书籍名称','作者'],as_index=False)['数量'].agg(sum)).rename(columns={'数量':'未归还数量'})
newdf = newdf[newdf['未归还数量']>0]
if len(newdf) == 0:
print('您未借阅过任何书籍!')
else:
print(newdf)
while True:
try:
query_y = int(input('请输入书籍编号:'))
break
except:
print('请输入数字!')
newdf_ = newdf.loc[newdf['书籍编号']==query_y]
if len(newdf_)==0:
print('书籍不存在!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
else:
print(newdf_)
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.归还书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1:
while True:
try:
booknum = int(input('请输入归还数量:'))
if booknum < 1:
print('归还数量不能小于1!')
elif booknum > newdf_['未归还数量'].values:
print('归还数量不能多于借出的数量!')
else:
break
except:
print('请输入数字!')
#归还登记 readers.csv
print('正在归还......')
readers0 = pd.DataFrame([{
'学号':sno,
'姓名':name,
'专业':major,
'书籍编号':query_y,
'书籍名称':(books.loc[books['书籍编号']==query_y]['书籍名称'].values)[0],
'作者':(books.loc[books['书籍编号']==query_y]['作者'].values)[0],
'数量':-booknum,
'借阅/归还':'归还',
'时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
readers = pd.concat([readers,readers0]).reset_index(drop=True)
readers.to_csv(resource_path(os.path.join("res",'readers.csv')),index=False)
#bookS表改变
books.loc[books['书籍编号'] == query_y,'可借'] += booknum
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
print('归还成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续归还\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
elif pick == 2:
continue
else:
return desktop.root_menu()
7.读者信息
可以改变读者的密码等操作
#7.读者信息
def readers_news():
#读者可以通过这个找回丢失的密码
global user
while True:
while True:
try:
u_id = int(input('请输入用户学号:'))
break
except:
print('请输入数字!')
name = input('请输入用户姓名:')
major = input('请输入用户专业名:')
#查找
user_ = user.loc[(user['学号'] == u_id )].loc[user['姓名']==name].loc[user['专业'] == major]
if len(user_)==0:
print('用户不存在!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
else:
print(tabulate(user_, headers = 'keys', tablefmt = 'pretty'))
#可以对学生信息进行修改
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.修改邮箱\n\t\t 2.修改密码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1 :
while True:
try:
new_email = input('请输入新的邮箱账号:')
code_x = main_desktop.to_email(new_email,0)
while True:
code_y = input('请输入验证码:')
if code_x == code_y:
print('正在修改.......')
user.loc[(user['学号'] == u_id) & (user['姓名']==name) &(user['专业'] == major),'邮箱'] = new_email
print('修改成功!')
pick = 0 #退出
break
else:
print('验证码输入错误!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入邮箱\n\t\t 2.重新输入验证码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1:
break
elif pick == 2:
continue
else:
return desktop.root_menu()
except:
print('邮箱账号错误!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
if pick == 2:
continue
elif pick == 0:
break
elif pick == 2:
while True:
new_password = input('请输入密码:')
if (len(new_password)<6) or (len(new_password)>10):
print('密码应该长度大于6且小于10')
else:
if main_desktop.count(new_password): #正确就退出
break
user.loc[(user['学号'] == u_id) & (user['姓名']==name) &(user['专业'] == major),'密码'] = new_password
user.to_csv(resource_path(os.path.join("res",'user.csv')),index=False)
print('修改成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续修改\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
三、读者系统
功能
1.书籍查询
2.自主还书
3.个人信息
4.自主借阅
类似于管理员系统
代码
#user_function.py
#用于存放读者的各种功能
from tabulate import tabulate
import pandas as pd
import desktop
import main_desktop
import time
import sys
import os
#生成资源文件目录访问路径
def resource_path(relative_path):
if getattr(sys, 'frozen', False): #是否Bundle Resource
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
#访问res文件夹下数据
#各种表格
user = pd.read_csv(resource_path(os.path.join("res","user.csv"))) #读者账号表
books = pd.read_csv(resource_path(os.path.join("res","books.csv"))) #书籍表
readers = pd.read_csv(resource_path(os.path.join("res","readers.csv"))) #读者借阅\归还记录
#选择编码
def Pick(number):
while True:
try:
pick = int(input('请输入需要的编号:'))
if pick not in [i for i in range(1,number+1)]:
print('编号无效!请重新输入!')
continue
else:
break
except:
print('请输入数字!')
return pick
#1.书籍查询
def book_query():
while True:
print('\n* * * * * * * * 请 选 择 查 询 方 式 * * * * * * * * \n\n\t\t 1.按书籍编号查询\n\t\t 2.按书籍名称查询\n\t\t 3.按作者查询\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
query_x = Pick(3)
if query_x==1:
while True:
try:
query_y = int(input('请输入查询信息:'))
break
except:
print('请输入数字!')
book_ = books.loc[books['书籍编号']==int(query_y)]
elif query_x==2:
query_y = input('请输入查询信息:')
book_ = books[books.书籍名称.str.contains(query_y)]
elif query_x==3:
query_y = input('请输入查询信息:')
book_ = books[books.作者.str.contains(query_y)]
if len(book_)==0:
print('查询书籍不存在!')
else:
print('\n')
print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新查询\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
num = Pick(2)
if num == 1:
continue
else:
return desktop.user_menu()
#2.自主还书(先打印这个读者借阅的书籍数据)
def book_return(id):
global readers
global books
while True:
newdf = pd.DataFrame(readers[readers['学号']==id].groupby(by=['书籍编号','书籍名称','作者'],as_index=False)['数量'].agg(sum)).rename(columns={'数量':'未归还数量'})
newdf = newdf[newdf['未归还数量']>0]
if len(newdf) == 0:
print('您未借阅过任何书籍!')
else:
print(tabulate(newdf, headers = 'keys', tablefmt = 'pretty'))
while True:
try:
query_y = int(input('请输入要归还的书籍编号:'))
break
except:
print('请输入数字!')
newdf_ = newdf.loc[newdf['书籍编号']==query_y]
if len(newdf_)==0:
print('您未借阅该书籍!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.user_menu()
else:
print(tabulate(newdf_, headers = 'keys', tablefmt = 'pretty'))
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.归还书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1:
while True:
try:
booknum = int(input('请输入归还数量:'))
if booknum < 1:
print('归还数量不能小于1!')
elif booknum > newdf_['未归还数量'].values:
print('归还数量不能多于借出的数量!')
else:
break
except:
print('请输入数字!')
#归还登记 readers.csv
print('正在归还......')
readers0 = pd.DataFrame([{
'学号':id,
'姓名':user.loc[user['学号']==id]['姓名'][0],
'专业':user.loc[user['学号']==id]['专业'][0],
'书籍编号':query_y,
'书籍名称':(books.loc[books['书籍编号']==query_y]['书籍名称'].values)[0],
'作者':(books.loc[books['书籍编号']==query_y]['作者'].values)[0],
'数量':-booknum,
'借阅/归还':'归还',
'时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
readers = pd.concat([readers,readers0]).reset_index(drop=True)
readers.to_csv(resource_path(os.path.join("res",'readers.csv')),index=False)
#bookS表改变
books.loc[books['书籍编号'] == query_y,'可借'] += booknum
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
print('归还成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续归还\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.user_menu()
elif pick == 2:
continue
else:
return desktop.user_menu()
#3.个人信息
def readers_news(id):
#读者可以通过这个找更改密码
global user
#查找
while True:
user_ = user.loc[(user['学号'] == id )]
print(tabulate(user_, headers = 'keys', tablefmt = 'pretty'))
#可以对学生信息进行修改
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.修改邮箱\n\t\t 2.修改密码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1 :
while True:
try:
new_email = input('请输入新的邮箱账号:')
code_x = main_desktop.to_email(new_email,0)
while True:
code_y = input('请输入验证码:')
if code_x == code_y:
print('正在修改.......')
user.loc[(user['学号'] == id),'邮箱'] = new_email
print('修改成功!')
pick = 0 #退出
break
else:
print('验证码输入错误!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入邮箱\n\t\t 2.重新输入验证码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1:
break
elif pick == 2:
continue
else:
return desktop.user_menu()
except:
print('邮箱账号错误!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.user_menu()
if pick == 2:
continue
elif pick == 0:
break
elif pick == 2:
while True:
new_password = input('请输入密码:')
if (len(new_password)<6) or (len(new_password)>10):
print('密码应该长度大于6且小于10')
else:
if main_desktop.count(new_password): #正确就退出
break
user.loc[(user['学号'] == id),'密码'] = new_password
user.to_csv(resource_path(os.path.join("res",'user.csv')),index=False)
print('修改成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续修改\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.user_menu()
else:
return desktop.user_menu()
#4.自主借阅
def book_borrow(id):
global books
global readers
while True:
while True:
try:
query_y = int(input('请输入书籍编号:'))
break
except:
print('请输入数字!')
book_ = books.loc[books['书籍编号']==query_y]
if len(book_)==0:
print('书籍不存在!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
return book_borrow()
else:
return desktop.root_menu()
else:
print('\n')
print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
print('\n')
#可借为0
if book_['可借'].values==0 :
print('书籍数量为0,无法借阅!')
else:
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.借阅书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(3)
if pick == 1:
while True:
try:
booknum = int(input('请输入借阅数量:'))
if booknum < 1:
print('借阅数量不能小于1!')
elif booknum > book_['可借'].values:
print('借阅数量不能多于可借书籍!')
else:
break
except:
print('请输入数字!')
#记录借阅 readers.csv
print('正在借阅......')
readers0 = pd.DataFrame([{
'学号':id,
'姓名':user.loc[user['学号']==id]['姓名'][0],
'专业':user.loc[user['学号']==id]['专业'][0],
'书籍编号':query_y,
'书籍名':(books.loc[books['书籍编号']==query_y]['书籍名称'].values)[0],
'作者':(books.loc[books['书籍编号']==query_y]['作者'].values)[0],
'数量':booknum,
'借阅/归还':'借阅',
'时间':time.strftime("%Y-%m-%d %H:%M:%S")
}])
readers = pd.concat([readers,readers0]).reset_index(drop=True)
readers.to_csv(resource_path(os.path.join("res",'readers.csv')),index=False)
#书籍表更改
books.loc[books['书籍编号'] == query_y,'可借'] -= booknum
books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
elif pick == 2:
continue
else:
return desktop.root_menu()
print('借阅成功!')
print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续借阅\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
pick = Pick(2)
if pick == 1:
continue
else:
return desktop.root_menu()
#5.退出登录
def sign_out():
return desktop.home_page()
链接:https://pan.baidu.com/s/1VX7L13PmaJN8TzZhiO-Lcw
提取码:ljyx
注:main_desktop.py中QQ和QQ授权码需要换成自己的!!!!!!
版权归原作者 冷烬亿下 所有, 如有侵权,请联系我们删除。