美文网首页
Day-11 - 第二周作业(简易学生管理系统(账号登录系统更新

Day-11 - 第二周作业(简易学生管理系统(账号登录系统更新

作者: 雨雨雨90 | 来源:发表于2018-10-13 11:06 被阅读0次

    更新了一版答案,点此链接
    新增需求:
    1.学号递增,删除学员后学号不可再用
    2.重名检测,按序列打印学员,选择删除
    3.删除学员可以选择按照姓名或者学号
    4.添加登录系统,不同的账号存储不同的添加内容 (已添加)
    5.本地文件保存

    简介:
    本项目分为6个模块,其中界面模块为主程序,调用其他模块
    登录系统采用账号密码登录,不同账号对应不同班级学生列表
    在主界面中输入用户名,并将用户名作为参数传递给其他功能模块函数,用于获取不同账号对应班级列表
    萌新写的程序,有BUG,重要的事情说三遍!
    萌新写的程序,有BUG,重要的事情说三遍!
    萌新写的程序,有BUG,重要的事情说三遍!
    (尽力查找中- -)

    1. yxy_interface.py模块(界面模块):主界面程序

    
    from add_stu import add_stu
    import check_stu
    from delete_stu import del_stu
    from revise_stu import revise_stu
    import yxy_login
    """
    新增需求:
    1.学号递增,删除学员后学号不可再用 
    2.重名检测,按序列打印学员,选择删除 
    3.删除学员可以选择按照姓名或者学号 
    4.添加登录系统,不同的账号存储不同的添加内容 (已添加)
    5.本地文件保存
    
    """
    
    
    def main():
        print('简易版学生管理系统登录界面')
        user_name = input('请输入您的账号:')
        re = yxy_login.login_in(user_name)
        if re == 'quit':
            print('退出系统')
        else:
            stus = yxy_login.get_stus(user_name)
            stu_num = yxy_login.get_stu_num(user_name)
    
            # 编辑主界面循环
            while True:
                print('+' * 60)
                print('+' + '欢迎来到非常非常简易版的学生管理系统^_^'.center(40, ' ') + '+')
                print('+' + '1.添加学生信息'.center(52, ' ') + '+')
                print('+' + '2.查询学生信息'.center(52, ' ') + '+')
                print('+' + '3.删除学生信息'.center(52, ' ') + '+')
                print('+' + '4.修改学生信息'.center(52, ' ') + '+')
                print('+'+'5.退出'.center(56, ' ')+'+')
                print('+' * 60)
                step1 = int(input('请输入您想进行的操作:'))
    
                if step1 == 5:
                    break
    
                # 编辑添加学生的循环界面
                elif step1 == 1:
                    while True:
                        add_stu(user_name)
                        print('1.继续添加')
                        print('2.返回上一步')
                        step2 = int(input('请输入您想进行的操作: '))
    
                        if step2 == 2:
                            break
                        elif step2 == 1:
                            continue
                        else:
                            print('输入错误,请重新选择:')
                # 编辑查询学生的界面
                elif step1 == 2:
                    while True:
                        print('1.查询指定学生信息')
                        print('\n2.查询所有学生信息')
                        print('\n3.查询指定学生平均分')
                        print('\n4.返回上一步')
                        step3 = int(input('请输入您想进行的操作: '))
                        if step3 == 4:
                            break
                        elif step3 == 1:
                            check_stu.search_stu(user_name)
                        elif step3 == 2:
                            check_stu.check_all(user_name)
                        elif step3 == 3:
                            check_stu.avg_score(user_name)
                        else:
                            print('输入错误,请重新选择:')
                # 编辑删除学生的界面
                elif step1 == 3:
                    del_stu(user_name)
                # 编辑修改学生的界面
                elif step1 == 4:
                    revise_stu(user_name)
    
                else:
                    print('输入错误,请重新选择:')
    
    
    if __name__ == '__main__':
    
        main()
    

    2. yxy_login.py模块,登录模块,负责登录系统和数据的保存和载入

    import json
    
    """
    思路:
    建立数据的结构:
    老师1 = {'account':输入账号, 'password': 输入密码}
    list1 = [{老师1}, {老师2}]
    dict2 = {输入账号1:列表1, 输入账号2:列表2}
    dict3 = {输入账号1:学号池1,输入账号2:学号池2}
    
    登录后输入账号,密码
    保存在dict1中,如果信息不对,返回相应提示
    如果通过,导入老师对应的列表,以及对应的学号池
    """
    
    
    def print_stu(stu: dict):
        """
        定义一个函数,用来打印学生信息
        :param stu: 学生信息对应的字典
        :return:
        """
        print(
            'name: %s, 学号: %s, 英语成绩:%s, 体育成绩:%s, 美术成绩: %s,数学成绩: %s,年龄: %s,' %
            (stu['name'], stu['seq'], stu['en_score'], stu['ph_score'], stu['art_score'], stu['math_score'], stu['age'])
        )
    
    
    def save(dict1, filename):
            with open('./'+filename, 'w', encoding='utf-8') as fs:
                json.dump(dict1, fs)
    
    
    def load_dict(filename):
        try:
            with open('./'+filename, 'r', encoding='utf-8') as fs:
                dict1 = json.load(fs)
            return dict1
        except FileNotFoundError:
            save({}, filename)
            return {}
    
    
    def load_list(filename):
        try:
            with open('./'+filename, 'r', encoding='utf-8') as fs:
                dict1 = json.load(fs)
            return dict1
        except FileNotFoundError:
            save([], filename)
            return []
    
    
    list_account = load_list('list_account.json')
    dict_stus = load_dict('dict_stus.json')
    dict_num = load_dict('dict_num.json')
    
    
    def get_stus(user_name):
    
        stus = dict_stus[user_name]  # 班级列表
        return stus
    
    
    def get_stu_num(user_name):
    
        stu_num = dict_num[user_name]  # 学号池当前可用序列
        return stu_num
    
    
    def register() -> str:
        """
        定义一个注册函数,用来注册用户的账号密码,并保持到本地文件,函数返回输入账号对应的字符串
        :return:
        """
        dict_account = {}
        print('欢迎来到注册系统!')
        account = input('请输入账号,按q退出注册:')
        if account == 'q':
            print('退出注册!')
            return 'quit'
        while True:
            password = input('请输入密码,按q退出注册: ')
            if password == 'q':
                print('退出注册!')
                return 'quit'
            re_password = input('请再次输入密码以确认: ')
            if re_password == password:
                print('恭喜您注册成功!')
                dict_account['account'] = account  # 初始化账号密码列表
                dict_account['password'] = password
                list_account.append(dict_account)
                save(list_account, 'list_account.json')
                dict_stus[account] = []  # 初始化 账号:班级列表 字典
                dict_num[account] = 1  # 初始化 账号:学号池 字典
                save(dict_stus, 'dict_stus.json')
                save(dict_num, 'dict_num.json')
                return account
            else:
                print('输入密码错误,请重新创建密码')
                continue
    
    
    def login_in(user_name):
        # 登录界面循环
        while True:
    
            # 先检测账号,账号匹配就检测密码
            for item in list_account:
                if item['account'] == user_name:
                    # 检测密码的循环,通过函数返回值为账号,退出返回'quit',输入错误循环输入
                    while True:
                        password = input('请输入您的密码,输入q退出系统')
                        if password == 'q':
                            return 'quit'
                        elif password == item['password']:
                            print('='*20 + '\n' + 'welcome back!' + user_name + '\n' + '='*20)
                            return user_name
                        else:
                            print('您的密码不正确,请重新输入')
                            continue
    
            # 账号不匹配让用户进行注册,退出返回'quit',注册成功函数返回用户名
            else:
                print('您的账号不存在!')
                while True:
                    step1 = int(input('按1注册账号,按0退出系统'))
                    if step1 == 1:
                        return register()
                    elif step1 == 0:
                        return 'quit'
                    else:
                        print('您的输入不正确!请重新输入')
                        continue
    
    

    3. add_stu.py模块,学生信息添加功能模块

    注意:学号基于生成器生成,但是生成器每次运行会重置,所以生成器初始序号也需要文件保存到本地

    import yxy_login
    
    # def save_num(num: int):
    #     """
    #     定义一个函数,用来保存当前的下一个学号序列
    #     :param num: 学号对应的数字序列
    #     :return:
    #     """
    #     with open('./stu_num.txt', 'w', encoding='utf-8') as fs:
    #         fs.write(str(num+1))
    #
    #
    # def load_num():
    #     """
    #     定义一个函数,用来读取当前可用的学号序列
    #     :return: 数字,学号序列
    #     """
    #     try:
    #         with open('./stu_num.txt', 'r', encoding='utf-8') as fs:
    #             num = fs.read()
    #             return int(num)
    #     except FileNotFoundError:
    #         save_num(1)
    #         return 1
    
    
    # 定义一个生产学号的生成器
    
    def seq_generator(user_name):
        stu_num = yxy_login.get_stu_num(user_name)
        num = stu_num  # 从保存的本地文件中导入当前可用学号
        if num >= 1000:
            print('学号超限,请重置')
            yield 0
    
        for x in range(num, 10000):
            yield x
    
    
    # 定义一个全局变量re_seq用来存放生成器地址
    
    def get_seq(user_name):
        """
        定义一个函数,用来获得学号
        :return: 字符串,学号
        """
        global re_seq
        re_seq = seq_generator(user_name)
        num = next(re_seq)
        # save_num(num)
        yxy_login.dict_num[user_name] = num + 1
        yxy_login.save(yxy_login.dict_num, 'dict_num.json')
        return 'py1807' + str(num).rjust(4,'0')
    
    
    def add_stu(user_name):
        # 创建一个函数用来添加学生
        infors = {}
        # 创建一个用来存放输入学生信息的字典
        name = input('请输入要添加学生的姓名: ')
        infors['name'] = name.title()
        infors['seq'] = get_seq(user_name)
        en_score = input('请输入要添加学生的英语成绩: ')
        infors['en_score'] = en_score
        ph_score = input('请输入要添加学生的体育成绩: ')
        infors['ph_score'] = ph_score
        art_score = input('请输入要添加学生的美术成绩: ')
        infors['art_score'] = art_score
        math_score = input('请输入要添加学生的数学成绩: ')
        infors['math_score'] = math_score
        age = input('请输入要添加学生的年龄: ')
        infors['age'] = age
        stus = yxy_login.get_stus(user_name)
        stus.append(infors)
        yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
        return stus
    
    
    

    4. check_stu.py模块,查找功能模块,删除和修改功能也会基于此模块编写

    import yxy_login
    
    
    def check_all(user_name):
        """
        打印全班所有学生的信息
        :return:
        """
        stus = yxy_login.get_stus(user_name)
        print('班级所有学生信息如下:')
        for stu in stus:
            yxy_login.print_stu(stu)
    
    
    # def search_stu_name(name: str) -> list:
    #     """
    #     生成重名列表:根据姓名查找学生信息,并将学生(包括重名的)存入列表
    #     :return:
    #     """
    #     search_list = []
    #     name = name.title()
    #     # 使用姓名匹配学生,将重名学生存入列表
    #     for stu in yxy_login.stus:
    #         if stu['name'] == name:
    #             search_list.append(stu)
    #     if not search_list:
    #         print('该学生不在班级里面')
    #
    #     return search_list
    def search_stu_name(name: str, user_name) -> list:
        """
        生成重名列表:根据姓名查找学生信息,并将重名学生对应在数据库原列表的下标存入列表
        :return:
        """
        stus = yxy_login.get_stus(user_name)
        search_list = []
        name = name.title()
        # 使用姓名匹配学生,将重名学生存入列表
        index = 0  # 用来存放重名学生在stus列表中的下标
        for stu in stus:
            # print(stu)
            if stu['name'] == name:
                search_list.append(index)
            index += 1
        if not search_list:
            print('该学生不在班级里面')
    
        return search_list
    
    
    def print_stu_list(search_list: list, user_name):
        """
        打印重名学生信息:根据按姓名查找返回的结果列表,打印出学生的信息
        :param search_list:
        :return:
        """
        stus = yxy_login.get_stus(user_name)
        i = 0
        for index in search_list:
            print('序号:%s ' % (i), end='')
            yxy_login.print_stu(stus[index])
            i += 1
    
    
    def return_stu_name(user_name):
        """
        输入学生名字查找学生,在重名时,根据选择的序号,返回所选择学生在数据库中的元素
        如果找不到,返回空字典
        :return:
        """
        stus = yxy_login.get_stus(user_name)
        name = input('请输入您要查找的学生的名字:')
        search_list = search_stu_name(name, user_name)
        if not search_list:
            return {}
        print_stu_list(search_list, user_name)
        num = int(input('请输入您想选择的学生的序号:'))
        index = search_list[num]
        stu = stus[index]
        return stu
    
    
    def search_stu_num(stu_num: str, user_name) -> dict:
        """
        根据学号查找学生,并返回在数据库中的元素,没有返回为空
        :param stu_num: 字符串,学生学号
        :return: 学生对应的字典
        """
        stus = yxy_login.get_stus(user_name)
        se_stu = {}  # 新建字典用来存放查找结果
        # 根据学号查找,找到就将结果赋值给se_stu
        for stu in stus:
            if stu['seq'] == stu_num:
                return stu
    
        else:
            print('该学生不在班级里面')
            return {}
    
    
    def search_stu(user_name):
        while True:
            print('1.根据学生姓名查找')
            print('2.根据学生学号查找')
            print('3.返回上一级')
            try:
                step1 = int(input('请输入您想进行的操作: '))
    
                if step1 == 3:
                    break
                elif step1 == 1:
                    name = input('请输入您要查找的学生的名字:')
                    search_list = search_stu_name(name, user_name)
                    print_stu_list(search_list, user_name)
                elif step1 == 2:
                    stu_num = input('请输入您要查找的学生的学号:')
                    stu = search_stu_num(stu_num, user_name)
                    yxy_login.print_stu(stu)
                else:
                    print('输入错误,请重新选择:')
            except ValueError:
                print('请输入对应数字')
    
    # def avg_score():
    #     name = input('请输入要求平均成绩的学生的姓名: ')
    #     name = name.title()
    #     index = 0
    #     search_dict = {}
    #     # 使用姓名匹配学生,将重名学生存入字典
    #     for stu in yxy_login.stus:
    #         if stu['name'] == name:
    #             print('name: %s, 学号: %s,' % (stu['name'], stu['seq']))
    #             search_dict[stu['seq']] = index
    #         index += 1
    #     if not search_dict:
    #         print('您所查找的学生不在班级里面')
    #     elif len(search_dict) == 1:
    #         for key in search_dict:
    #             index = search_dict[key]
    #         se_stu = yxy_login.stus[index]
    #         avg = (int(se_stu['en_score']) + int(se_stu['ph_score']) + int(se_stu['art_score']) + int(
    #             se_stu['math_score'])) / 4
    #         print('您要查询的学生的平均成绩为%.1f' % (avg))
    #     else:
    #         search_num = input('请输入您要查询的以上学生的学号以确认: ')
    #         search_index = search_dict[search_num]
    #         se_stu = yxy_login.stus[search_index]
    #         avg = (int(se_stu['en_score']) + int(se_stu['ph_score']) + int(se_stu['art_score']) + int(se_stu['math_score']))/4
    #         print('您要查询的学生的平均成绩为%.1f' % (avg))
    
    
    def get_avg(stu: dict):
        avg = (int(stu['en_score']) + int(stu['ph_score']) + int(stu['art_score']) + int(stu['math_score']))/4
        print('该学生的平均分为:%s' % (avg))
        return avg
    
    
    def avg_score(user_name):
        while True:
            print('1.根据学生姓名查询平均分')
            print('2.根据学生学号查询平均分')
            print('0.返回上一级')
            step1 = int(input('请输入您想进行的操作: '))
            if step1 == 0:
                break
            elif step1 == 1:
                stu = return_stu_name(user_name)  # 调用输入姓名,并选择序号后,返回所选择学生在数据库中元素的函数
                get_avg(stu)
            elif step1 == 2:
                stu_num = input('请输入您要查找的学生的学号:')
                stu = search_stu_num(stu_num, user_name)
                yxy_login.print_stu(stu)
                get_avg(stu)
    
            else:
                print('输入错误,请重新选择:')
    
    
    

    5. delete_stu.py模块,删除学生信息功能模块

    import yxy_login
    import check_stu
    
    
    # def del_from_list(del_stu: dict):
    #     """
    #     根据学生所对应的字典,去班级学生列表中删除学生
    #     :param stu:
    #     :return:
    #     """
    #     stu_num = del_stu['seq']
    #     for stu in yxy_login.stus.copy():
    #         if stu['seq'] == stu_num:
    #             yxy_login.stus.remove(stu)
    #             break
    
    def del_stu(user_name):
        """
        删除指定的学生
        :return:
        """
        stus = yxy_login.get_stus(user_name)
        while True:
            print('1.根据名字删除')
            print('2.根据学号删除')
            print('3.返回上一级')
            step1 = int(input('请输入您想进行的操作: '))
            if step1 == 3:
                break
            elif step1 == 1:
                stu = check_stu.return_stu_name(user_name)  # 调用输入姓名,并选择序号后,返回所选择学生在数据库中元素的函数
                # print(stu)
                stus.remove(stu)
                yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
                print('恭喜恭喜恭喜您!删除成功')
            elif step1 == 2:
                stu_num = input('请输入您要删除的学生的学号:')
                stu = check_stu.search_stu_num(stu_num, user_name)
                stus.remove(stu)
                yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
                print('恭喜恭喜恭喜您!删除成功')
            else:
                print('输入错误,请重新选择:')
    
    

    6. revise_stu.py模块,修改学生信息功能模块

    import yxy_login
    import check_stu
    
    def revise_specified(stu: dict):
        """
        输入指定的学生在数据库的元素,并修改指定的值
        :param stu:
        :return:
        """
        while True:
            print('1.修改姓名')
            print('2.修改英语成绩')
            print('3.修改体育成绩')
            print('4.修改美术成绩')
            print('5.修改数学成绩')
            print('6.修改年龄')
            print('0.返回上一级')
            r_key = int(input('请输入您想进行的操作:'))
            if r_key == 0:
                break
            elif r_key == 1:
                r_key = 'name'
            elif r_key == 2:
                r_key = 'en_score'
            elif r_key == 3:
                r_key = 'ph_score'
            elif r_key == 4:
                r_key = 'art_score'
            elif r_key == 5:
                r_key = 'math_score'
            elif r_key == 6:
                r_key = 'age'
            else:
                print('输入错误,请重新输入: ')
                continue
            r_value = input('请修改所选项的值:')
            if r_key == 'name':
                stu[r_key] = r_value.title()
            else:
                stu[r_key] = r_value
            return stu
    
    
    def revise_all(stu):
        keys = list(stu)
        for key in keys:
            if key == 'seq':
                break
            value = input('请依次输入需要修改的学生信息')
            stu[key] = value
    
        return stu
    
    
    def revise_menu(stu):
        while True:
            print('1.修改该学生全部信息')
            print('2.修改指定项信息')
            print('0.返回上一级')
            step1 = int(input('请输入您想进行的操作: '))
            if step1 == 0:
                break
            elif step1 == 1:
                revise_all(stu)
                print('恭喜恭喜恭喜您!修改成功')
            elif step1 == 2:
                revise_specified(stu)
                print('恭喜恭喜恭喜您!修改成功')
            else:
                print('输入错误,请重新选择:')
    
    
    def revise_stu(user_name):
        while True:
            print('1.根据名字查找需要修改的学生')
            print('2.根据学号查找需要修改的学生')
            print('3.返回上一级')
            step1 = int(input('请输入您想进行的操作: '))
            if step1 == 3:
                break
            elif step1 == 1:
                stu = check_stu.return_stu_name(user_name)  # 调用输入姓名,并选择序号后,返回所选择学生在数据库中元素的函数
                revise_menu(stu)
                yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
    
            elif step1 == 2:
                stu_num = input('请输入您要查找的学生的学号:')
                stu = check_stu.search_stu_num(stu_num, user_name)
                yxy_login.print_stu(stu)
                revise_menu(stu)
                yxy_login.save(yxy_login.dict_stus, 'dict_stus.json')
    
            else:
                print('输入错误,请重新选择:')
    
    

    相关文章

      网友评论

          本文标题:Day-11 - 第二周作业(简易学生管理系统(账号登录系统更新

          本文链接:https://www.haomeiwen.com/subject/khcoaftx.html