Python 文件操作 —— 师生信息管理系统(三系统)

# 三系统师生信息管理系统(文件版)
"""
思考:
    1、请问如何实现文件内容增、删、改、查?
    2、如何避免使用全局变量?
    3、全局变量在函数里如何修改?
    4、如何捕获异常为我所用?

介绍:
    1、管理系统在生活中处处可见,把单一的功能集合到一起就能组成一个系统。本系统是在学生信息管理系统
    改进而来,升级了的有:可以存储信息,多系统操作。

    2、多系统操作,共分为管理员、教师端、学生端。
    3、管理员默认账号:123456 默认密码:123456
    4、隐藏功能:数字0,是返回(为了美观,而牺牲的功能)

知识点:
    1、文件操作:增、删、改、查
    2、类的继承:多继承,单继承
    3、类与对象:类方法、公共属性
    4、循环语句、条件语句、跳转语句
    重点:with语句、旗帜、函数封装

不足:
    1、由于split()函数无法分割'\n',所以本程序采用追加空格加换行' \n'的格式写入文件
    所以当输入信息时,有空格,会导致空格后面的信息缺失。
    2、界面太丑,提示语不够丰富,有待改善。
    3、本程序还不够精简,代码注释较少,对基础较弱的道友不太友好,有待改善

创新:
    1、输入信息时,可以限制输入字符类型,以达到规避出现BUG,例如:不可以输入空格。
    2、文字显示太丑,可以改为图形化界面。
    3、功能局限,可以适当添加。

"""
# 三系统师生信息管理系统(文件版)



# 全局变量类 ==========================================================================
class Global:

    # 设置归属地(默认:220703)
    home_location = '220703'
    # 设置随机位数
    rand_digit = 4

    # 设置重置密码
    default_password = '123'

    # 管理员工号
    admin_id = '123456'
    # 管理员密码
    admin_password = '123456'

    # 一级目录
    one_dir = 'system data'
    one_dir += '/'
    # 二级目录
    two_dir = 'info data'
    two_dir += '/'
    # 路径拼接
    path_dir = one_dir + two_dir


# 菜单界面类 ==========================================================================
class UI(Global):

    # 通用标题
    @classmethod
    def show_title(cls, info, space=0, num=9):
        print(' '*space + '='*num + info + '='*num)

    # 初始界面
    @classmethod
    def login_ui(cls):
        cls.show_title(info='欢迎来到师生信息管理系统', num=3)
        print(' '*3 + '1.注册\t\t2.登录')

    # 身份确认(学生/教师)
    @classmethod
    def regist_type_ui(cls):
        cls.show_title(info='欢迎来到注册账号管理系统', num=3)
        print('1.学生注册\t\t2.教师注册')

    # 学生端菜单界面
    @classmethod
    def stu_ui(cls):
        cls.show_title(info='学生信息管理系统(学生端)', num=4)
        print('1.查看学生信息\t2.修改学生信息')
        print('3.修改学生密码\t0.退出')

    # 教师端菜单界面
    @classmethod
    def teach_ui(cls):
        cls.show_title(info='学生信息管理系统(教师端)', num=4)
        print('1.查看教师信息\t2.修改教师信息')
        print('3.修改教师密码\t4.重置学生密码')
        print('5.查找学生信息\t6.遍历学生信息')
        print('7.注销学生账号\t0.退出')

    # 管理员菜单界面
    @classmethod
    def admin_ui(cls):
        cls.show_title(info='学生信息管理系统(管理员)', num=4)
        print('1.重置师生密码\t2.修改管理员密码')
        print('3.查找师生信息\t4.设置账号归属地')
        print('5.遍历师生信息\t6.设置随机数位数')
        print('7.注销师生账号\t8.设置默认密码')
        print('0.退出')

    # 重置密码界面
    @classmethod
    def reset_password_ui(cls):
        cls.show_title(info='欢迎来到重置密码管理系统', num=4)
        print('1.重置学生密码\t2.重置教师密码')

    # 遍历学生/教师信息
    @classmethod
    def output_info_ui(cls):
        cls.show_title(info='欢迎来到遍历信息管理系统', num=4)
        print('1.遍历学生信息\t2.遍历教师信息')

    # 注销学生/教师账号
    @classmethod
    def logout_account_ui(cls):
        cls.show_title(info='欢迎来到注销账号管理系统', num=4)
        print('1.注销学生账号\t2.注销教师账号')


