当前位置:   article > 正文

基于python图书馆管理系统和读者系统(附完整代码以及打包好的exe文件)_python图书借阅管理系统全部源代码

python图书借阅管理系统全部源代码

摘要:

        本文基于python的图书馆管理系统和读者系统,实现了登录、注册、忘记密码、书籍查询、借阅、归还、修改等功能,通过csv文件将数据存储在本地。注册时采用了邮箱验证码,模拟了现实场景。(全部源代码地址见文末)如果有其他奇思妙想或者bug欢迎提出来!

一、效果图

主页面 

 选择编码

  1. #选择编码
  2. def Pick(number):
  3. while True:
  4. try:
  5. pick = int(input('请输入需要的编号:'))
  6. if pick not in [i for i in range(1,number+1)]:
  7. print('编号无效!请重新输入!')
  8. continue
  9. else:
  10. break
  11. except:
  12. print('请输入数字!')
  13. return pick

主页面

  1. #首页
  2. def home_page():
  3. print('\n')
  4. print("* "*15,'图 书 馆 管 理 系 统',15*' *','\n')
  5. print(' '*13,'1.管理员登录',' '*3,'2.读者登录\n')
  6. print(' '*13,'3.管理员注册',' '*3,'4.读者注册\n')
  7. print(' '*13,'5.退出系统\n')
  8. print('* '*41)
  9. print('\n')
  10. pick = Pick(5)
  11. return pick

管理员界面

  1. def root_menu():
  2. print('\n')
  3. print("* "*12,'欢 迎 登 录 图 书 馆 管 理 员 系 统',11*' *','\n')
  4. print(' '*13,'1.书籍录入',' '*3,'2.书籍查询\n')
  5. print(' '*13,'3.书籍删除',' '*3,'4.书籍修改\n')
  6. print(' '*13,'5.借阅登记',' '*3,'6.归还登记\n')
  7. print(' '*13,'7.读者信息',' '*3,'8.退出登录\n')
  8. # print(' '*13,'9.归还提醒',' '*3,'10.退出登录\n')
  9. print('* '*41)
  10. print('\n')
  11. pick = Pick(8)
  12. return pick

 读者界面

  1. def user_menu():
  2. print('\n')
  3. print("* "*13,'欢 迎 登 录 图 书 馆 读 者 系 统',13*' *','\n')
  4. print(' '*13,'1.书籍查询',' '*3,'2.自主还书\n')
  5. print(' '*13,'3.个人信息',' '*3,'4.自主借阅\n')
  6. print(' '*13,'5.退出登录')
  7. print('* '*41)
  8. print('\n')
  9. pick = Pick(5)
  10. return pick

 功能介绍:

1、登录

会判断账号是否存在和输入是否正确,密码错误可以进行忘记密码操作。

  1. # 登录(记录操作者)
  2. def Sign_in(x): #管理员账号表或读者账号表,0管理员,1读者
  3. global administrators
  4. global user
  5. #判断学号密码是否正确
  6. #学号必须是数字
  7. while True:
  8. try:
  9. id = int(input('请输入学号:'))
  10. break
  11. except:
  12. print('学号必须是数字!')
  13. password = input('请输入密码:')
  14. #查询学号是否存在,密码是否正确
  15. if x==0:
  16. sign_in_data = administrators
  17. elif x==1:
  18. sign_in_data = user
  19. #print(sign_in_data)
  20. while (id not in sign_in_data['学号'].values)or(sign_in_data[sign_in_data['学号']==id]['密码'].values[0] != password):
  21. print('账号或密码输入错误!\n')
  22. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新尝试\n\t\t 2.忘记密码\n\t\t 3.退回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  23. pick = Pick(3)
  24. if pick == 1:
  25. return 11
  26. elif pick == 2: #忘记密码操作
  27. email = (sign_in_data.loc[sign_in_data['学号']==id]['邮箱'].values[0])
  28. if email != 0: #账号存在
  29. if x == 0:
  30. return forget(email[0],0)
  31. elif x==1:
  32. return forget(email[0],1)
  33. else:
  34. print('账号不存在!')
  35. return 0
  36. elif pick == 3:
  37. return 0
  38. print("正在登录.......")
  39. time.sleep(3)
  40. print('登录成功!')
  41. return id

2、注册

会判断账号是否存在,账号、密码格式是否正确,会向所填邮箱发送验证码,并将注册后的账号密码等信息记录起来。(QQ和QQ授权码需要换成自己的 )

发送验证码

  1. #发验证码
  2. def to_email(email,txt):
  3. # 发信方的信息:发信邮箱,QQ 邮箱授权码
  4. from_addr = '自己的@qq.com'
  5. password = '自己的邮箱授权码'
  6. # 发信服务器
  7. smtp_server = 'smtp.qq.com'
  8. msg = MIMEMultipart()
  9. msg['From'] = formataddr(["图书馆管理系统",from_addr])
  10. msg['To'] = formataddr(['',email])
  11. msg['Subject'] = Header('图书馆管理系统-邮箱验证')
  12. # 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
  13. #生成一个随机验证码
  14. if txt == 0:
  15. code = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(5))
  16. txt='【图书馆管理系统】本次验证码为'+code+',您正在申请通过图书馆管理系统验证,如非本人操作,请忽略。'
  17. msg.attach(MIMEText(txt, 'plain', 'utf-8'))
  18. server = smtplib.SMTP_SSL(smtp_server)
  19. server.connect(smtp_server,465)
  20. server.login(from_addr, password)
  21. server.sendmail(from_addr, email, msg.as_string())
  22. # 关闭服务器
  23. server.quit()
  24. print(f'验证码已发送至{email},请注意查收!')
  25. return code

