zoukankan      html  css  js  c++  java
  • python实现图书管理系统

    #!/usr/local/bin/python3.7
    
    # 用户注册
    def logon():
        print("欢迎来到图书管理系统注册页面~")
        username = input("请输入用户名:")
        if len(username)<6:
            print("用户名不能小于6个字符")
        else:
            email = input("请输入邮箱:")
            password = input("请输入密码:")
            if len(password)<8:
                print("密码不能少于8位")
            else:
                rpassword = input("请确认密码:")
                if password ==rpassword:
                    print("注册成功!")
                    # 函数调用,每追加一列数据都进行换行 每个数据之间都有空格
                    preserve_data(path,[username,'   '+ email,'   '+ password + '
    '])
                    login_tips = input('是否登录?(yes/no)')
                    if login_tips =='yes':
                        login()
                    else:
                        pass
                    return True
                else:
                    print("两次输入的密码不一致,请重新输入!")
                    # 递归调用
                    logon()
    
    
    # 保存数据到文件
    path = r'/Users/mozili/PYTHONWORKSPACE/bookManage/user.txt'
    def preserve_data(file_path,data):
        # 将字符串转换为bytes,因为write写入的是字节流,不能是字符串 当为w时需要解码
        # data = data.encode()
        # 打开文件,追加数据到文件
        with open(file_path,'a') as wstream:
            # 判断是否可写
            if wstream.writable():
                wstream.writelines(data)
            else:
                print("没有权限!")
    
    
    # 用户登录
    def login():
        print("欢迎来到图书管理系统登录页面~")
        tips = input("是否已经注册?(yes/no)")
        if tips =='yes':
            while True:
                username = input("输入用户名:")
                password = input("输入密码:")
                # 读取文件时可能会出现找不到文件的异常,因此使用try except
                try:
                    # 读取文件中的内容
                    with open(path, 'rb') as stream:
                        # 读取多行保存到列表中,列表中保存的是二进制,字节
                        result = stream.readlines()
                        # print(result)
                        # 列表推导式,循环遍历列表,将字节解码为字符串放在一个新列表uesr_list
                        uesr_list = [i.decode() for i in result]
                        # print(uesr_list)
                        # 循环遍历列表,检查输入的用户名和密码是否在字符串中
                        for i in uesr_list:
                            info = i.split('   ')
                            # print(info)
                            if username == info[0] and password == info[2].rstrip('
    '):
                                print("登录成功")
                                operate(book_path,username)
                                break
                        else:
                            raise Exception("用户名或密码错误,请重新输入!")
    
                except Exception as err:
                    print(err)
                # 没有异常时执行else语句
                else:
                    break
        else:
            print("您还未注册,请先注册后再登录!")
            # 递归
            logon()
    
    # 查询图书
    def find_books(path):
        try:
            with open(path, 'r') as rstream:
                # readlines读到的内容是一个列表
                container = rstream.readlines()
                # 通过列表推导式得到新的列表,即每个元素去掉后面的换行符号
                new_container = [books_name.rstrip('
    ') for books_name in container]
                for b_name in new_container:
                    # 打印图书+《》
                    print("《{}》".format(b_name))
    
        except Exception as err:
            print("错误原因:",err)
    
    #添加图书
    def add_book(b_path,username):
        # 添加前首先判断是否是管理员
        permission(b_path, username)
        # 追加图书 不能是w ,否则会清空之前的内容
        with open(b_path, 'a') as wstream:
            # 判断是否可写
            if wstream.writable:
                msg = input("请输入书名:")
                try:
                    # 添加书籍之前判断某本书是否已经添加
                    with open(b_path) as rstream:
                        while True:
                            line = rstream.readline()
                            # 去掉右边的换行
                            line = line.rstrip('
    ')
                            # 当找到空行是如果还没有找到与输入的书名一致的时候,就添加输入的书名
                            if not line:
                                book = '
    ' + msg
                                wstream.write(book)
                                print("添加成功")
                                break
                            else:
                                # 输入的图书和读到的行有一致的则提示不能重复添加
                                if line == msg:
                                    print("{}已添加,请不要重复添加哦~".format(msg))
                                    break
                except Exception as err:
                    print("错误原因:", err)
            else:
                print("没有权限")
    
    
    # 修改图书
    def update_book(b_path,username):
        permission(b_path, username)
        try:
            with open(b_path, 'r') as rstream:
                container = rstream.read()
                # 通过'
    '来分割字符串,返回结果是列表
                container = container.split('
    ')
                # print(container)
                # 删除前先展示有哪些图书
                find_books(book_path)
                book_name = input("请输入需要修改的图书书名:")
                # 循环遍历修改书名
                for i in range(len(container)):
                    if book_name == container[i]:
                        rbook_name = input("请输入修改后的图书书名:")
                        container[i] = rbook_name + '
    '
                    else:
                        # 列表中的每个书名后面加换行符,用于写入文件时换行
                        container[i] = container[i] + '
    '
                # print(container)
                # 将书名更新后的内容以writelines写入文件中  writelines(可迭代)
                with open(b_path, 'w') as wwstream:
                    wwstream.writelines(container)
                print("修改成功")
        except Exception as err:
            print("错误原因:", err)
    
    
    
    # 删除图书
    def del_book(b_path,username):
        permission(path, username)
        try:
            with open(b_path, 'r') as rstream:
                container = rstream.read()
                # 通过'
    '来分割字符串,返回结果是列表
                container = container.split('
    ')
                # print(container)
                # 展示有哪些图书
                find_books(book_path)
                book_name = input("请输入需要删除的图书书名:")
                # 循环遍历修改书名
                for i in range(len(container) - 1):
                    if book_name == container[i]:
                        container.remove(container[i])
                    else:
                        # 列表中的每个书名后面加换行符,用于写入文件时换行
                        container[i] = container[i] + '
    '
                # print(container)
                # 将书名删除后的内容以writelines写入文件中  writelines(可迭代)
                with open(b_path, 'w') as wwstream:
                    wwstream.writelines(container)
                print("删除成功")
        except Exception as err:
            print("错误原因:", err)
    
    # 借书
    def borrow_book(username):
        while True:
            print("图书列表:")
            find_books(book_path)
            borrow_books = input("请选择图书:")
            try:
                with open('../user_books/user_books.txt') as rstream:
                    # 每次读取一行
                    lines = rstream.readline()
                    lines = lines.rstrip('
    ')
                    # 将读到的内容通过空格分割保存到列表
                    lines = lines.split(' ')
                    # 判断输入的书是否已被借走
                    if borrow_books not in lines:
                        # print(lines)
                        # 借书之前先判断该用户之前是否借过,如果借过,就在后面累加图书,用,分割图书
                        # for user_book in lines:
                        if username in lines:
                            with open('../user_books/user_books.txt', 'a') as wstream:
                                # 判断之前是否借过某本书
                                if borrow_books not in lines:
                                    wstream.write(' {}'.format(borrow_books))
                                    print("借书成功")
                                    break
                                else:
                                    print("您已借过此书,请从新选择!")
                                    break
                        else:
                            # 将选择的图书与用户名一起保存到文件中
                            with open('../user_books/user_books.txt', 'a') as wstream:
                                wstream.write('
    {} {}
    '.format(username, borrow_books))
                                print("借书成功")
                                break
                    else:
                        print("<<{}>>已被用户{}借走,请重新选择~".format(borrow_books,lines[0]))
            except Exception as err:
                print("错误原因:", err)
    
    
    # 还书
    def return_book(username):
        try:
            with open('../user_books/user_books.txt') as rstream:
                # print("{}您已借阅,未归还图书如下:".format(username))
                # 读到的结果是列表
                lines = rstream.readlines()
                # 遍历列表,将里面的元素再拆分为列表
                for i in range(len(lines)):
                    # 去掉换行
                    lines[i] = lines[i].rstrip('
    ')
                    lines[i] = lines[i].rstrip(' ')
                    lines[i] = lines[i].split(' ')
                    for ii in range(len(lines[i])-1):
                        # 只打印登录用户借阅的图书
                        if username == lines[i][0]:
                            print("{}您已借阅,未归还图书如下:".format(username))
                            print(lines[i][ii+1])
                            msg = input("请选择你要归还的图书:")
                            with open('../user_books/user_books.txt') as rstream:
                                lines = rstream.readlines()
                                for i in range(len(lines)):
                                    if username in lines[i] and msg in lines[i]:
                                        # 用空字符串替换msg,即表示删除归还的图书
                                        lines[i] = lines[i].replace(msg, '')
                                        with open('../user_books/user_books.txt', 'w') as wstream:
                                            # 将变更后的列表再写入文件,只变更当前用户的图书信息
                                            wstream.writelines(lines)
                                            print("归还成功!")
                                            break
    
                                with open('../user_books/user_books.txt') as rstream:
                                    lines = rstream.readlines()
                                    for i in range(len(lines)):
                                        lines[i] = lines[i].rstrip('
    ')
                                        lines[i] = lines[i].rstrip(' ')
                                        lines[i] = lines[i].split(' ')
                                        # print(type(lines[i]))
                                        for ii in range(len(lines[i])):
                                            # 图书归还成功后判断列表中只有用户名了,如果只有用户名则将用户名用空字符串代替
                                            if username == lines[i][0] and len(lines[i]) == 1:
                                                lines[i][0] = lines[i][0].replace(lines[i][0], '')
                                                lines.append(lines[i][0])
                                    # print(lines)
                                    str = ''
                                    for i in range(len(lines)):
                                        for ii in range(len(lines[i])):
                                            # 将嵌套列表中的元素取出来拼接成字符串
                                            str += lines[i][ii] + ' '
                                        str += '
    '
                                    # 遍历完毕删除之前列表里面嵌套的列表,追加字符串str
                                    lines.clear()
                                    lines.append(str)
    
                                    # print(lines)
                                    # 将更新后的列表写入文件
                                    with open('../user_books/user_books.txt', 'w') as wstream:
                                        wstream.writelines(lines)
                        else:
                            print("您还没有借阅记录哦~")
    
        except Exception as err:
            print("错误原因:", err)
    
    # 查看个人信息
    def look_person_info(path,username):
        with open(path) as rstream:
            lines = rstream.readlines()
            # print(lines)
            for info in lines:
                # 分割成一个列表
                info = info.split('   ')
                # print(info)
                if username in info:
                    print("----个人信息----")
                    print("用户名:", info[0])
                    print("邮箱:", info[1])
                    print("密码:", info[2].rstrip(' '))
                           
    # 修改个人信息
    def update_password(path,username):
        tips = input("请选择操作:
     1.修改邮箱
     2.修改密码
    ")
    
        # 修改邮箱
        if tips =='1':
            new_email = ''
            line = []
            try:
                with open(path) as rstream:
                    while True:
                        line = rstream.readline()
                        if not line:
                            break
                        line = line.split('   ')
                        # 去掉密码后面的换行符
                        line[2] = line[2].rstrip('
    ')
                        if username == line[0]:
                            new_email = input("请输入新邮箱:")
                            line[1] = new_email
                            break
            except Exception as err:
                print(err)
    
            else:
                # 将新修改邮箱后的用户的所有信息追加到文件夹
                with open(path, 'a') as wstream:
                    for i in range(len(line)):
                        if i == 0:
                            # 遍历列表,第一个列表元素需要前面需要加换行,后面需要加空格与其他元素分割
                            line[i] = '
    ' + line[i] + '   '
                        else:
                            line[i] = line[i] + '   '
                    wstream.writelines(line)
                    print("修改成功")
                # 删除修改邮箱之前用户的信息
                with open(path) as rstream:
                    # 读取多行
                    lines = rstream.readlines()
                    i = 0
                    l = len(lines)
                    while i < l:
                        # 当 当前用户名在用户信息行且新的邮箱不在时就删除之前的用户信息,不会删除其他用户的信息
                        if username in lines[i] and new_email not in lines[i]:
                            lines.remove(lines[i])
                        i += 1
                        l -= 1
                    # 删除旧邮箱对应的当前用户信息后,再将新邮箱对应的用户信息以及其他用户的信息从新写入到文件
                    with open(path, 'w') as wstream:
                        wstream.writelines(lines)
        # 修改密码
        elif tips =='2':
            new_password = ''
            line = []
            try:
                with open(path) as rstream:
                    while True:
                        line = rstream.readline()
                        if not line:
                            break
                        line = line.split('   ')
                        # 去掉密码后面的换行符
                        line[2] = line[2].rstrip('
    ')
                        if username == line[0]:
                            new_password = input("请输入新密码:")
                            # 判断新密码与旧密码是否一致
                            if new_password ==line[2]:
                                # 抛出异常
                                raise Exception("新密码不能与旧密码相同哦~")
                            else:
                                line[2] =new_password
                                break
            # 可以捕获到前面raise抛出的异常
            except Exception as err:
                print(err)
    
            else:
                # 将新修改密码后的用户的所有信息追加到文件夹
                with open(path,'a') as wstream:
                    for i in range(len(line)):
                        if i ==0:
                            # 遍历列表,第一个列表元素需要前面需要加换行,后面需要加空格与其他元素分割
                            line[i] = '
    '+line[i]+'   '
                        else:
                            line[i] = line[i] +'   '
                    wstream.writelines(line)
                    print("修改成功")
                # 删除修改密码之前用户的信息
                with open(path) as rstream:
                    # 读取多行
                    lines = rstream.readlines()
                    i =0
                    l = len(lines)
                    while i < l:
                        # 当 当前用户名在用户信息行且新的密码不在时就删除之前的用户信息,不会删除其他用户的信息
                        if username in lines[i] and new_password not in lines[i]:
                            lines.remove(lines[i])
                        i+=1
                        l-=1
                    # 删除旧密码对应的当前用户信息后,再将新密码对应的用户信息以及其他用户的信息从新写入到文件
                    with open(path,'w') as wstream:
                        wstream.writelines(lines)
    
    # 个人信息
    def person_information(path,username):
        tips = input("请选择操作:
     1.查看个人信息
     2.修改个人信息
    ")
        if tips =='1':
            look_person_info(path,username)
        elif tips =='2':
            update_password(path, username)
    
    # 只有管理员才可以进行图书的增删改操作
    def permission(user_path,username):
        try:
            with open(user_path) as rstream:
                while True:
                    line = rstream.readline()
                    # 读到空行跳出循环
                    if not line:
                        break
                    # 通过3个空格将字符串line分割为一个列表,存储三个值
                    line = line.split('   ')
                    # 循环遍历列表,去掉列表中每个元素后面的换行,如果有就去掉,没有就不取掉
                    for i in range(len(line)):
                        line[i] = line[i].rstrip('
    ')
                    # 判断是否管理员,如果是就可以进行添加操作
                    if username == 'admin123':
                        pass
                    else:
                        print("只有管理员{}才可以进行该操作~".format(username))
                        # 不是管理员将回到操作页面
                        operate(path, username)
        except Exception as err:
            print("错误原因:",err)
    
    
    
    
    # 图书增删改借还操作
    book_path = r'/Users/mozili/PYTHONWORKSPACE/book.txt'
    # book_list = ['水浒传
    ','红楼梦
    ','廊桥遗梦']
    def operate(b_path,username):
        while True:
            msg = input("请选择操作:
     1.查询图书
     2.添加图书
     3.修改图书
     4.删除图书
     5.借书
     6.归还图书
     7.个人信息
     8.退出登录
    ")
            # 查询图书
            if msg =='1':
                find_books(book_path)
            # 添加图书
            elif msg =='2':
                add_book(b_path, username)
            # 修改图书
            elif msg =='3':
                update_book(b_path, username)
            # 删除图书
            elif msg =='4':
                del_book(b_path, username)
            # 借书
            elif msg =='5':
                borrow_book(username)
            # 还书
            elif msg =='6':
                return_book(username)
            #查看、修改个人信息
            elif msg =='7':
                person_information(path, username)
    
            # 退出登录
            elif msg =='8':
                msg = input("确定退出登录吗?(yes/no)")
                if msg == 'yes':
                    break
    
    
    
    login()
  • 相关阅读:
    cenos安装memcache
    微信开发——测试号申请,接口配置,JS接口安全域名,自定义菜单
    mysql设计-优化
    mysql设计-基本操作
    CI框架部署后访问出现404
    ueditor的bug
    git操作
    github基本操作
    基于SSH协议clone GitHub远端仓库到本地-git
    Thinkphp5.0 路由
  • 原文地址:https://www.cnblogs.com/lxmtx/p/11840176.html
Copyright © 2011-2022 走看看