# 菜单功能选择类(单继承)  ===============================================================
class Menu_option(UI):

    num_list = list()  # 定义全局变量(如果报错就把这行放在函数外面)

    # 自然数列表
    @classmethod
    def char_list(cls):
        cls.num_list = list()
        for i in range(10):
            cls.num_list.append(str(i))

    # 输入编号(整数)
    @classmethod
    def input_num(cls, max, menu, min=0,):

        cls.char_list()                 # 存入自然数字符

        buf = '请选择功能:'
        while True:
            flag_not_num = 0    # 非整数旗帜
            num = input(buf)

            # 保证字符串是整数
            for i in num:
                if i not in cls.num_list:
                    flag_not_num = 1
                    break

            # 在范围内返回整数
            if not flag_not_num:
                # 捕获异常
                try:
                    if min <= int(num) <= max:  # 等价于 int(num) >= min and int(num) <= max
                        return int(num)
                except:
                    return -1

            buf = '请重新选择功能(整数):'

            # 打印菜单
            if menu == 1:
                cls.login_ui()
            elif menu == 2:
                cls.regist_type_ui()
            elif menu == 3:
                cls.stu_ui()
            elif menu == 4:
                cls.teach_ui()
            elif menu == 5:
                cls.admin_ui()
            elif menu == 6:
                cls.reset_password_ui()
            elif menu == 7:
                cls.output_info_ui()
            elif menu == 8:
                cls.logout_account_ui()


# 文件操作类 ==========================================================================
class File_handle:

    # 创建一个空目录
    @classmethod
    def mkdir(cls, dir_name):
        import os
        # 判断目录是否存在,不存在立即创建
        if os.path.exists(path=dir_name) is False:
            os.mkdir(path=dir_name)

    # 创建一个txt文件
    @classmethod
    def mkfile(cls, file_name):
        import os
        # 判断文件是否存在,不存在立即创建
        if os.path.exists(path=file_name) is False:
            with open(file=file_name, mode='w', encoding='utf-8'):
                pass


