鱼C论坛

 找回密码
 立即注册
查看: 4911|回复: 3

[已解决]1请问哪位鱼油会做图书管理系统链式存储结构(用python语言描述来做)

[复制链接]
发表于 2021-4-17 16:46:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请求那位鱼油可以做一个图书管理系统链式存储结构,用python做
最佳答案
2023-4-8 16:59:17
13340865629 发表于 2023-4-2 15:57
已经自学做出来了

  1. def logon():
  2.     print("欢迎来到图书管理系统注册页面~")
  3.     username = input("请输入用户名:")
  4.     if len(username) < 6:
  5.         print("用户名不能小于6个字符")
  6.     else:
  7.         email = input("请输入邮箱:")
  8.         password = input("请输入密码:")
  9.         if len(password) < 8:
  10.             print("密码不能少于8位")
  11.         else:
  12.             rpassword = input("请确认密码:")
  13.             if password == rpassword:
  14.                 print("注册成功!")
  15.                 # 函数调用,每追加一列数据都进行换行 每个数据之间都有空格
  16.                 preserve_data(path, [username, '   ' + email, '   ' + password + '\n'])
  17.                 login_tips = input('是否登录?(yes/no)')
  18.                 if login_tips == 'yes':
  19.                     login()
  20.                 else:
  21.                     pass
  22.                 return True
  23.             else:
  24.                 print("两次输入的密码不一致,请重新输入!")
  25.                 # 递归调用
  26.                 logon()


  27. # 保存数据到文件
  28. path = r'C:\Users\ASUS\Desktop\2021课程\python\User.txt'


  29. def preserve_data(file_path, data):
  30.     # 将字符串转换为bytes,因为write写入的是字节流,不能是字符串 当为w时需要解码
  31.     # data = data.encode()
  32.     # 打开文件,追加数据到文件
  33.     with open(file_path, 'a') as wstream:
  34.         # 判断是否可写
  35.         if wstream.writable():
  36.             wstream.writelines(data)
  37.         else:
  38.             print("没有权限!")


  39. # 用户登录
  40. def login():
  41.     print("欢迎来到图书管理系统登录页面~")
  42.     tips = input("是否已经注册?(yes/no)")
  43.     if tips == 'yes':
  44.         while True:
  45.             username = input("输入用户名:")
  46.             password = input("输入密码:")
  47.             # 读取文件时可能会出现找不到文件的异常,因此使用try except
  48.             try:
  49.                 # 读取文件中的内容
  50.                 with open(path, 'rb') as stream:
  51.                     # 读取多行保存到列表中,列表中保存的是二进制,字节
  52.                     result = stream.readlines()
  53.                     # print(result)
  54.                     # 列表推导式,循环遍历列表,将字节解码为字符串放在一个新列表uesr_list
  55.                     uesr_list = [i.decode() for i in result]
  56.                     # print(uesr_list)
  57.                     # 循环遍历列表,检查输入的用户名和密码是否在字符串中
  58.                     for i in uesr_list:
  59.                         info = i.split('   ')
  60.                         print(info)
  61.                         if username == info[0] and password == info[2].rstrip('\r\n'):
  62.                             print("登录成功")
  63.                             operate(book_path, username)
  64.                             break
  65.                     else:
  66.                         print(info[0])
  67.                         print(info[2])
  68.                         raise Exception("用户名或密码错误,请重新输入!")

  69.             except Exception as err:
  70.                 print(err)
  71.             # 没有异常时执行else语句
  72.             else:
  73.                 break
  74.     else:
  75.         print("您还未注册,请先注册后再登录!")
  76.         # 递归
  77.         logon()


  78. # 查询图书
  79. def find_books(path):
  80.     try:
  81.         with open(path, 'r') as rstream:
  82.             # readlines读到的内容是一个列表
  83.             container = rstream.readlines()
  84.             # 通过列表推导式得到新的列表,即每个元素去掉后面的换行符号
  85.             new_container = [books_name.rstrip('\n') for books_name in container]
  86.             for b_name in new_container:
  87.                 # 打印图书+《》
  88.                 print("《{}》".format(b_name))

  89.     except Exception as err:
  90.         print("错误原因:", err)


  91. # 添加图书
  92. def add_book(b_path, username):
  93.     # 添加前首先判断是否是管理员
  94.     permission(b_path, username)
  95.     # 追加图书 不能是w ,否则会清空之前的内容
  96.     with open(b_path, 'a') as wstream:
  97.         # 判断是否可写
  98.         if wstream.writable:
  99.             msg = input("请输入书名:")
  100.             try:
  101.                 # 添加书籍之前判断某本书是否已经添加
  102.                 with open(b_path) as rstream:
  103.                     while True:
  104.                         line = rstream.readline()
  105.                         # 去掉右边的换行
  106.                         line = line.rstrip('\n')
  107.                         # 当找到空行是如果还没有找到与输入的书名一致的时候,就添加输入的书名
  108.                         if not line:
  109.                             book = '\n' + msg
  110.                             wstream.write(book)
  111.                             print("添加成功")
  112.                             break
  113.                         else:
  114.                             # 输入的图书和读到的行有一致的则提示不能重复添加
  115.                             if line == msg:
  116.                                 print("{}已添加,请不要重复添加哦~".format(msg))
  117.                                 break
  118.             except Exception as err:
  119.                 print("错误原因:", err)
  120.         else:
  121.             print("没有权限")


  122. # 修改图书
  123. def update_book(b_path, username):
  124.     permission(b_path, username)
  125.     try:
  126.         with open(b_path, 'r') as rstream:
  127.             container = rstream.read()
  128.             # 通过'\n'来分割字符串,返回结果是列表
  129.             container = container.split('\n')
  130.             # print(container)
  131.             # 删除前先展示有哪些图书
  132.             find_books(book_path)
  133.             book_name = input("请输入需要修改的图书书名:")
  134.             # 循环遍历修改书名
  135.             for i in range(len(container)):
  136.                 if book_name == container[i]:
  137.                     rbook_name = input("请输入修改后的图书书名:")
  138.                     container[i] = rbook_name + '\n'
  139.                 else:
  140.                     # 列表中的每个书名后面加换行符,用于写入文件时换行
  141.                     container[i] = container[i] + '\n'
  142.             # print(container)
  143.             # 将书名更新后的内容以writelines写入文件中  writelines(可迭代)
  144.             with open(b_path, 'w') as wwstream:
  145.                 wwstream.writelines(container)
  146.             print("修改成功")
  147.     except Exception as err:
  148.         print("错误原因:", err)


  149. # 删除图书
  150. def del_book(b_path, username):
  151.     permission(path, username)
  152.     try:
  153.         with open(b_path, 'r') as rstream:
  154.             container = rstream.read()
  155.             # 通过'\n'来分割字符串,返回结果是列表
  156.             container = container.split('\n')
  157.             # print(container)
  158.             # 展示有哪些图书
  159.             find_books(book_path)
  160.             book_name = input("请输入需要删除的图书书名:")
  161.             # 循环遍历修改书名
  162.             for i in range(len(container) - 1):
  163.                 if book_name == container[i]:
  164.                     container.remove(container[i])
  165.                 else:
  166.                     # 列表中的每个书名后面加换行符,用于写入文件时换行
  167.                     container[i] = container[i] + '\n'
  168.             # print(container)
  169.             # 将书名删除后的内容以writelines写入文件中  writelines(可迭代)
  170.             with open(b_path, 'w') as wwstream:
  171.                 wwstream.writelines(container)
  172.             print("删除成功")
  173.     except Exception as err:
  174.         print("错误原因:", err)


  175. # 借书
  176. def borrow_book(username):
  177.     while True:
  178.         print("图书列表:")
  179.         find_books(book_path)
  180.         borrow_books = input("请选择图书:")
  181.         try:
  182.             with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt') as rstream:
  183.                 # 每次读取一行
  184.                 lines = rstream.readline()
  185.                 lines = lines.rstrip('\n')
  186.                 # 将读到的内容通过空格分割保存到列表
  187.                 lines = lines.split(' ')
  188.                 # 判断输入的书是否已被借走
  189.                 if borrow_books not in lines:
  190.                     # print(lines)
  191.                     # 借书之前先判断该用户之前是否借过,如果借过,就在后面累加图书,用,分割图书
  192.                     # for user_book in lines:
  193.                     if username in lines:
  194.                         with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt', 'a') as wstream:
  195.                             # 判断之前是否借过某本书
  196.                             if borrow_books not in lines:
  197.                                 wstream.write(' {}'.format(borrow_books))
  198.                                 print("借书成功")
  199.                                 break
  200.                             else:
  201.                                 print("您已借过此书,请从新选择!")
  202.                                 break
  203.                     else:
  204.                         # 将选择的图书与用户名一起保存到文件中
  205.                         with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt', 'a') as wstream:
  206.                             wstream.write('\n{} {}\n'.format(username, borrow_books))
  207.                             print("借书成功")
  208.                             break
  209.                 else:
  210.                     print("<<{}>>已被用户{}借走,请重新选择~".format(borrow_books, lines[0]))
  211.         except Exception as err:
  212.             print("错误原因:", err)


  213. # 还书
  214. def return_book(username):
  215.     try:
  216.         with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt') as rstream:
  217.             # print("{}您已借阅,未归还图书如下:".format(username))
  218.             # 读到的结果是列表
  219.             lines = rstream.readlines()
  220.             # 遍历列表,将里面的元素再拆分为列表
  221.             for i in range(len(lines)):
  222.                 # 去掉换行
  223.                 lines[i] = lines[i].rstrip('\n')
  224.                 lines[i] = lines[i].rstrip(' ')
  225.                 lines[i] = lines[i].split(' ')
  226.                 for ii in range(len(lines[i]) - 1):
  227.                     # 只打印登录用户借阅的图书
  228.                     if username == lines[i][0]:
  229.                         print("{}您已借阅,未归还图书如下:".format(username))
  230.                         print(lines[i][ii + 1])
  231.                         msg = input("请选择你要归还的图书:")
  232.                         with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt') as rstream:
  233.                             lines = rstream.readlines()
  234.                             for i in range(len(lines)):
  235.                                 if username in lines[i] and msg in lines[i]:
  236.                                     # 用空字符串替换msg,即表示删除归还的图书
  237.                                     lines[i] = lines[i].replace(msg, '')
  238.                                     with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt', 'w') as wstream:
  239.                                         # 将变更后的列表再写入文件,只变更当前用户的图书信息
  240.                                         wstream.writelines(lines)
  241.                                         print("归还成功!")
  242.                                         break

  243.                             with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt') as rstream:
  244.                                 lines = rstream.readlines()
  245.                                 for i in range(len(lines)):
  246.                                     lines[i] = lines[i].rstrip('\n')
  247.                                     lines[i] = lines[i].rstrip(' ')
  248.                                     lines[i] = lines[i].split(' ')
  249.                                     # print(type(lines[i]))
  250.                                     for ii in range(len(lines[i])):
  251.                                         # 图书归还成功后判断列表中只有用户名了,如果只有用户名则将用户名用空字符串代替
  252.                                         if username == lines[i][0] and len(lines[i]) == 1:
  253.                                             lines[i][0] = lines[i][0].replace(lines[i][0], '')
  254.                                             lines.append(lines[i][0])
  255.                                 # print(lines)
  256.                                 str = ''
  257.                                 for i in range(len(lines)):
  258.                                     for ii in range(len(lines[i])):
  259.                                         # 将嵌套列表中的元素取出来拼接成字符串
  260.                                         str += lines[i][ii] + ' '
  261.                                     str += '\n'
  262.                                 # 遍历完毕删除之前列表里面嵌套的列表,追加字符串str
  263.                                 lines.clear()
  264.                                 lines.append(str)

  265.                                 # print(lines)
  266.                                 # 将更新后的列表写入文件
  267.                                 with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt', 'w') as wstream:
  268.                                     wstream.writelines(lines)
  269.                     else:
  270.                         print("您还没有借阅记录哦~")

  271.     except Exception as err:
  272.         print("错误原因:", err)


  273. # 查看个人信息
  274. def look_person_info(path, username):
  275.     with open(path) as rstream:
  276.         lines = rstream.readlines()
  277.         # print(lines)
  278.         for info in lines:
  279.             # 分割成一个列表
  280.             info = info.split('   ')
  281.             # print(info)
  282.             if username in info:
  283.                 print("----个人信息----")
  284.                 print("用户名:", info[0])
  285.                 print("邮箱:", info[1])
  286.                 print("密码:", info[2].rstrip(' '))


  287. # 修改个人信息
  288. def update_password(path, username):
  289.     tips = input("请选择操作:\n 1.修改邮箱\n 2.修改密码\n")

  290.     # 修改邮箱
  291.     if tips == '1':
  292.         new_email = ''
  293.         line = []
  294.         try:
  295.             with open(path) as rstream:
  296.                 while True:
  297.                     line = rstream.readline()
  298.                     if not line:
  299.                         break
  300.                     line = line.split('   ')
  301.                     # 去掉密码后面的换行符
  302.                     line[2] = line[2].rstrip('\n')
  303.                     if username == line[0]:
  304.                         new_email = input("请输入新邮箱:")
  305.                         line[1] = new_email
  306.                         break
  307.         except Exception as err:
  308.             print(err)

  309.         else:
  310.             # 将新修改邮箱后的用户的所有信息追加到文件夹
  311.             with open(path, 'a') as wstream:
  312.                 for i in range(len(line)):
  313.                     if i == 0:
  314.                         # 遍历列表,第一个列表元素需要前面需要加换行,后面需要加空格与其他元素分割
  315.                         line[i] = '\n' + line[i] + '   '
  316.                     else:
  317.                         line[i] = line[i] + '   '
  318.                 wstream.writelines(line)
  319.                 print("修改成功")
  320.             # 删除修改邮箱之前用户的信息
  321.             with open(path) as rstream:
  322.                 # 读取多行
  323.                 lines = rstream.readlines()
  324.                 i = 0
  325.                 l = len(lines)
  326.                 while i < l:
  327.                     # 当前用户名在用户信息行且新的邮箱不在时就删除之前的用户信息,不会删除其他用户的信息
  328.                     if username in lines[i] and new_email not in lines[i]:
  329.                         lines.remove(lines[i])
  330.                     i += 1
  331.                     l -= 1
  332.                 # 删除旧邮箱对应的当前用户信息后,再将新邮箱对应的用户信息以及其他用户的信息从新写入到文件
  333.                 with open(path, 'w') as wstream:
  334.                     wstream.writelines(lines)
  335.     # 修改密码
  336.     elif tips == '2':
  337.         new_password = ''
  338.         line = []
  339.         try:
  340.             with open(path) as rstream:
  341.                 while True:
  342.                     line = rstream.readline()
  343.                     if not line:
  344.                         break
  345.                     line = line.split('   ')
  346.                     # 去掉密码后面的换行符
  347.                     line[2] = line[2].rstrip('\n')
  348.                     if username == line[0]:
  349.                         new_password = input("请输入新密码:")
  350.                         # 判断新密码与旧密码是否一致
  351.                         if new_password == line[2]:
  352.                             # 抛出异常
  353.                             raise Exception("新密码不能与旧密码相同哦~")
  354.                         else:
  355.                             line[2] = new_password
  356.                             break
  357.         # 可以捕获到前面raise抛出的异常
  358.         except Exception as err:
  359.             print(err)

  360.         else:
  361.             # 将新修改密码后的用户的所有信息追加到文件夹
  362.             with open(path, 'a') as wstream:
  363.                 for i in range(len(line)):
  364.                     if i == 0:
  365.                         # 遍历列表,第一个列表元素需要前面需要加换行,后面需要加空格与其他元素分割
  366.                         line[i] = '\n' + line[i] + '   '
  367.                     else:
  368.                         line[i] = line[i] + '   '
  369.                 wstream.writelines(line)
  370.                 print("修改成功")
  371.             # 删除修改密码之前用户的信息
  372.             with open(path) as rstream:
  373.                 # 读取多行
  374.                 lines = rstream.readlines()
  375.                 i = 0
  376.                 l = len(lines)
  377.                 while i < l:
  378.                     # 当 当前用户名在用户信息行且新的密码不在时就删除之前的用户信息,不会删除其他用户的信息
  379.                     if username in lines[i] and new_password not in lines[i]:
  380.                         lines.remove(lines[i])
  381.                     i += 1
  382.                     l -= 1
  383.                 # 删除旧密码对应的当前用户信息后,再将新密码对应的用户信息以及其他用户的信息从新写入到文件
  384.                 with open(path, 'w') as wstream:
  385.                     wstream.writelines(lines)


  386. # 个人信息
  387. def person_information(path, username):
  388.     tips = input("请选择操作:\n 1.查看个人信息\n 2.修改个人信息\n")
  389.     if tips == '1':
  390.         look_person_info(path, username)
  391.     elif tips == '2':
  392.         update_password(path, username)


  393. # 只有管理员才可以进行图书的增删改操作
  394. user_path = r'C:\Users\ASUS\Desktop\2021课程\python\book.txt'
  395. def permission(user_path, username):
  396.     try:
  397.         with open(user_path) as rstream:
  398.             while True:
  399.                 line = rstream.readline()
  400.                 # 读到空行跳出循环
  401.                 if not line:
  402.                     break
  403.                 # 通过3个空格将字符串line分割为一个列表,存储三个值
  404.                 line = line.split('   ')
  405.                 # 循环遍历列表,去掉列表中每个元素后面的换行,如果有就去掉,没有就不取掉
  406.                 for i in range(len(line)):
  407.                     line[i] = line[i].rstrip('\n')
  408.                 # 判断是否管理员,如果是就可以进行添加操作
  409.                 if username == 'adm':
  410.                     pass
  411.                 else:
  412.                     print("只有管理adm才可以进行该操作~")
  413.                     # 不是管理员将回到操作页面
  414.                     operate(path, username)
  415.     except Exception as err:
  416.         print("错误原因:", err)


  417. # 图书增删改借还操作
  418. book_path = r'C:\Users\ASUS\Desktop\2021课程\python\book.txt'


  419. # book_list = ['水浒传\n','红楼梦\n','廊桥遗梦']
  420. def operate(b_path,username):
  421.     if username == 'adm':
  422.         while True:
  423.             msg = input("请选择操作:\n 1.查询图书\n 2.添加图书\n 3.修改图书\n 4.删除图书\n 5.借书\n 6.归还图书\n 7.个人信息\n 8.退出登录\n")
  424.         # 查询图书
  425.             if msg =='1':
  426.                 find_books(book_path)
  427.         # 添加图书
  428.             elif msg =='2':
  429.                 add_book(b_path, username)
  430.         # 修改图书
  431.             elif msg =='3':
  432.                 update_book(b_path, username)
  433.         # 删除图书
  434.             elif msg =='4':
  435.                 del_book(b_path, username)
  436.         # 借书
  437.             elif msg =='5':
  438.                 borrow_book(username)
  439.         # 还书
  440.             elif msg =='6':
  441.                 return_book(username)
  442.         #查看、修改个人信息
  443.             elif msg =='7':
  444.                 person_information(path, username)

  445.         # 退出登录
  446.             elif msg =='8':
  447.                 msg = input("确定退出登录吗?(yes)")
  448.                 if msg == 'yes':
  449.                     break
  450.             else:
  451.                 print("无效操作")
  452.     else:
  453.         while True:
  454.             msg = input("请选择操作:\n 1.查询图书\n 2.借书\n 3.归还图书\n 4.个人信息\n 5.退出登录\n")
  455.         # 查询图书
  456.             if msg =='1':
  457.                 find_books(book_path)
  458.         # 借书
  459.             elif msg =='2':
  460.                 borrow_book(username)
  461.         # 还书
  462.             elif msg =='3':
  463.                 return_book(username)
  464.         #查看、修改个人信息
  465.             elif msg =='4':
  466.                 person_information(path, username)


  467.         # 退出登录
  468.             elif msg =='5':
  469.                 msg = input("确定退出登录吗?(yes)")
  470.                 if msg == 'yes':
  471.                     break
  472.             else:
  473.                 print("无效操作")



  474. login()

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-17 16:48:11 | 显示全部楼层
请问是拿来干什么用呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-2 15:57:36 | 显示全部楼层
xiaosi4081 发表于 2021-4-17 16:48
请问是拿来干什么用呢?

