目录

课题背景

一、主要研究内容

二、需求分析

1.功能性需求分析

2.非功能性需求分析

三、系统整体架构设计

四、相关代码

1.文件存储

1.1.存储用户信息

1.2.存储图书信息

2.密码保护

五、完整代码

1.图书借阅管理系统.py

 2.user.py

3.manager.py

课题背景

基于Python开发的一款图书借阅管理系统。

一、主要研究内容

本文的主要研究内容包括下面两个部分。

(1)文件存储

利用文件实现对用户信息和图书信息进行存储,管理员可以更直观的了解到用户信息,而用户也可以查询到每本图书的动向。

(2)管理员

对管理员的密码进行了保护,在管理员输入密码的时候,可以实现一边输入密码,一边将输入的密码显示为星号。

二、需求分析

1.功能性需求分析

图书借阅管理系统有用户和管理员两个角色。这两个角色共用一个登录模块,这个登录模块会自动识别登录者的身份。

管理员角色只能有一个,用户角色可以有多个。

在登录成功后,如果角色是管理员,可以对用户信息进行增删查改;退出程序。

在登录成功后,如果角色是用户,可以借阅图书,查看图书,归还图书;退出程序。

图书借阅管理系统可以将系统使用过程中产生的数据保存到文件中。

如果登录失败,则重新尝试登录。

(1)管理员

可以增加用户信息,删除用户信息,修改用户信息,查询用户信息。

(2)用户

可以借阅图书,归还图书,查询图书。

2.非功能性需求分析

本系统只能进行简单的进行用户增删查改和图书的借阅归还查看,而不能精确到具体那个人借了那本书。

三、系统整体架构设计

(1)登录

管理员和用户都可以进行登录,并且系统会对管理员密码进行加密处理,而用户密码则会不会被加密。

(2)注册

只能注册新用户而不能注册管理员,如果是该用户第一次使用该系统,那么该用户可以通过注册相关信息从而实现登录系统。

(3)管理员登录

只有管理员才可以使用该功能,登录进去可以实现对用户信息的增删查改

(4)图书界面

用户登录该界面后,可以在该界面选择相应的功能来实现借阅图书,归还图书和查看图书。

(5)用户界面

管理员登录到该界面后,可以选择在该界面选择相应的功能来实现增加用户信息,删除用户信息,修改用户信息,查看用户信息。

四、相关代码

1.文件存储

1.1.存储用户信息

python图书信息管理系统课程设计报告_wdl

代码如下(示例):

# 登录
class DL:
    @staticmethod
    def EntryInfo():
        flag = 3
        while flag:
            print("----------登录界面:----------")
            name = input("账号:")
            pwd = input("密码:")
            q = 0
            userlist.append(readallusers())
            pwdlist.append(readallusers())
            for a in range(len(userlist)):
                if name == userlist[a]:
                    a1 = 1
                    for a2 in range(len(pwdlist)):
                        if pwd == pwdlist[a]:
                            b2 = 1
                            if a1 == 1 and b2 == 1:
                                q += 1
                                print("登录成功!")
                                user.YCD.menu2()
                                return CD.menu()
            if q == 0:
                print("错误的账号或密码")
                flag -= 1
                print("你还有", flag, "次机会")
            if flag == 0:
                sys.exit()


# 注册
class ZC:
    @staticmethod
    def register():
        global userlist
        name_data = ['傻', '蠢', '笨', '呆', '愚']
        print("------------------注册界面------------------")
        name = str(input("注册的账号:"))
        # 检测账号中是否出现敏感词汇!
        while 1:
            a = 0
            for p in name_data:
                for j in name:
                    if j in p:
                        newname = name.replace(j, '*')
                        a += 1
                        print("账号", newname, "出现敏感词汇,请重新输入:")
                        name = str(input("注册的账号:"))
            else:
                break
        # 检测密码是否符合要求!
        pwd = input("注册的密码:")
        while 1:
            # 检测密码长度是否合格!
            n = 0
            if len(pwd) <= 6:
                d = 0
                print("密码应不少于六位数!", end='')
            else:
                d = 1
            # 检测密码的强度!
            for m in range(len(pwd)):
                if '0' <= pwd[m] <= '9':
                    n += 1
            if n < len(pwd):
                n = 0
            else:
                print("密码强度不够!")
            k = pwd.isalpha()
            l = 0
            if k:
                print("密码强度不够!")
            else:
                l += 1
            if d == 1 and n == 0 and l != 0:
                with open('./yh.txt', 'a+', encoding='utf-8') as fp:
                    fp.write(f'{name}:{pwd}\n')
                    fp.close()
                print(f'注册成功:用户名:{name}')
                CD.menu()
            pwd = input("注册的密码:")

1.2.存储图书信息

python图书信息管理系统课程设计报告_wdl_02

代码如下(示例):

class GH:
    @staticmethod
    def GuiHuan():
        h = str(input("请用户输入要归还的图书名称:"))
        with open('book.txt', 'a+', encoding='utf-8') as yhfile:
            yhfile.write(h + '\n')
            print("添加成功!")

2.密码保护

python图书信息管理系统课程设计报告_需求分析_03