密码格式判断

  1. # 密码格式判断
  2. def count(s):
  3. num, char, space, d ,count= 0, 0, 0, 0 ,0 # 分别统计数字、字母、空格、其他字符个数
  4. for i in s:
  5. if i.isdigit():
  6. num += 1
  7. elif i.isalpha():
  8. char += 1
  9. elif i == ' ':
  10. space += 1
  11. print('密码存在空格!')
  12. return 0
  13. else:
  14. d += 1
  15. for i in [num, char, d]:
  16. if i >0:
  17. count += 1
  18. if count>=2:
  19. return 1
  20. else:
  21. print('密码应该包含数字、字母、标点符号中的两种或两种以上!')
  22. return 0

注册

  1. #注册
  2. def logon(x):
  3. global administrators
  4. global user
  5. while True:
  6. try:
  7. id = int(input('请输入学号:'))
  8. break
  9. except:
  10. print('请输入数字!')
  11. name = input('请输入姓名:')
  12. major = input('请输入专业名:')
  13. #验证学号是否注册过
  14. if x==0: #管理员
  15. idlist = [administrators['学号'].values[0]]
  16. elif x==1: #读者
  17. idlist = [user['学号'].values[0]]
  18. while id in idlist:
  19. print('学号已注册过!\n')
  20. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新尝试\n\t\t 2.退回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  21. pick = Pick(2)
  22. if pick == 1:
  23. while True:
  24. try:
  25. id = int(input('请输入学号:'))
  26. break
  27. except:
  28. print('请输入数字!')
  29. break
  30. else:
  31. return 0
  32. while True:
  33. password = input('请输入密码:')
  34. if (len(password)<6) or (len(password)>10):
  35. print('密码应该长度大于6且小于10')
  36. continue
  37. else:
  38. if count(password): #正确就退出
  39. break
  40. else:
  41. continue
  42. #发邮件
  43. while True:
  44. try:
  45. email = input('请输入邮箱账号:')
  46. code_x = to_email(email,0)
  47. while True:
  48. code_y = input('请输入验证码:')
  49. if code_x == code_y:
  50. pick = 0
  51. break
  52. else:
  53. print('验证码输入错误!')
  54. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入邮箱\n\t\t 2.重新输入验证码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  55. pick=Pick(3)
  56. if pick == 1:
  57. break
  58. elif pick == 2:
  59. continue
  60. else:
  61. return 0
  62. except:
  63. print('邮箱账号错误!')
  64. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  65. pick = Pick(2)
  66. if pick == 1:
  67. continue
  68. else:
  69. return 0
  70. if pick == 2:
  71. continue
  72. elif pick ==0:
  73. break
  74. print('正在注册......')
  75. time.sleep(3)
  76. #存贮
  77. if x==0:
  78. administrators0 = pd.DataFrame([{
  79. '学号':id,
  80. '姓名':name,
  81. '专业':major,
  82. '邮箱':email,
  83. '密码':password}])
  84. administrators = pd.concat([administrators,administrators0],axis = 0).reset_index(drop=True)
  85. administrators.to_csv(resource_path(os.path.join("res",'administrators.csv')),index=False)
  86. else:
  87. user0 = pd.DataFrame([{
  88. '学号':id,
  89. '姓名':name,
  90. '专业':major,
  91. '邮箱':email,
  92. '密码':password}])
  93. user = pd.concat([user,user0],axis = 0).reset_index(drop=True)
  94. user.to_csv(resource_path(os.path.join("res",'user.csv')),index=False)
  95. print('注册成功!\n')
  96. return 0

忘记密码

  1. #忘记密码
  2. def forget(email,x): #0管理员,1读者
  3. global administrators
  4. global user
  5. print('正在发送验证码....')
  6. try:
  7. code_x = to_email(email,0)
  8. except:
  9. print('邮箱错误!')
  10. return desktop.home_page()
  11. code_y =input('请输入验证码:')
  12. count_ = 0 #计算次数
  13. while code_x!=code_y:
  14. print('验证码输入错误!')
  15. count_+=1
  16. if count_==5:
  17. print('连续错误5次,需要重新发送验证码!')
  18. code_x = to_email(email,0)
  19. print(f'验证码已发送至{email},请注意查收!')
  20. count_=0
  21. else:
  22. code_y = input('请输入验证码:')
  23. print('验证码输入正确!')
  24. while True:
  25. newpassword = input('请输入新的密码:')
  26. if (len(newpassword)<6) or (len(newpassword)>10):
  27. print('密码应该长度大于6且小于10')
  28. continue
  29. else:
  30. if count(newpassword): #正确就退出
  31. break
  32. else:
  33. continue
  34. print('正在修改........')
  35. if x==0:
  36. administrators.loc[administrators['邮箱']==email,'密码'] = newpassword
  37. administrators.to_csv(resource_path(os.path.join("res",'administrators.csv')),index=False)
  38. else:
  39. user.loc[user['邮箱']==email,'密码'] = newpassword
  40. user.to_csv(resource_path(os.path.join("res",'user.csv')),index=False)
  41. print('密码修改成功!')
  42. return desktop.home_page()