# 特殊功能类 ==========================================================================
class Special_func(Global, File_handle):

    # 随机产生多位数字
    @classmethod
    def produce_rand_num(cls, digit=4):
        num = ''
        import random
        for i in range(digit):
            num += str(random.choice(seq=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
        return num

    # 把全局变量写入文件
    @classmethod
    def write_the_message(cls):

        # 把全局变量写入文件
        with open(file=f'{cls.one_dir}admin.txt', mode='w', encoding='utf-8') as file:
            file.writelines([cls.home_location+' ',str(cls.rand_digit)+' ',cls.default_password+' ',cls.admin_password])

    # 读取全局变量文件
    @classmethod
    def read_the_message(cls):

        # 判断文件是否存在
        import os
        if os.path.exists(path=f'{cls.one_dir}admin.txt') is False:
            # 创建目录
            cls.mkdir(dir_name=cls.one_dir)
            cls.mkdir(dir_name=cls.path_dir)
            return

        # 读取文件信息
        with open(file=f'{cls.one_dir}admin.txt', mode='r', encoding='utf-8') as file:
            admin_info = file.readlines()

            # 赋值
            cls.home_location = admin_info[0].split()[0]
            cls.rand_digit = int(admin_info[0].split()[1])
            cls.default_password = admin_info[0].split()[2]
            cls.admin_password = admin_info[0].split()[3]


# 菜单功能实现类(单继承)  ===============================================================
class Menu_realizes(Menu_option, Special_func, File_handle):

    # 随机生成学号/工号(不重复)
    @classmethod
    def random_id(cls):
        # 随机产生数字
        num = cls.produce_rand_num(digit=cls.rand_digit)

        # 判断账号是否重复(在目录里查找)
        import os
        # 1.创建一个管理系统目录
        cls.mkdir(dir_name=cls.one_dir)
        # 2.创建一个学生信息系统目录
        cls.mkdir(dir_name=cls.path_dir)
        # 3.把学生信息目录的文件存入列表
        stu_info = os.listdir(cls.path_dir)
        # 4.拼接学号文件
        stu_id = cls.home_location + num + '.txt'

        # 判断此学号是否存在
        if stu_id in stu_info:
            cls.random_id()
            return cls.buf

        cls.buf = cls.home_location + num   # 此变量是在作用域在方法内
        return cls.buf

    # 录入信息到管理系统
    @classmethod
    def input_info(cls, file_path, job):

        data = ''

        # 获取学号/工号
        account = file_path.split('/')[2].split('.')[0]
        if job == '学生':
            print(f'您的学号是:{account}')
        else:
            print(f'您的工号是:{account}')

        # 输入数据
        while True:
            password = input('请设置密码:') + '@)@@)&)#'
            if password != '@)@@)&)#':
                password = password.split('@)@@)&)#')[0]
                break
        while True:
            name = input(f'请输入{job}姓名:') + '@)@@)&)#'
            if name != '@)@@)&)#':
                name = name.split('@)@@)&)#')[0]
                break
        while True:
            phone_num = input(f'请输入{job}手机号:') + '@)@@)&)#'
            if phone_num != '@)@@)&)#':
                phone_num = phone_num.split('@)@@)&)#')[0]
                break

        while True:
            addr = input(f'请输入{job}家庭地址:') + '@)@@)&)#'
            if addr != '@)@@)&)#':
                addr = addr.split('@)@@)&)#')[0]
                break

        # 保存数据
        data += account + ' \n'
        data += password + ' \n'
        data += name + ' \n'
        data += phone_num + ' \n'
        data += addr + ' \n'
        data += job + ' \n'

        with open(file=file_path, mode='r+', encoding='utf-8') as file:
            file.writelines(data)

    # 打印信息
    @classmethod
    def output_info(cls, file_path, flag=False):
        with open(file=file_path, mode='r+', encoding='utf-8') as file:

            info_txt = file.readlines()

            if info_txt[-1].split()[0] == '学生':
                job = '学号:'
            else:
                job = '工号:'

            # 打印信息
            for i in range(6):
                if i == 0:
                    print(f'{job}{info_txt[i].split()[0]}', end='\t')
                elif i == 1:
                    print(f'密码:{info_txt[i].split()[0]}', end='\t')
                elif i == 2:
                    print(f'姓名:{info_txt[i].split()[0]}', end='\t')
                elif i == 3:
                    print(f'手机号:{info_txt[i].split()[0]}', end='\t')
                elif i == 4:
                    print(f'家庭地址:{info_txt[i].split()[0]}', end='\t')

                if flag and i == 5:
                    print(f'职业:{info_txt[i].split()[0]}', end='\t')
            print()

    # 注册
    @classmethod
    def regist_account(cls, job):
        import os

        # 随机生成学号/工号
        account = cls.random_id()

        # 文件路径拼接
        file_name = os.path.join(cls.path_dir, account + '.txt')
        # 创建一个txt文件,用于存储信息
        cls.mkfile(file_name=file_name)

        # 打开txt文件,开始存入信息
        cls.input_info(file_path=file_name, job=job)

        # 打印学生信息
        cls.output_info(file_path=file_name)

        # 确认是否保存信息
        while True:
            is_save = input('请确认是否保存信息(y/n):')
            if is_save == 'n' or is_save == 'N':
                os.remove(path=file_name)
                print('注册失败!')
                break
            elif is_save == 'y' or is_save == 'Y':
                print('注册成功!')
                break

    # 判断账号密码是否正确,并返回职业
    @classmethod
    def check_account_password(cls, account, password):

        # 判断是否为管理员
        if account == cls.admin_id and password == cls.admin_password:
            return '管理员'

        # 字符串拼接
        account += '.txt'

        # 获取目录文件名
        import os
        person = os.listdir(cls.path_dir)

        # 判断账号是否存在
        if account not in person:
            if account == cls.admin_id + '.txt':
                print('密码输入错误!')
                return None
            print('学号/工号不存在!')
            return None

        # 判断密码是否正确
        with open(file=cls.path_dir + account, encoding='utf-8') as file:
            if password != file.readlines()[1].split()[0]:
                print('输入密码错误!')
                return False

            # 调整读写位置
            file.seek(0, 0)
            # print(file.readlines())

            # 判断账号是学生还是教师
            if '学生' == file.readlines()[-1].split()[0]:
                return '学生'
            else:
                return '教师'

    # 修改个人信息
    @classmethod
    def change_info(cls, file_name):
        while True:
            new_name = input('请输入新的姓名:') + '@)@@)&)#'
            if new_name != '@)@@)&)#':
                new_name = new_name.split('@)@@)&)#')[0]
                break
        while True:
            new_phone_num = input('请输入新的手机号:') + '@)@@)&)#'
            if new_phone_num != '@)@@)&)#':
                new_phone_num = new_phone_num.split('@)@@)&)#')[0]
                break

        while True:
            new_addr = input('请输入新的家庭地址:') + '@)@@)&)#'
            if new_addr != '@)@@)&)#':
                new_addr = new_addr.split('@)@@)&)#')[0]
                break

        # 字符串拼接
        new_name += ' \n'
        new_phone_num += ' \n'
        new_addr += ' \n'

        # 获取个人信息,并修改
        with open(file=file_name, mode='r', encoding='utf-8') as file:
            data = file.readlines()
            data[2] = new_name
            data[3] = new_phone_num
            data[4] = new_addr

        # 确认是否修改信息
        while True:
            buf = input('请确认是否保存信息(y/n):')
            if buf == 'y' or buf == 'Y':
                print('已成功修改信息')
                break
            elif buf == 'n' or buf == 'N':
                print('已放弃修改信息')
                return

        # 保存更新修改后的信息
        with open(file=file_name, mode='w', encoding='utf-8') as file:
            file.writelines(data)

    # 修改个人密码
    @classmethod
    def change_password(cls, file_name):
        old_password = input('请输入旧密码:')
        while True:
            new_password = input('请输入新密码:') + '@)@@)&)#'
            if new_password != '@)@@)&)#':
                new_password = new_password.split('@)@@)&)#')[0]
                break

        # 读取文件数据
        with open(file=file_name, encoding='utf-8') as file:
            data = file.readlines()

        # 校对旧密码,是否正确
        if data[1].split()[0] != old_password:
            print('旧密码输入有误!')
            return

        # 确认是否修改密码
        while True:
            buf = input('请确认是否修改密码(y/n):')
            if buf == 'y' or buf == 'Y':
                print('已成功修改密码')
                break
            elif buf == 'n' or buf == 'N':
                print('已放弃修改密码')
                return

        # 替换旧密码
        new_password += ' \n'
        data[1] = new_password

        # 重写到文件里
        with open(file=file_name, mode='w', encoding='utf-8') as file:
            file.writelines(data)

    # 重置登录密码
    @classmethod
    def reset_password(cls, job):

        # 确认身份
        if job == '学生':
            account = input('请输入学号:')
        else:
            account = input('请输入工号:')
        name = input(f'请输入{job}姓名:')

        # 获取目录信息
        import os
        dir_info = os.listdir(cls.path_dir)

        # 判断账号是否存在
        if f'{account}.txt' not in dir_info:
            if job == '学生':
                print('学号输入有误!')
            else:
                print('工号输入有误!')
            return

        # 获取文件信息
        with open(file=f'{cls.path_dir + account}.txt', encoding='utf-8') as file:
            file_info = file.readlines()

        # 判断账号是否为学生/教师
        if file_info[-1] != f'{job} \n':
            if job == '学生':
                print('此学号不存在!')
            else:
                print('此工号不存在!')
            return

        # 校对输入姓名
        if name + ' \n' != file_info[2]:
            print(f'{job}姓名输入有误!')
            return

        # 确认是否重置密码
        while True:
            buf = input('请确认是否重置密码(y/n):')
            if buf == 'y' or buf == 'Y':
                print('已成功重置密码')
                break
            elif buf == 'n' or buf == 'N':
                print('已放弃重置密码')
                return

        # 修改密码
        file_info[1] = f'{cls.default_password} \n'

        # 写入文件信息
        with open(file=f'{cls.path_dir + account}.txt', mode='w', encoding='utf-8') as file:
            file.writelines(file_info)

    # 查找个人信息
    @classmethod
    def find_info(cls, job=None, flag=False):
        flag_none = 0
        name = input(f'请输入需要查找姓名:')

        # 获取目录信息
        import os
        dir_info = os.listdir(cls.path_dir)

        # 遍历查找
        for i in dir_info:
            # 获取文件信息
            with open(file=cls.path_dir + i, encoding='utf-8') as file:
                file_info = file.readlines()
                if file_info[2] == name + ' \n':
                    if not flag_none:
                        cls.show_title(info=f'查找的信息如下')
                        flag_none = 1

                    if str(job) + ' \n' == file_info[-1]:
                        cls.output_info(file_path=cls.path_dir + i, flag=flag)

                    elif not job:
                        cls.output_info(file_path=cls.path_dir + i, flag=flag)

        if not flag_none:
            print(f'姓名输入有误!')

    # 打印所有学生/教师信息
    @classmethod
    def output_all_info(cls, job):

        flag_none = 0

        # 获取目录信息
        import os
        dir_info = os.listdir(cls.path_dir)

        # 校对信息,并打印
        for i in dir_info:
            with open(file=cls.path_dir + i, encoding='utf-8') as file:
                if file.readlines()[-1] == job + ' \n':
                    cls.output_info(file_path=cls.path_dir + i)
                    flag_none = 1

        if not flag_none:
            print('\n\t\t  暂无数据\n')

    # 注销学号/工号
    @classmethod
    def logout_account(cls, job):

        # 确认身份
        if job == '学生':
            account = input('请输入学号:')
        else:
            account = input('请输入工号:')
        name = input(f'请输入{job}姓名:')

        # 获取目录信息
        import os
        dir_info = os.listdir(cls.path_dir)

        # 判断账号是否存在
        if f'{account}.txt' not in dir_info:
            if job == '学生':
                print('学号输入有误!')
            else:
                print('工号输入有误!')
            return

        # 获取文件信息
        with open(file=f'{cls.path_dir + account}.txt', encoding='utf-8') as file:
            file_info = file.readlines()

        # 判断账号是否为学生/教师
        if file_info[-1] != f'{job} \n':
            if job == '学生':
                print('此学号不存在!')
            else:
                print('此工号不存在!')
            return

        # 校对输入姓名
        if name + ' \n' != file_info[2]:
            print(f'{job}姓名输入有误!')
            return

        # 改变赋值
        if job == '学生':
            job = '学号'
        else:
            job = '工号'

        # 确认是否注销学号/工号
        while True:
            buf = input(f'请确认是否注销{job}(y/n):')
            if buf == 'y' or buf == 'Y':
                print(f'已成功注销{job}')
                break
            elif buf == 'n' or buf == 'N':
                print(f'已放弃注销{job}')
                return

        # 删除文件
        os.remove(path=f'{cls.path_dir + account}.txt')

    # 修改管理员密码
    @classmethod
    def change_admin_password(cls):
        old_password = input('请输入旧密码:')
        while True:
            new_password = input('请输入新密码:') + '@)@@)&)#'
            if new_password != '@)@@)&)#':
                new_password = new_password.split('@)@@)&)#')[0]
                break

        # 校验旧密码
        if old_password != cls.admin_password:
            print('旧密码输入错误!')
            return

        # 确认是否修改密码
        while True:
            buf = input('请确认是否修改管理员密码(y/n):')
            if buf == 'y' or buf == 'Y':
                print(f'已成功修改管理员密码')
                break
            elif buf == 'n' or buf == 'N':
                print('已放弃修改管理员密码')
                return

        # 修改密码
        cls.admin_password = new_password

        # 写入文件
        cls.write_the_message()

    # 归属地设置
    @classmethod
    def set_home_location(cls):
        while True:
            new_home_location = input('请输入新归属地:') + '@)@@)&)#'
            if new_home_location != '@)@@)&)#':
                new_home_location = new_home_location.split('@)@@)&)#')[0]
                break

        # 确认是否修改归属地
        while True:
            buf = input('请确认是否修改归属地(y/n):')
            if buf == 'y' or buf == 'Y':
                print(f'已成功修改归属地')
                break
            elif buf == 'n' or buf == 'N':
                print('已放弃修改归属地')
                return

        # 修改归属地
        cls.home_location = new_home_location

        # 写入文件
        cls.write_the_message()

    # 设置随机数位数
    @classmethod
    def set_rand_digit(cls):
        while True:
            new_rand_digit = input('请输入新随机数位数:') + '@)@@)&)#'
            if new_rand_digit != '@)@@)&)#':
                new_rand_digit = new_rand_digit.split('@)@@)&)#')[0]
                break

        # 确认是否修改随机数位数
        while True:
            buf = input('请确认是否修改归属地(y/n):')
            if buf == 'y' or buf == 'Y':
                print(f'已成功修改随机数位数')
                break
            elif buf == 'n' or buf == 'N':
                print('已放弃修改随机数位数')
                return

        # 修改随机数位数
        cls.rand_digit = new_rand_digit

        # 写入文件
        cls.write_the_message()

    # 设置默认密码
    @classmethod
    def set_default_password(cls):
        while True:
            new_default_password = input('请输入新默认密码:') + '@)@@)&)#'
            if new_default_password != '@)@@)&)#':
                new_default_password = new_default_password.split('@)@@)&)#')[0]
                break

        # 确认是否修改默认密码
        while True:
            buf = input('请确认是否修改默认密码(y/n):')
            if buf == 'y' or buf == 'Y':
                print(f'已成功修改默认密码')
                break
            elif buf == 'n' or buf == 'N':
                print('已放弃修改默认密码')
                return

        # 修改默认密码
        cls.default_password = new_default_password

        # 写入文件
        cls.write_the_message()


# 菜单功能框架类(单继承)  ===============================================================
class Menu_bar(Menu_realizes):

    # 注册 or 登录
    @classmethod
    def login_option(cls, num):
        # 注册 # 选择注册类型(学生/教师)
        if num == 1:
            while True:
                cls.regist_type_ui()
                num = cls.input_num(max=2, min=0, menu=2)
                if num == 0:
                    print('已返回')
                    break
                elif num == -1:
                    continue

                Menu_bar.regist_option(num=num)
                break

        # 登录
        elif num == 2:
            account = input('请输入学号/工号:')
            password = input('请输入密码:')

            # 检查账号密码是否正确
            job = cls.check_account_password(account=account, password=password)

            # 进入不同的系统
            # 学生系统
            if job == '学生':
                while True:
                    cls.stu_ui()
                    num = cls.input_num(max=3, menu=3)
                    if num == 0:
                        print('已返回')
                        return
                    cls.stu_option(num=num, account=account)

            # 教师系统
            elif job == '教师':
                while True:
                    cls.teach_ui()
                    num = cls.input_num(max=7, menu=4)
                    if num == 0:
                        print('已返回')
                        return
                    cls.teach_option(num=num, account=account)

            # 管理员系统
            elif job == '管理员':
                while True:
                    cls.admin_ui()
                    num = cls.input_num(max=8, menu=5)
                    if num == 0:
                        print('已返回')
                        return
                    cls.admin_option(num=num)

    # 选择学生注册 or 教师注册
    @classmethod
    def regist_option(cls, num):
        # 学生注册
        if num == 1:
            cls.show_title('学生注册')
            cls.regist_account(job='学生')

        # 教师注册
        elif num == 2:
            cls.show_title('教师注册')
            cls.regist_account(job='教师')

    # 选择学生功能
    @classmethod
    def stu_option(cls, num, account):
        # 文件拼接
        file_name = cls.path_dir + account + '.txt'

        # 1.查看学生信息
        if num == 1:
            cls.show_title(info='查看学生信息')
            cls.output_info(file_path=file_name)

        # 2.修改学生信息
        elif num == 2:
            cls.show_title(info='修改学生信息')
            cls.change_info(file_name=file_name)

        # 3.修改学生密码
        elif num == 3:
            cls.show_title(info='修改学生密码')
            cls.change_password(file_name=file_name)

    # 选择教师功能
    @classmethod
    def teach_option(cls, num, account):
        # 文件路径拼接
        file_name = cls.path_dir + account + '.txt'

        # 1.查看教师信息
        if num == 1:
            cls.show_title(info='查看教师信息')
            cls.output_info(file_path=file_name)

        # 2.修改教师信息
        elif num == 2:
            cls.show_title(info='修改教师信息')
            cls.change_info(file_name=file_name)

        # 3.修改教师密码
        elif num == 3:
            cls.show_title(info='修改教师密码')
            cls.change_password(file_name=file_name)

        # 4.重置学生密码
        elif num == 4:
            cls.show_title(info='重置学生密码')
            cls.reset_password(job='学生')

        # 5.查找学生信息
        elif num == 5:
            cls.show_title(info='查找学生信息')
            cls.find_info(job='学生')

        # 6.遍历学生信息
        elif num == 6:
            cls.show_title(info='遍历学生信息')
            cls.output_all_info(job='学生')

        # 7.注销学生账号
        elif num == 7:
            cls.show_title(info='注销学生账号')
            cls.logout_account(job='学生')

    # 选择管理员功能
    @classmethod
    def admin_option(cls, num):

        # 1.重置师生密码
        if num == 1:
            while True:
                cls.reset_password_ui()
                num = cls.input_num(max=2, menu=6)
                if num == 0:
                    print('已返回')
                    break
                elif num == 1:
                    cls.show_title(info='重置学生密码')
                    cls.reset_password(job='学生')
                    break
                elif num == 2:
                    cls.show_title(info='重置教师密码')
                    cls.reset_password(job='教师')
                    break

        # 2.修改管理员密码
        elif num == 2:
            cls.show_title(info='修改管理员密码')
            cls.change_admin_password()

        # 3.查找师生信息
        elif num == 3:
            cls.show_title(info='查找师生信息')
            cls.find_info(flag=True)

        # 4.设置账号归属地
        elif num == 4:
            cls.show_title(info='设置账号归属地')
            cls.set_home_location()

        # 5.遍历师生信息
        elif num == 5:
            while True:
                cls.output_info_ui()
                num = cls.input_num(max=2, menu=7)
                if num == 0:
                    print('已返回')
                    break
                elif num == 1:
                    cls.show_title(info='遍历学生信息')
                    cls.output_all_info(job='学生')
                    break
                elif num == 2:
                    cls.show_title(info='遍历教师信息')
                    cls.output_all_info(job='教师')
                    break

        # 6.设置随机数位数
        elif num == 6:
            cls.show_title(info='设置随机数位数')
            cls.set_rand_digit()

        # 7.注销师生账号
        elif num == 7:
            while True:
                cls.logout_account_ui()
                num = cls.input_num(max=2, menu=8)
                if num == 0:
                    print('已返回')
                    break
                elif num == 1:
                    cls.show_title(info='注销学生账号')
                    cls.logout_account(job='学生')
                    break
                elif num == 2:
                    cls.show_title(info='注销教师账号')
                    cls.logout_account(job='教师')
                    break

        # 8.设置默认密码
        elif num == 8:
            cls.show_title(info='设置默认密码')
            cls.set_default_password()


# 功能实现区(相当于C语言的主函数) =======================================================
while True:

    # 读取文件
    Menu_bar.read_the_message()

    Menu_bar.login_ui()                     # 注册 or 登录界面

    num = Menu_bar.input_num(max=2, min=0, menu=1)  # 选择菜单功能编号

    if num == 0:
        Menu_bar.show_title(info='已退出管理系统', num=7)
        Menu_bar.write_the_message()    # 写入文件
        break

    Menu_bar.login_option(num=num)          # 实现菜单功能



运行结果:

===欢迎来到师生信息管理系统===
   1.注册		2.登录
请选择功能:2
请输入学号/工号:123456
请输入密码:123456
====学生信息管理系统(管理员)====
1.重置师生密码	2.修改管理员密码
3.查找师生信息	4.设置账号归属地
5.遍历师生信息	6.设置随机数位数
7.注销师生账号	8.设置默认密码
0.退出
请选择功能:0
已返回
===欢迎来到师生信息管理系统===
   1.注册		2.登录
请选择功能:1
===欢迎来到注册账号管理系统===
1.学生注册		2.教师注册
请选择功能:1
=========学生注册=========
您的学号是:2207039778
请设置密码:123456
请输入学生姓名:周华
请输入学生手机号:10086
请输入学生家庭地址:广州
学号:2207039778	密码:123456	姓名:周华	手机号:10086	家庭地址:广州	
请确认是否保存信息(y/n):y
注册成功!
===欢迎来到师生信息管理系统===
   1.注册		2.登录
请选择功能:0
=======已退出管理系统=======

你可能感兴趣的:(Python,实用小程序,python)