代码如下(示例):

class GL:
    @staticmethod
    def manager1():
        global userlist
        name1 = str(input("请输入管理员账号:"))
        print('请输入管理员密码:', end='', flush=True)
        li = []
        while 1:
            ch = msvcrt.getch()
            # 回车
            if ch == b'\r':
                msvcrt.putch(b'\n')
                # print('输入的密码是:%s' % b''.join(li).decode())
                break
            # 退格
            elif ch == b'\x08':
                if li:
                    li.pop()
                    msvcrt.putch(b'\b')
                    msvcrt.putch(b' ')
                    msvcrt.putch(b'\b')
            # Esc
            elif ch == b'\x1b':
                break
            else:
                li.append(ch)
                msvcrt.putch(b'*')
        # os.system('pause')
        while 1:
            if name1 == '张三' and li == [b'1', b'2', b'3', b'4', b'5', b'6']:
                print("登录成功!")
                if manager.GCD.menu1():
                    return CD.menu()
                else:
                    print("登录页面调用出错")
            else:
                print("账号或密码错误,请重新输入:")
                return GL.manager1()

五、完整代码

1.图书借阅管理系统.py

import sys
import msvcrt
# import os
import manager
import user


userlist = []  # 存放所有的用户名
pwdlist = []  # 存放所有的用户密码


# 读取所有数据的方法
def readallusers():
    # 读取所有的注册信息 使用a+模式打开文件,在调整指针位置,防止文件不存在时报错
    with open('./yh.txt', 'a+', encoding='utf-8') as fp:
        fp.seek(0)  # 调整当前的的指针位置到文件头部
        res = fp.readlines()  # 按照每一行读取所有的用户数据
        for i in res:  # 循环读取的每一行数据
            r = i.strip()  # 处理每一个换行 admin:123\n ==> admin:123
            arr = r.split(':')  # admin:123 ==> ['admin','123']
            userlist.append(arr[0])  # 把用户名追加到 用户名列表中
            pwdlist.append(arr[1])  # 把用户对应的密码 追加到 用户密码 列表中
            fp.close()


# 登录
class DL:
    @staticmethod
    def EntryInfo():
        flag = 3
        while flag:
            print("----------登录界面:----------")
            name = input("账号:")
            pwd = input("密码:")
            q = 0
            userlist.append(readallusers())
            pwdlist.append(readallusers())
            for a in range(len(userlist)):
                if name == userlist[a]:
                    a1 = 1
                    for a2 in range(len(pwdlist)):
                        if pwd == pwdlist[a]:
                            b2 = 1
                            if a1 == 1 and b2 == 1:
                                q += 1
                                print("登录成功!")
                                user.YCD.menu2()
                                return CD.menu()
            if q == 0:
                print("错误的账号或密码")
                flag -= 1
                print("你还有", flag, "次机会")
            if flag == 0:
                sys.exit()


# 注册
class ZC:
    @staticmethod
    def register():
        global userlist
        name_data = ['傻', '蠢', '笨', '呆', '愚']
        print("------------------注册界面------------------")
        name = str(input("注册的账号:"))
        # 检测账号中是否出现敏感词汇!
        while 1:
            a = 0
            for p in name_data:
                for j in name:
                    if j in p:
                        newname = name.replace(j, '*')
                        a += 1
                        print("账号", newname, "出现敏感词汇,请重新输入:")
                        name = str(input("注册的账号:"))
            else:
                break
        # 检测密码是否符合要求!
        pwd = input("注册的密码:")
        while 1:
            # 检测密码长度是否合格!
            n = 0
            if len(pwd) <= 6:
                d = 0
                print("密码应不少于六位数!", end='')
            else:
                d = 1
            # 检测密码的强度!
            for m in range(len(pwd)):
                if '0' <= pwd[m] <= '9':
                    n += 1
            if n < len(pwd):
                n = 0
            else:
                print("密码强度不够!")
            k = pwd.isalpha()
            l = 0
            if k:
                print("密码强度不够!")
            else:
                l += 1
            if d == 1 and n == 0 and l != 0:
                with open('./yh.txt', 'a+', encoding='utf-8') as fp:
                    fp.write(f'{name}:{pwd}\n')
                    fp.close()
                print(f'注册成功:用户名:{name}')
                CD.menu()
            pwd = input("注册的密码:")


# 退出
class TC:
    @staticmethod
    def exit1():
        print("退出成功!")
        sys.exit()


#  管理员登录
class GL:
    @staticmethod
    def manager1():
        global userlist
        name1 = str(input("请输入管理员账号:"))
        print('请输入管理员密码:', end='', flush=True)
        li = []
        while 1:
            ch = msvcrt.getch()
            # 回车
            if ch == b'\r':
                msvcrt.putch(b'\n')
                # print('输入的密码是:%s' % b''.join(li).decode())
                break
            # 退格
            elif ch == b'\x08':
                if li:
                    li.pop()
                    msvcrt.putch(b'\b')
                    msvcrt.putch(b' ')
                    msvcrt.putch(b'\b')
            # Esc
            elif ch == b'\x1b':
                break
            else:
                li.append(ch)
                msvcrt.putch(b'*')
        # os.system('pause')
        while 1:
            if name1 == '张三' and li == [b'1', b'2', b'3', b'4', b'5', b'6']:
                print("登录成功!")
                if manager.GCD.menu1():
                    return CD.menu()
                else:
                    print("登录页面调用出错")
            else:
                print("账号或密码错误,请重新输入:")
                return GL.manager1()