二、管理员系统

功能介绍:

1.书籍录入

判断书籍有没有存在,存在表现为书籍数量的增加,不存在为种类和数量的增加,记录操作者和操作时间。      

  1. #1.书籍录入
  2. #填写日志
  3. def book_add(id):
  4. global books
  5. global book_rework
  6. while True:
  7. books_name = input('书籍名称:')
  8. books_author = input('作者:')
  9. books_date1 = input('书籍出版日期:')
  10. press = input('出版社:')
  11. books_date2 = time.strftime("%Y-%m-%d %H:%M:%S") #获取当前时间
  12. while True:
  13. try:
  14. books_count = int(input('书籍数量:'))
  15. break
  16. except:
  17. print('请输入数字!')
  18. #书籍编号,判断书籍是否存在
  19. query = books[books['书籍名称']==books_name]
  20. if len(query):
  21. query = query[query['作者']==books_author]
  22. if len(query):
  23. query = query[query['出版日期']==books_date1]
  24. if len(query):#说明书籍存在
  25. print('正在录入.......')
  26. #查找书籍编号
  27. books_no = query.iloc[:1,0].values[0]
  28. #馆藏和可借数量增加
  29. books.loc[books['书籍编号']==books_no,'馆藏'] = books.loc[books['书籍编号']==books_no,'馆藏'] + books_count
  30. books.loc[books['书籍编号']==books_no,'可借'] = books.loc[books['书籍编号']==books_no,'可借'] + books_count
  31. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  32. #将修改记录保存起来
  33. book_rework0 = pd.DataFrame([{
  34. '姓名':administrators.loc[administrators['学号']==id]['姓名'][0],
  35. '学号':administrators.loc[administrators['学号']==id]['学号'][0],
  36. '书籍编号':books_no,
  37. '修改列':'馆藏和可借',
  38. '原来-现在':f'增加{books_count}',
  39. '修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
  40. }])
  41. book_rework = pd.concat([book_rework,book_rework0],axis = 0).reset_index(drop=True)
  42. book_rework.to_csv(resource_path(os.path.join("res",'book_rework.csv')),index=False)
  43. #不存在时(按编号最大的加1)
  44. if len(query) == 0:
  45. print('正在录入.......')
  46. books_id = max(books['书籍编号']) + 1
  47. books0 = pd.DataFrame([{
  48. '书籍编号':books_id,
  49. '书籍名称':books_name,
  50. '作者':books_author,
  51. '出版日期':books_date1,
  52. '出版社':press,
  53. '导入日期':books_date2,
  54. '馆藏':books_count,
  55. '可借':books_count
  56. }])
  57. books = pd.concat([books,books0],axis = 0).reset_index(drop=True) #合并并重置索引
  58. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  59. #将修改记录保存起来
  60. book_rework0 = pd.DataFrame([{
  61. '姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
  62. '学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
  63. '书籍编号':books_id,
  64. '修改列':'全部',
  65. '原来-现在':f'增加《{books_name}{books_count}本',
  66. '修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
  67. }])
  68. book_rework = pd.concat([book_rework,book_rework0]).reset_index(drop=True)
  69. book_rework.to_csv(resource_path(os.path.join("res",'book_rework.csv')),index=False)
  70. print('录入成功!')
  71. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续录入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  72. num = Pick(2)
  73. if num == 1:
  74. continue
  75. else:
  76. return desktop.root_menu()

2.书籍查询

