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

更新了一版答案,点此链接
新增需求:
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('输入错误,请重新选择:')

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342