#  菜单
class CD:
    @staticmethod
    def menu():
        print("----------图书借阅管理系统----------")
        print("--------------1.登录--------------")
        print("--------------2.注册--------------")
        print("--------------3.退出--------------")
        print("------------4.管理员登录-----------")
        choice = int(input("请用户选择操作:"))
        if choice == 1:
            DL.EntryInfo()
        elif choice == 2:
            ZC.register()
        elif choice == 3:
            TC.exit1()
        else:
            GL.manager1()


CD.menu()

 2.user.py

#  用户菜单
class YCD:
    @staticmethod
    def menu2():
        print("--------%图书借阅界面%--------")
        print("--------1.借阅已有书籍--------")
        print("--------2.归还借阅书籍--------")
        print("--------3.查看现有书籍--------")
        print("--------4.退出用户界面--------")
        choice = int(input("请用户选择操作:"))
        if choice == 1:
            JY.borrow()
            return YCD.menu2()
        elif choice == 2:
            GH.GuiHuan()
            return YCD.menu2()
        elif choice == 3:
            CK.Check()
            return YCD.menu2()
        else:
            pass


#  借阅
class JY:
    @staticmethod
    def borrow():
        f = open('book.txt', 'r', encoding='utf-8')
        q = f.read()
        print(q)
        q = str(input("\n请用户选择要借阅的图书:"))
        with open("book.txt", "r", encoding="utf-8") as f:
            lines = f.readlines()
            # print(lines)
        with open("book.txt", "w", encoding="utf-8") as f_w:
            for line in lines:
                if q in line:
                    continue
                f_w.write(line)


#  归还
class GH:
    @staticmethod
    def GuiHuan():
        h = str(input("请用户输入要归还的图书名称:"))
        with open('book.txt', 'a+', encoding='utf-8') as yhfile:
            yhfile.write(h + '\n')
            print("添加成功!")


#  查看
class CK:
    @staticmethod
    def Check():
        f = open('book.txt', 'r', encoding='utf-8')
        q = f.read()
        print(q)
        print("查询成功!")


# YCD.menu2()

3.manager.py

list1 = {'张三', '李四', '王五'}


#  管理员菜单
class GCD:
    @staticmethod
    def menu1():
        s2 = "欢迎使用图书馆借阅管理系统V2.10"
        print(s2.center(32, '-'))
        s3 = "--用户信息维护页--"
        print(s3.center(36, ' '))
        s4 = "1.添加用户信息"
        print(s4.center(35, ' '))
        s5 = "2.删除用户信息"
        print(s5.center(35, ' '))
        s6 = "3.修改用户信息"
        print(s6.center(35, ' '))
        s7 = "4.显示用户信息"
        print(s7.center(35, ' '))
        s8 = "5.退出系统"
        print(s8.center(36, ' '))
        chose = int(input("请管理员选择操作:"))
        if chose == 1:
            TJ.Add()
            return GCD.menu1()
        elif chose == 2:
            SC.Delete()
            return GCD.menu1()
        elif chose == 3:
            XG.Alter()
            return GCD.menu1()
        elif chose == 4:
            XS.Show()
            return GCD.menu1()
        else:
            pass
        return True


# 添加
class TJ:
    @staticmethod
    def Add():
        print("------------添加用户信息界面------------")
        a1 = str(input("请输入用户姓名:"))
        with open('yh1.txt', 'a+', encoding='utf-8') as yhfile:
            yhfile.write(a1 + '\n')
            print("添加成功!")


# 删除
class SC:
    @staticmethod
    def Delete():
        print("------------删除用户信息界面------------")
        a2 = str(input("请输入要删除的用户姓名:"))
        with open("yh1.txt", "r", encoding="utf-8") as f:
            lines = f.readlines()
            # print(lines)
        with open("yh1.txt", "w", encoding="utf-8") as f_w:
            for line in lines:
                if a2 in line:
                    continue
                f_w.write(line)


# 修改
class XG:
    @staticmethod
    def Alter():
        print("------------添加修改信息界面------------")
        a3 = str(input("请输入要修改的用户姓名:"))
        a4 = str(input("请输入修改后的用户姓名:"))
        with open("yh1.txt", "r", encoding="utf-8") as f:
            lines = f.readlines()
            # print(lines)
        with open("yh1.txt", "w", encoding="utf-8") as f_w:
            f_w.write(a4 + '\n')
            for line in lines:
                if a3 in line:
                    continue
                f_w.write(line)
                print("修改成功!")


# 显示
class XS:
    @staticmethod
    def Show():
        print("------------查询用户信息界面------------")
        f = open('yh1.txt', 'r', encoding='utf-8')
        q = f.read()
        print(q)
        print("查询成功!")


# GCD.menu1()