可以按编号、书籍名、作者进行模糊查询

  1. #2.书籍查询
  2. def book_query(id):
  3. while True:
  4. print('\n* * * * * * * * 请 选 择 查 询 方 式 * * * * * * * * \n\n\t\t 1.按书籍编号查询\n\t\t 2.按书籍名称查询\n\t\t 3.按作者查询\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  5. query_x = Pick(3)
  6. if query_x==1:
  7. while True:
  8. try:
  9. query_y = int(input('请输入查询信息:'))
  10. break
  11. except:
  12. print('请输入数字!')
  13. book_ = books.loc[books['书籍编号']==int(query_y)]
  14. elif query_x==2:
  15. query_y = input('请输入查询信息:')
  16. book_ = books[books.书籍名称.str.contains(query_y,na=False)]
  17. elif query_x==3:
  18. query_y = input('请输入查询信息:')
  19. book_ = books[books.作者.str.contains(query_y,na=False)]
  20. if len(book_)==0:
  21. print('查询书籍不存在!')
  22. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新查询\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  23. num = Pick(2)
  24. if num == 1:
  25. continue
  26. else:
  27. return desktop.root_menu()
  28. else:
  29. print('\n')
  30. print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
  31. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新查询\n\t\t 2.书籍删除\n\t\t 3.借阅登记\n\t\t 4.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  32. num = Pick(4)
  33. if num == 1:
  34. continue
  35. elif num == 2:
  36. return book_delete(id)
  37. elif num == 3:
  38. return book_borrow()
  39. else:
  40. return desktop.root_menu()

3.书籍删除  

删除对应书籍的全部信息,记录操作者和操作时间

  1. #3.书籍删除
  2. #会直接删除书籍的全部信息
  3. def book_delete(id):
  4. global books
  5. global book_rework
  6. while True:
  7. while True:
  8. try:
  9. query_y = int(input('请输入书籍编号:'))
  10. break
  11. except:
  12. print('请输入数字!')
  13. book_ = books.loc[books['书籍编号']==query_y]
  14. if len(book_)==0:
  15. print('书籍不存在!')
  16. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  17. pick = Pick(2)
  18. if pick == 1:
  19. continue
  20. else:
  21. return desktop.root_menu()
  22. else:
  23. print(book_)
  24. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.删除书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  25. pick = Pick(3)
  26. if pick ==1:
  27. print('正在删除......')
  28. #删除书籍
  29. books = books.drop(books.loc[books['书籍编号']==query_y].index, axis=0)
  30. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  31. #将修改记录保存起来
  32. book_rework0 = pd.DataFrame([{
  33. '姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
  34. '学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
  35. '书籍编号':query_y,
  36. '修改列':'全部列',
  37. '原来-现在':list(books.loc[books['书籍编号']==query_y].values),
  38. '修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
  39. }])
  40. book_rework = pd.concat([book_rework,book_rework0]).reset_index(drop=True)
  41. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  42. print('删除成功!')
  43. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续删除\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  44. pick = Pick(2)
  45. if pick == 1:
  46. continue
  47. else:
  48. return desktop.root_menu()
  49. elif pick == 2:
  50. continue
  51. else:
  52. return desktop.root_menu()

4.书籍修改

修改书籍数据,记录操作者和操作时间

  1. #4.书籍修改
  2. #需要填写修改日志
  3. def book_Rework(id):
  4. global books
  5. global book_rework
  6. while True:
  7. while True:
  8. try:
  9. query_y = int(input('请输入书籍编号:'))
  10. break
  11. except:
  12. print('请输入数字!')
  13. book_ = books.loc[books['书籍编号']==query_y]
  14. if len(book_)==0:
  15. print('书籍不存在!')
  16. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  17. pick = Pick(2)
  18. if pick == 1:
  19. continue
  20. else:
  21. return desktop.root_menu()
  22. else:
  23. print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
  24. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.修改书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  25. pick = Pick(3)
  26. if pick ==1:
  27. print('\n* * * * * * * * 请 选 择 修 改 字 段 * * * * * * * * \n\n\t\t 1.修改书籍名称\n\t\t 2.修改书籍作者\n\t\t 3.修改馆藏\n\t\t 4.修改可借\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  28. pick = Pick(3)
  29. if pick == 1:
  30. book_newname = input('请输入新的书籍名称:')
  31. #将修改记录保存起来
  32. old = books.loc[books['书籍编号'] == query_y,'书籍名称'].values
  33. book_rework0 = pd.DataFrame([{
  34. '姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
  35. '学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
  36. '书籍编号':query_y,
  37. '修改列':'书籍名称',
  38. '原来-现在':f'{old[0]}'+'-'+f'{book_newname}',
  39. '修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
  40. }])
  41. books.loc[books['书籍编号'] == query_y,'书籍名称'] = book_newname
  42. elif pick == 2:
  43. book_author = input('请输入新的作者:')
  44. #将修改记录保存起来
  45. old = books.loc[books['书籍编号'] == query_y,'作者'].values
  46. book_rework0 = pd.DataFrame([{
  47. '姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
  48. '学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
  49. '书籍编号':query_y,
  50. '修改列':'作者',
  51. '原来-现在':f'{old[0]}'+'-'+f'{book_author}',
  52. '修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
  53. }])
  54. books.loc[books['书籍编号'] == query_y,'作者'] = book_author
  55. elif pick == 3:
  56. while True:
  57. try:
  58. book_collection = int(input('请输入新的馆藏:'))
  59. break
  60. except:
  61. print('请输入数字!')
  62. #将修改记录保存起来
  63. old = books.loc[books['书籍编号'] == query_y,'馆藏'].values
  64. book_rework0 = pd.DataFrame([{
  65. '姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
  66. '学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
  67. '书籍编号':query_y,
  68. '修改列':'馆藏',
  69. '原来-现在':f'{old[0]}'+'-'+f'{book_collection}',
  70. '修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
  71. }])
  72. books.loc[books['书籍编号'] == query_y,'馆藏'] = book_collection
  73. else:
  74. while True:
  75. try:
  76. book_borrow = int(input('请输入新的可借:'))
  77. break
  78. except:
  79. print('请输入数字!')
  80. #将修改记录保存起来
  81. old = books.loc[books['书籍编号'] == query_y,'可借'].values
  82. book_rework0 = pd.DataFrame([{
  83. '姓名':administrators.loc[administrators['学号']==id]['姓名'].values[0],
  84. '学号':administrators.loc[administrators['学号']==id]['学号'].values[0],
  85. '书籍编号':query_y,
  86. '修改列':'全部列',
  87. '原来-现在':f'{old[0]}'+'-'+f'{book_borrow}',
  88. '修改时间':time.strftime("%Y-%m-%d %H:%M:%S")
  89. }])
  90. books.loc[books['书籍编号'] == query_y,'可借'] = book_borrow
  91. print('正在修改........')
  92. book_rework = pd.concat([book_rework,book_rework0]).reset_index(drop=True)
  93. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  94. book_rework.to_csv(resource_path(os.path.join("res",'book_rework.csv')),index=False)
  95. print('修改成功!')
  96. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续修改\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  97. pick = Pick(2)
  98. if pick == 1:
  99. continue
  100. else:
  101. return desktop.root_menu()
  102. elif pick == 2:
  103. continue
  104. else:
  105. return desktop.root_menu()

5.借阅登记

记录借阅者和借阅数据

  1. #5.借阅登记
  2. def book_borrow():
  3. global books
  4. global readers
  5. while True:
  6. while True:
  7. try:
  8. query_y = int(input('请输入书籍编号:'))
  9. break
  10. except:
  11. print('请输入数字!')
  12. book_ = books.loc[books['书籍编号']==query_y]
  13. if len(book_)==0:
  14. print('书籍不存在!')
  15. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  16. pick = Pick(2)
  17. if pick == 1:
  18. return book_borrow()
  19. else:
  20. return desktop.root_menu()
  21. else:
  22. print('\n')
  23. print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
  24. print('\n')
  25. #可借为0
  26. if book_['可借'].values==0 :
  27. print('书籍数量为0,无法借阅!')
  28. else:
  29. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.借阅书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  30. pick = Pick(3)
  31. if pick == 1:
  32. while True:
  33. try:
  34. booknum = int(input('请输入借阅数量:'))
  35. if booknum < 1:
  36. print('借阅数量不能小于1!')
  37. elif booknum > book_['可借'].values:
  38. print('借阅数量不能多于可借书籍!')
  39. else:
  40. break
  41. except:
  42. print('请输入数字!')
  43. while True:
  44. try:
  45. sno = int(input('请输入学号:'))
  46. break
  47. except:
  48. print('请输入数字!')
  49. name = input('请输入姓名:')
  50. major = input('请输入专业名:')
  51. #记录借阅 readers.csv
  52. print('正在借阅......')
  53. readers0 = pd.DataFrame([{
  54. '学号':sno,
  55. '姓名':name,
  56. '专业':major,
  57. '书籍编号':query_y,
  58. '书籍名':(books.loc[books['书籍编号']==query_y]['书籍名称'].values)[0],
  59. '作者':(books.loc[books['书籍编号']==query_y]['作者'].values)[0],
  60. '数量':booknum,
  61. '借阅/归还':'借阅',
  62. '时间':time.strftime("%Y-%m-%d %H:%M:%S")
  63. }])
  64. readers = pd.concat([readers,readers0]).reset_index(drop=True)
  65. readers.to_csv(resource_path(os.path.join("res",'readers.csv')),index=False)
  66. #书籍表更改
  67. books.loc[books['书籍编号'] == query_y,'可借'] -= booknum
  68. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  69. elif pick == 2:
  70. continue
  71. else:
  72. return desktop.root_menu()
  73. print('借阅成功!')
  74. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续借阅\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  75. pick = Pick(2)
  76. if pick == 1:
  77. continue
  78. else:
  79. return desktop.root_menu()

6.归还登记

记录归还者和归还记录

  1. #6.归还登记
  2. def book_return():
  3. global readers
  4. global books
  5. while True:
  6. while True:
  7. try:
  8. sno = int(input('请输入学号:'))
  9. break
  10. except:
  11. print('请输入数字!')
  12. name = input('请输入姓名:')
  13. major = input('请输入专业名:')
  14. newdf = pd.DataFrame(readers[readers['学号']==sno].groupby(by=['书籍编号','书籍名称','作者'],as_index=False)['数量'].agg(sum)).rename(columns={'数量':'未归还数量'})
  15. newdf = newdf[newdf['未归还数量']>0]
  16. if len(newdf) == 0:
  17. print('您未借阅过任何书籍!')
  18. else:
  19. print(newdf)
  20. while True:
  21. try:
  22. query_y = int(input('请输入书籍编号:'))
  23. break
  24. except:
  25. print('请输入数字!')
  26. newdf_ = newdf.loc[newdf['书籍编号']==query_y]
  27. if len(newdf_)==0:
  28. print('书籍不存在!')
  29. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  30. pick = Pick(2)
  31. if pick == 1:
  32. continue
  33. else:
  34. return desktop.root_menu()
  35. else:
  36. print(newdf_)
  37. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.归还书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  38. pick = Pick(3)
  39. if pick == 1:
  40. while True:
  41. try:
  42. booknum = int(input('请输入归还数量:'))
  43. if booknum < 1:
  44. print('归还数量不能小于1!')
  45. elif booknum > newdf_['未归还数量'].values:
  46. print('归还数量不能多于借出的数量!')
  47. else:
  48. break
  49. except:
  50. print('请输入数字!')
  51. #归还登记 readers.csv
  52. print('正在归还......')
  53. readers0 = pd.DataFrame([{
  54. '学号':sno,
  55. '姓名':name,
  56. '专业':major,
  57. '书籍编号':query_y,
  58. '书籍名称':(books.loc[books['书籍编号']==query_y]['书籍名称'].values)[0],
  59. '作者':(books.loc[books['书籍编号']==query_y]['作者'].values)[0],
  60. '数量':-booknum,
  61. '借阅/归还':'归还',
  62. '时间':time.strftime("%Y-%m-%d %H:%M:%S")
  63. }])
  64. readers = pd.concat([readers,readers0]).reset_index(drop=True)
  65. readers.to_csv(resource_path(os.path.join("res",'readers.csv')),index=False)
  66. #bookS表改变
  67. books.loc[books['书籍编号'] == query_y,'可借'] += booknum
  68. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  69. print('归还成功!')
  70. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续归还\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  71. pick = Pick(2)
  72. if pick == 1:
  73. continue
  74. else:
  75. return desktop.root_menu()
  76. elif pick == 2:
  77. continue
  78. else:
  79. return desktop.root_menu()

7.读者信息

可以改变读者的密码等操作

  1. #7.读者信息
  2. def readers_news():
  3. #读者可以通过这个找回丢失的密码
  4. global user
  5. while True:
  6. while True:
  7. try:
  8. u_id = int(input('请输入用户学号:'))
  9. break
  10. except:
  11. print('请输入数字!')
  12. name = input('请输入用户姓名:')
  13. major = input('请输入用户专业名:')
  14. #查找
  15. user_ = user.loc[(user['学号'] == u_id )].loc[user['姓名']==name].loc[user['专业'] == major]
  16. if len(user_)==0:
  17. print('用户不存在!')
  18. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  19. pick = Pick(2)
  20. if pick == 1:
  21. continue
  22. else:
  23. return desktop.root_menu()
  24. else:
  25. print(tabulate(user_, headers = 'keys', tablefmt = 'pretty'))
  26. #可以对学生信息进行修改
  27. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.修改邮箱\n\t\t 2.修改密码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  28. pick = Pick(3)
  29. if pick == 1 :
  30. while True:
  31. try:
  32. new_email = input('请输入新的邮箱账号:')
  33. code_x = main_desktop.to_email(new_email,0)
  34. while True:
  35. code_y = input('请输入验证码:')
  36. if code_x == code_y:
  37. print('正在修改.......')
  38. user.loc[(user['学号'] == u_id) & (user['姓名']==name) &(user['专业'] == major),'邮箱'] = new_email
  39. print('修改成功!')
  40. pick = 0 #退出
  41. break
  42. else:
  43. print('验证码输入错误!')
  44. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入邮箱\n\t\t 2.重新输入验证码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  45. pick = Pick(3)
  46. if pick == 1:
  47. break
  48. elif pick == 2:
  49. continue
  50. else:
  51. return desktop.root_menu()
  52. except:
  53. print('邮箱账号错误!')
  54. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  55. pick = Pick(2)
  56. if pick == 1:
  57. continue
  58. else:
  59. return desktop.root_menu()
  60. if pick == 2:
  61. continue
  62. elif pick == 0:
  63. break
  64. elif pick == 2:
  65. while True:
  66. new_password = input('请输入密码:')
  67. if (len(new_password)<6) or (len(new_password)>10):
  68. print('密码应该长度大于6且小于10')
  69. else:
  70. if main_desktop.count(new_password): #正确就退出
  71. break
  72. user.loc[(user['学号'] == u_id) & (user['姓名']==name) &(user['专业'] == major),'密码'] = new_password
  73. user.to_csv(resource_path(os.path.join("res",'user.csv')),index=False)
  74. print('修改成功!')
  75. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续修改\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  76. pick = Pick(2)
  77. if pick == 1:
  78. continue
  79. else:
  80. return desktop.root_menu()

 三、读者系统

功能

1.书籍查询

2.自主还书

3.个人信息

4.自主借阅

类似于管理员系统

代码

  1. #user_function.py
  2. #用于存放读者的各种功能
  3. from tabulate import tabulate
  4. import pandas as pd
  5. import desktop
  6. import main_desktop
  7. import time
  8. import sys
  9. import os
  10. #生成资源文件目录访问路径
  11. def resource_path(relative_path):
  12. if getattr(sys, 'frozen', False): #是否Bundle Resource
  13. base_path = sys._MEIPASS
  14. else:
  15. base_path = os.path.abspath(".")
  16. return os.path.join(base_path, relative_path)
  17. #访问res文件夹下数据
  18. #各种表格
  19. user = pd.read_csv(resource_path(os.path.join("res","user.csv"))) #读者账号表
  20. books = pd.read_csv(resource_path(os.path.join("res","books.csv"))) #书籍表
  21. readers = pd.read_csv(resource_path(os.path.join("res","readers.csv"))) #读者借阅\归还记录
  22. #选择编码
  23. def Pick(number):
  24. while True:
  25. try:
  26. pick = int(input('请输入需要的编号:'))
  27. if pick not in [i for i in range(1,number+1)]:
  28. print('编号无效!请重新输入!')
  29. continue
  30. else:
  31. break
  32. except:
  33. print('请输入数字!')
  34. return pick
  35. #1.书籍查询
  36. def book_query():
  37. while True:
  38. print('\n* * * * * * * * 请 选 择 查 询 方 式 * * * * * * * * \n\n\t\t 1.按书籍编号查询\n\t\t 2.按书籍名称查询\n\t\t 3.按作者查询\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  39. query_x = Pick(3)
  40. if query_x==1:
  41. while True:
  42. try:
  43. query_y = int(input('请输入查询信息:'))
  44. break
  45. except:
  46. print('请输入数字!')
  47. book_ = books.loc[books['书籍编号']==int(query_y)]
  48. elif query_x==2:
  49. query_y = input('请输入查询信息:')
  50. book_ = books[books.书籍名称.str.contains(query_y)]
  51. elif query_x==3:
  52. query_y = input('请输入查询信息:')
  53. book_ = books[books.作者.str.contains(query_y)]
  54. if len(book_)==0:
  55. print('查询书籍不存在!')
  56. else:
  57. print('\n')
  58. print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
  59. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新查询\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  60. num = Pick(2)
  61. if num == 1:
  62. continue
  63. else:
  64. return desktop.user_menu()
  65. #2.自主还书(先打印这个读者借阅的书籍数据)
  66. def book_return(id):
  67. global readers
  68. global books
  69. while True:
  70. newdf = pd.DataFrame(readers[readers['学号']==id].groupby(by=['书籍编号','书籍名称','作者'],as_index=False)['数量'].agg(sum)).rename(columns={'数量':'未归还数量'})
  71. newdf = newdf[newdf['未归还数量']>0]
  72. if len(newdf) == 0:
  73. print('您未借阅过任何书籍!')
  74. else:
  75. print(tabulate(newdf, headers = 'keys', tablefmt = 'pretty'))
  76. while True:
  77. try:
  78. query_y = int(input('请输入要归还的书籍编号:'))
  79. break
  80. except:
  81. print('请输入数字!')
  82. newdf_ = newdf.loc[newdf['书籍编号']==query_y]
  83. if len(newdf_)==0:
  84. print('您未借阅该书籍!')
  85. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  86. pick = Pick(2)
  87. if pick == 1:
  88. continue
  89. else:
  90. return desktop.user_menu()
  91. else:
  92. print(tabulate(newdf_, headers = 'keys', tablefmt = 'pretty'))
  93. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.归还书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  94. pick = Pick(3)
  95. if pick == 1:
  96. while True:
  97. try:
  98. booknum = int(input('请输入归还数量:'))
  99. if booknum < 1:
  100. print('归还数量不能小于1!')
  101. elif booknum > newdf_['未归还数量'].values:
  102. print('归还数量不能多于借出的数量!')
  103. else:
  104. break
  105. except:
  106. print('请输入数字!')
  107. #归还登记 readers.csv
  108. print('正在归还......')
  109. readers0 = pd.DataFrame([{
  110. '学号':id,
  111. '姓名':user.loc[user['学号']==id]['姓名'][0],
  112. '专业':user.loc[user['学号']==id]['专业'][0],
  113. '书籍编号':query_y,
  114. '书籍名称':(books.loc[books['书籍编号']==query_y]['书籍名称'].values)[0],
  115. '作者':(books.loc[books['书籍编号']==query_y]['作者'].values)[0],
  116. '数量':-booknum,
  117. '借阅/归还':'归还',
  118. '时间':time.strftime("%Y-%m-%d %H:%M:%S")
  119. }])
  120. readers = pd.concat([readers,readers0]).reset_index(drop=True)
  121. readers.to_csv(resource_path(os.path.join("res",'readers.csv')),index=False)
  122. #bookS表改变
  123. books.loc[books['书籍编号'] == query_y,'可借'] += booknum
  124. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  125. print('归还成功!')
  126. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续归还\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  127. pick = Pick(2)
  128. if pick == 1:
  129. continue
  130. else:
  131. return desktop.user_menu()
  132. elif pick == 2:
  133. continue
  134. else:
  135. return desktop.user_menu()
  136. #3.个人信息
  137. def readers_news(id):
  138. #读者可以通过这个找更改密码
  139. global user
  140. #查找
  141. while True:
  142. user_ = user.loc[(user['学号'] == id )]
  143. print(tabulate(user_, headers = 'keys', tablefmt = 'pretty'))
  144. #可以对学生信息进行修改
  145. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.修改邮箱\n\t\t 2.修改密码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  146. pick = Pick(3)
  147. if pick == 1 :
  148. while True:
  149. try:
  150. new_email = input('请输入新的邮箱账号:')
  151. code_x = main_desktop.to_email(new_email,0)
  152. while True:
  153. code_y = input('请输入验证码:')
  154. if code_x == code_y:
  155. print('正在修改.......')
  156. user.loc[(user['学号'] == id),'邮箱'] = new_email
  157. print('修改成功!')
  158. pick = 0 #退出
  159. break
  160. else:
  161. print('验证码输入错误!')
  162. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入邮箱\n\t\t 2.重新输入验证码\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  163. pick = Pick(3)
  164. if pick == 1:
  165. break
  166. elif pick == 2:
  167. continue
  168. else:
  169. return desktop.user_menu()
  170. except:
  171. print('邮箱账号错误!')
  172. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  173. pick = Pick(2)
  174. if pick == 1:
  175. continue
  176. else:
  177. return desktop.user_menu()
  178. if pick == 2:
  179. continue
  180. elif pick == 0:
  181. break
  182. elif pick == 2:
  183. while True:
  184. new_password = input('请输入密码:')
  185. if (len(new_password)<6) or (len(new_password)>10):
  186. print('密码应该长度大于6且小于10')
  187. else:
  188. if main_desktop.count(new_password): #正确就退出
  189. break
  190. user.loc[(user['学号'] == id),'密码'] = new_password
  191. user.to_csv(resource_path(os.path.join("res",'user.csv')),index=False)
  192. print('修改成功!')
  193. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续修改\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  194. pick = Pick(2)
  195. if pick == 1:
  196. continue
  197. else:
  198. return desktop.user_menu()
  199. else:
  200. return desktop.user_menu()
  201. #4.自主借阅
  202. def book_borrow(id):
  203. global books
  204. global readers
  205. while True:
  206. while True:
  207. try:
  208. query_y = int(input('请输入书籍编号:'))
  209. break
  210. except:
  211. print('请输入数字!')
  212. book_ = books.loc[books['书籍编号']==query_y]
  213. if len(book_)==0:
  214. print('书籍不存在!')
  215. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.重新输入\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  216. pick = Pick(2)
  217. if pick == 1:
  218. return book_borrow()
  219. else:
  220. return desktop.root_menu()
  221. else:
  222. print('\n')
  223. print(tabulate(book_, headers = 'keys', tablefmt = 'pretty'))
  224. print('\n')
  225. #可借为0
  226. if book_['可借'].values==0 :
  227. print('书籍数量为0,无法借阅!')
  228. else:
  229. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.借阅书籍\n\t\t 2.重新输入\n\t\t 3.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  230. pick = Pick(3)
  231. if pick == 1:
  232. while True:
  233. try:
  234. booknum = int(input('请输入借阅数量:'))
  235. if booknum < 1:
  236. print('借阅数量不能小于1!')
  237. elif booknum > book_['可借'].values:
  238. print('借阅数量不能多于可借书籍!')
  239. else:
  240. break
  241. except:
  242. print('请输入数字!')
  243. #记录借阅 readers.csv
  244. print('正在借阅......')
  245. readers0 = pd.DataFrame([{
  246. '学号':id,
  247. '姓名':user.loc[user['学号']==id]['姓名'][0],
  248. '专业':user.loc[user['学号']==id]['专业'][0],
  249. '书籍编号':query_y,
  250. '书籍名':(books.loc[books['书籍编号']==query_y]['书籍名称'].values)[0],
  251. '作者':(books.loc[books['书籍编号']==query_y]['作者'].values)[0],
  252. '数量':booknum,
  253. '借阅/归还':'借阅',
  254. '时间':time.strftime("%Y-%m-%d %H:%M:%S")
  255. }])
  256. readers = pd.concat([readers,readers0]).reset_index(drop=True)
  257. readers.to_csv(resource_path(os.path.join("res",'readers.csv')),index=False)
  258. #书籍表更改
  259. books.loc[books['书籍编号'] == query_y,'可借'] -= booknum
  260. books.to_csv(resource_path(os.path.join("res",'books.csv')),index=False)
  261. elif pick == 2:
  262. continue
  263. else:
  264. return desktop.root_menu()
  265. print('借阅成功!')
  266. print('\n* * * * * * * * 请 选 择 所 需 功 能 * * * * * * * * \n\n\t\t 1.继续借阅\n\t\t 2.返回首页\n\n* * * * * * * * * * * * * * * * * * * * * * * * * *\n')
  267. pick = Pick(2)
  268. if pick == 1:
  269. continue
  270. else:
  271. return desktop.root_menu()
  272. #5.退出登录
  273. def sign_out():
  274. return desktop.home_page()

链接:https://pan.baidu.com/s/1-lpT9-TtKCEUh9fkRIopkw 
提取码:ljyx

注:main_desktop.py中QQ和QQ授权码需要换成自己的!!!!!!

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

闽ICP备14008679号