已经自学做出来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 16:59:17 | 显示全部楼层    本楼为最佳答案   
13340865629 发表于 2023-4-2 15:57
已经自学做出来了

  1. def logon():
  2.     print("欢迎来到图书管理系统注册页面~")
  3.     username = input("请输入用户名:")
  4.     if len(username) < 6:
  5.         print("用户名不能小于6个字符")
  6.     else:
  7.         email = input("请输入邮箱:")
  8.         password = input("请输入密码:")
  9.         if len(password) < 8:
  10.             print("密码不能少于8位")
  11.         else:
  12.             rpassword = input("请确认密码:")
  13.             if password == rpassword:
  14.                 print("注册成功!")
  15.                 # 函数调用,每追加一列数据都进行换行 每个数据之间都有空格
  16.                 preserve_data(path, [username, '   ' + email, '   ' + password + '\n'])
  17.                 login_tips = input('是否登录?(yes/no)')
  18.                 if login_tips == 'yes':
  19.                     login()
  20.                 else:
  21.                     pass
  22.                 return True
  23.             else:
  24.                 print("两次输入的密码不一致,请重新输入!")
  25.                 # 递归调用
  26.                 logon()


  27. # 保存数据到文件
  28. path = r'C:\Users\ASUS\Desktop\2021课程\python\User.txt'


  29. def preserve_data(file_path, data):
  30.     # 将字符串转换为bytes,因为write写入的是字节流,不能是字符串 当为w时需要解码
  31.     # data = data.encode()
  32.     # 打开文件,追加数据到文件
  33.     with open(file_path, 'a') as wstream:
  34.         # 判断是否可写
  35.         if wstream.writable():
  36.             wstream.writelines(data)
  37.         else:
  38.             print("没有权限!")


  39. # 用户登录
  40. def login():
  41.     print("欢迎来到图书管理系统登录页面~")
  42.     tips = input("是否已经注册?(yes/no)")
  43.     if tips == 'yes':
  44.         while True:
  45.             username = input("输入用户名:")
  46.             password = input("输入密码:")
  47.             # 读取文件时可能会出现找不到文件的异常,因此使用try except
  48.             try:
  49.                 # 读取文件中的内容
  50.                 with open(path, 'rb') as stream:
  51.                     # 读取多行保存到列表中,列表中保存的是二进制,字节
  52.                     result = stream.readlines()
  53.                     # print(result)
  54.                     # 列表推导式,循环遍历列表,将字节解码为字符串放在一个新列表uesr_list
  55.                     uesr_list = [i.decode() for i in result]
  56.                     # print(uesr_list)
  57.                     # 循环遍历列表,检查输入的用户名和密码是否在字符串中
  58.                     for i in uesr_list:
  59.                         info = i.split('   ')
  60.                         print(info)
  61.                         if username == info[0] and password == info[2].rstrip('\r\n'):
  62.                             print("登录成功")
  63.                             operate(book_path, username)
  64.                             break
  65.                     else:
  66.                         print(info[0])
  67.                         print(info[2])
  68.                         raise Exception("用户名或密码错误,请重新输入!")

  69.             except Exception as err:
  70.                 print(err)
  71.             # 没有异常时执行else语句
  72.             else:
  73.                 break
  74.     else:
  75.         print("您还未注册,请先注册后再登录!")
  76.         # 递归
  77.         logon()


  78. # 查询图书
  79. def find_books(path):
  80.     try:
  81.         with open(path, 'r') as rstream:
  82.             # readlines读到的内容是一个列表
  83.             container = rstream.readlines()
  84.             # 通过列表推导式得到新的列表,即每个元素去掉后面的换行符号
  85.             new_container = [books_name.rstrip('\n') for books_name in container]
  86.             for b_name in new_container:
  87.                 # 打印图书+《》
  88.                 print("《{}》".format(b_name))

  89.     except Exception as err:
  90.         print("错误原因:", err)


  91. # 添加图书
  92. def add_book(b_path, username):
  93.     # 添加前首先判断是否是管理员
  94.     permission(b_path, username)
  95.     # 追加图书 不能是w ,否则会清空之前的内容
  96.     with open(b_path, 'a') as wstream:
  97.         # 判断是否可写
  98.         if wstream.writable:
  99.             msg = input("请输入书名:")
  100.             try:
  101.                 # 添加书籍之前判断某本书是否已经添加
  102.                 with open(b_path) as rstream:
  103.                     while True:
  104.                         line = rstream.readline()
  105.                         # 去掉右边的换行
  106.                         line = line.rstrip('\n')
  107.                         # 当找到空行是如果还没有找到与输入的书名一致的时候,就添加输入的书名
  108.                         if not line:
  109.                             book = '\n' + msg
  110.                             wstream.write(book)
  111.                             print("添加成功")
  112.                             break
  113.                         else:
  114.                             # 输入的图书和读到的行有一致的则提示不能重复添加
  115.                             if line == msg:
  116.                                 print("{}已添加,请不要重复添加哦~".format(msg))
  117.                                 break
  118.             except Exception as err:
  119.                 print("错误原因:", err)
  120.         else:
  121.             print("没有权限")


  122. # 修改图书
  123. def update_book(b_path, username):
  124.     permission(b_path, username)
  125.     try:
  126.         with open(b_path, 'r') as rstream:
  127.             container = rstream.read()
  128.             # 通过'\n'来分割字符串,返回结果是列表
  129.             container = container.split('\n')
  130.             # print(container)
  131.             # 删除前先展示有哪些图书
  132.             find_books(book_path)
  133.             book_name = input("请输入需要修改的图书书名:")
  134.             # 循环遍历修改书名
  135.             for i in range(len(container)):
  136.                 if book_name == container[i]:
  137.                     rbook_name = input("请输入修改后的图书书名:")
  138.                     container[i] = rbook_name + '\n'
  139.                 else:
  140.                     # 列表中的每个书名后面加换行符,用于写入文件时换行
  141.                     container[i] = container[i] + '\n'
  142.             # print(container)
  143.             # 将书名更新后的内容以writelines写入文件中  writelines(可迭代)
  144.             with open(b_path, 'w') as wwstream:
  145.                 wwstream.writelines(container)
  146.             print("修改成功")
  147.     except Exception as err:
  148.         print("错误原因:", err)


  149. # 删除图书
  150. def del_book(b_path, username):
  151.     permission(path, username)
  152.     try:
  153.         with open(b_path, 'r') as rstream:
  154.             container = rstream.read()
  155.             # 通过'\n'来分割字符串,返回结果是列表
  156.             container = container.split('\n')
  157.             # print(container)
  158.             # 展示有哪些图书
  159.             find_books(book_path)
  160.             book_name = input("请输入需要删除的图书书名:")
  161.             # 循环遍历修改书名
  162.             for i in range(len(container) - 1):
  163.                 if book_name == container[i]:
  164.                     container.remove(container[i])
  165.                 else:
  166.                     # 列表中的每个书名后面加换行符,用于写入文件时换行
  167.                     container[i] = container[i] + '\n'
  168.             # print(container)
  169.             # 将书名删除后的内容以writelines写入文件中  writelines(可迭代)
  170.             with open(b_path, 'w') as wwstream:
  171.                 wwstream.writelines(container)
  172.             print("删除成功")
  173.     except Exception as err:
  174.         print("错误原因:", err)


  175. # 借书
  176. def borrow_book(username):
  177.     while True:
  178.         print("图书列表:")
  179.         find_books(book_path)
  180.         borrow_books = input("请选择图书:")
  181.         try:
  182.             with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt') as rstream:
  183.                 # 每次读取一行
  184.                 lines = rstream.readline()
  185.                 lines = lines.rstrip('\n')
  186.                 # 将读到的内容通过空格分割保存到列表
  187.                 lines = lines.split(' ')
  188.                 # 判断输入的书是否已被借走
  189.                 if borrow_books not in lines:
  190.                     # print(lines)
  191.                     # 借书之前先判断该用户之前是否借过,如果借过,就在后面累加图书,用,分割图书
  192.                     # for user_book in lines:
  193.                     if username in lines:
  194.                         with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt', 'a') as wstream:
  195.                             # 判断之前是否借过某本书
  196.                             if borrow_books not in lines:
  197.                                 wstream.write(' {}'.format(borrow_books))
  198.                                 print("借书成功")
  199.                                 break
  200.                             else:
  201.                                 print("您已借过此书,请从新选择!")
  202.                                 break
  203.                     else:
  204.                         # 将选择的图书与用户名一起保存到文件中
  205.                         with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt', 'a') as wstream:
  206.                             wstream.write('\n{} {}\n'.format(username, borrow_books))
  207.                             print("借书成功")
  208.                             break
  209.                 else:
  210.                     print("<<{}>>已被用户{}借走,请重新选择~".format(borrow_books, lines[0]))
  211.         except Exception as err:
  212.             print("错误原因:", err)


  213. # 还书
  214. def return_book(username):
  215.     try:
  216.         with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt') as rstream:
  217.             # print("{}您已借阅,未归还图书如下:".format(username))
  218.             # 读到的结果是列表
  219.             lines = rstream.readlines()
  220.             # 遍历列表,将里面的元素再拆分为列表
  221.             for i in range(len(lines)):
  222.                 # 去掉换行
  223.                 lines[i] = lines[i].rstrip('\n')
  224.                 lines[i] = lines[i].rstrip(' ')
  225.                 lines[i] = lines[i].split(' ')
  226.                 for ii in range(len(lines[i]) - 1):
  227.                     # 只打印登录用户借阅的图书
  228.                     if username == lines[i][0]:
  229.                         print("{}您已借阅,未归还图书如下:".format(username))
  230.                         print(lines[i][ii + 1])
  231.                         msg = input("请选择你要归还的图书:")
  232.                         with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt') as rstream:
  233.                             lines = rstream.readlines()
  234.                             for i in range(len(lines)):
  235.                                 if username in lines[i] and msg in lines[i]:
  236.                                     # 用空字符串替换msg,即表示删除归还的图书
  237.                                     lines[i] = lines[i].replace(msg, '')
  238.                                     with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt', 'w') as wstream:
  239.                                         # 将变更后的列表再写入文件,只变更当前用户的图书信息
  240.                                         wstream.writelines(lines)
  241.                                         print("归还成功!")
  242.                                         break

  243.                             with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt') as rstream:
  244.                                 lines = rstream.readlines()
  245.                                 for i in range(len(lines)):
  246.                                     lines[i] = lines[i].rstrip('\n')
  247.                                     lines[i] = lines[i].rstrip(' ')
  248.                                     lines[i] = lines[i].split(' ')
  249.                                     # print(type(lines[i]))
  250.                                     for ii in range(len(lines[i])):
  251.                                         # 图书归还成功后判断列表中只有用户名了,如果只有用户名则将用户名用空字符串代替
  252.                                         if username == lines[i][0] and len(lines[i]) == 1:
  253.                                             lines[i][0] = lines[i][0].replace(lines[i][0], '')
  254.                                             lines.append(lines[i][0])
  255.                                 # print(lines)
  256.                                 str = ''
  257.                                 for i in range(len(lines)):
  258.                                     for ii in range(len(lines[i])):
  259.                                         # 将嵌套列表中的元素取出来拼接成字符串
  260.                                         str += lines[i][ii] + ' '
  261.                                     str += '\n'
  262.                                 # 遍历完毕删除之前列表里面嵌套的列表,追加字符串str
  263.                                 lines.clear()
  264.                                 lines.append(str)

  265.                                 # print(lines)
  266.                                 # 将更新后的列表写入文件
  267.                                 with open(r'C:\Users\ASUS\Desktop\2021课程\python\user_book.txt', 'w') as wstream:
  268.                                     wstream.writelines(lines)
  269.                     else:
  270.                         print("您还没有借阅记录哦~")

  271.     except Exception as err:
  272.         print("错误原因:", err)


  273. # 查看个人信息
  274. def look_person_info(path, username):
  275.     with open(path) as rstream:
  276.         lines = rstream.readlines()
  277.         # print(lines)
  278.         for info in lines:
  279.             # 分割成一个列表
  280.             info = info.split('   ')
  281.             # print(info)
  282.             if username in info:
  283.                 print("----个人信息----")
  284.                 print("用户名:", info[0])
  285.                 print("邮箱:", info[1])
  286.                 print("密码:", info[2].rstrip(' '))


  287. # 修改个人信息
  288. def update_password(path, username):
  289.     tips = input("请选择操作:\n 1.修改邮箱\n 2.修改密码\n")

  290.     # 修改邮箱
  291.     if tips == '1':
  292.         new_email = ''
  293.         line = []
  294.         try:
  295.             with open(path) as rstream:
  296.                 while True:
  297.                     line = rstream.readline()
  298.                     if not line:
  299.                         break
  300.                     line = line.split('   ')
  301.                     # 去掉密码后面的换行符
  302.                     line[2] = line[2].rstrip('\n')
  303.                     if username == line[0]:
  304.                         new_email = input("请输入新邮箱:")
  305.                         line[1] = new_email
  306.                         break
  307.         except Exception as err:
  308.             print(err)

  309.         else:
  310.             # 将新修改邮箱后的用户的所有信息追加到文件夹
  311.             with open(path, 'a') as wstream:
  312.                 for i in range(len(line)):
  313.                     if i == 0:
  314.                         # 遍历列表,第一个列表元素需要前面需要加换行,后面需要加空格与其他元素分割
  315.                         line[i] = '\n' + line[i] + '   '
  316.                     else:
  317.                         line[i] = line[i] + '   '
  318.                 wstream.writelines(line)
  319.                 print("修改成功")
  320.             # 删除修改邮箱之前用户的信息
  321.             with open(path) as rstream:
  322.                 # 读取多行
  323.                 lines = rstream.readlines()
  324.                 i = 0
  325.                 l = len(lines)
  326.                 while i < l:
  327.                     # 当前用户名在用户信息行且新的邮箱不在时就删除之前的用户信息,不会删除其他用户的信息
  328.                     if username in lines[i] and new_email not in lines[i]:
  329.                         lines.remove(lines[i])
  330.                     i += 1
  331.                     l -= 1
  332.                 # 删除旧邮箱对应的当前用户信息后,再将新邮箱对应的用户信息以及其他用户的信息从新写入到文件
  333.                 with open(path, 'w') as wstream:
  334.                     wstream.writelines(lines)
  335.     # 修改密码
  336.     elif tips == '2':
  337.         new_password = ''
  338.         line = []
  339.         try:
  340.             with open(path) as rstream:
  341.                 while True:
  342.                     line = rstream.readline()
  343.                     if not line:
  344.                         break
  345.                     line = line.split('   ')
  346.                     # 去掉密码后面的换行符
  347.                     line[2] = line[2].rstrip('\n')
  348.                     if username == line[0]:
  349.                         new_password = input("请输入新密码:")
  350.                         # 判断新密码与旧密码是否一致
  351.                         if new_password == line[2]:
  352.                             # 抛出异常
  353.                             raise Exception("新密码不能与旧密码相同哦~")
  354.                         else:
  355.                             line[2] = new_password
  356.                             break
  357.         # 可以捕获到前面raise抛出的异常
  358.         except Exception as err:
  359.             print(err)

  360.         else:
  361.             # 将新修改密码后的用户的所有信息追加到文件夹
  362.             with open(path, 'a') as wstream:
  363.                 for i in range(len(line)):
  364.                     if i == 0:
  365.                         # 遍历列表,第一个列表元素需要前面需要加换行,后面需要加空格与其他元素分割
  366.                         line[i] = '\n' + line[i] + '   '
  367.                     else:
  368.                         line[i] = line[i] + '   '
  369.                 wstream.writelines(line)
  370.                 print("修改成功")
  371.             # 删除修改密码之前用户的信息
  372.             with open(path) as rstream:
  373.                 # 读取多行
  374.                 lines = rstream.readlines()
  375.                 i = 0
  376.                 l = len(lines)
  377.                 while i < l:
  378.                     # 当 当前用户名在用户信息行且新的密码不在时就删除之前的用户信息,不会删除其他用户的信息
  379.                     if username in lines[i] and new_password not in lines[i]:
  380.                         lines.remove(lines[i])
  381.                     i += 1
  382.                     l -= 1
  383.                 # 删除旧密码对应的当前用户信息后,再将新密码对应的用户信息以及其他用户的信息从新写入到文件
  384.                 with open(path, 'w') as wstream:
  385.                     wstream.writelines(lines)


  386. # 个人信息
  387. def person_information(path, username):
  388.     tips = input("请选择操作:\n 1.查看个人信息\n 2.修改个人信息\n")
  389.     if tips == '1':
  390.         look_person_info(path, username)
  391.     elif tips == '2':
  392.         update_password(path, username)


  393. # 只有管理员才可以进行图书的增删改操作
  394. user_path = r'C:\Users\ASUS\Desktop\2021课程\python\book.txt'
  395. def permission(user_path, username):
  396.     try:
  397.         with open(user_path) as rstream:
  398.             while True:
  399.                 line = rstream.readline()
  400.                 # 读到空行跳出循环
  401.                 if not line:
  402.                     break
  403.                 # 通过3个空格将字符串line分割为一个列表,存储三个值
  404.                 line = line.split('   ')
  405.                 # 循环遍历列表,去掉列表中每个元素后面的换行,如果有就去掉,没有就不取掉
  406.                 for i in range(len(line)):
  407.                     line[i] = line[i].rstrip('\n')
  408.                 # 判断是否管理员,如果是就可以进行添加操作
  409.                 if username == 'adm':
  410.                     pass
  411.                 else:
  412.                     print("只有管理adm才可以进行该操作~")
  413.                     # 不是管理员将回到操作页面
  414.                     operate(path, username)
  415.     except Exception as err:
  416.         print("错误原因:", err)


  417. # 图书增删改借还操作
  418. book_path = r'C:\Users\ASUS\Desktop\2021课程\python\book.txt'


  419. # book_list = ['水浒传\n','红楼梦\n','廊桥遗梦']
  420. def operate(b_path,username):
  421.     if username == 'adm':
  422.         while True:
  423.             msg = input("请选择操作:\n 1.查询图书\n 2.添加图书\n 3.修改图书\n 4.删除图书\n 5.借书\n 6.归还图书\n 7.个人信息\n 8.退出登录\n")
  424.         # 查询图书
  425.             if msg =='1':
  426.                 find_books(book_path)
  427.         # 添加图书
  428.             elif msg =='2':
  429.                 add_book(b_path, username)
  430.         # 修改图书
  431.             elif msg =='3':
  432.                 update_book(b_path, username)
  433.         # 删除图书
  434.             elif msg =='4':
  435.                 del_book(b_path, username)
  436.         # 借书
  437.             elif msg =='5':
  438.                 borrow_book(username)
  439.         # 还书
  440.             elif msg =='6':
  441.                 return_book(username)
  442.         #查看、修改个人信息
  443.             elif msg =='7':
  444.                 person_information(path, username)

  445.         # 退出登录
  446.             elif msg =='8':
  447.                 msg = input("确定退出登录吗?(yes)")
  448.                 if msg == 'yes':
  449.                     break
  450.             else:
  451.                 print("无效操作")
  452.     else:
  453.         while True:
  454.             msg = input("请选择操作:\n 1.查询图书\n 2.借书\n 3.归还图书\n 4.个人信息\n 5.退出登录\n")
  455.         # 查询图书
  456.             if msg =='1':
  457.                 find_books(book_path)
  458.         # 借书
  459.             elif msg =='2':
  460.                 borrow_book(username)
  461.         # 还书
  462.             elif msg =='3':
  463.                 return_book(username)
  464.         #查看、修改个人信息
  465.             elif msg =='4':
  466.                 person_information(path, username)


  467.         # 退出登录
  468.             elif msg =='5':
  469.                 msg = input("确定退出登录吗?(yes)")
  470.                 if msg == 'yes':
  471.                     break
  472.             else:
  473.                 print("无效操作")



  474. login()

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 21:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表