Day-12 - 作业(2018-10-15)

作业一:学生关系系统最小系统,做数据本地化
作业二:写一个登陆注册
====================
1.登陆
2.注册
3.退出
====================
2
输入账号: aaa
输入密码:123456
提示注册成功!

====================
1.登陆
2.注册
3.退出
====================
1
账号:aaa
密码:123
密码错误

账号:bbb
账号不存在
"""
"""
思路:
建立数据的结构:
老师1 = {'account':输入账号, 'password': 输入密码}
list1 = [{老师1}, {老师2}]
dict2 = {输入账号1:列表1, 输入账号2:列表2}
dict3 = {输入账号1:学号池1,输入账号2:学号池2}

登录后输入账号,密码
保存在dict1中,如果信息不对,返回相应提示
如果通过,导入老师对应的列表,以及对应的学号池
"""
主函数yxy_main.py

import yxy_login
from add_stu import add_stu
import check_stu
from delete_stu import del_stu
from revise_stu import revise_stu


def main():
    user_name = yxy_login.login_menu()
    if not user_name:
        print('退出系统!')
    else:
        # 编辑主界面循环
        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)
            try:
                step1 = int(input('请输入您想进行的操作:'))
            except ValueError:
                print('请输入正确的数字!')
                continue

            if step1 == 5:
                break

            # 编辑添加学生的循环界面
            elif step1 == 1:
                while True:
                    add_stu(user_name)
                    print('1.继续添加')
                    print('2.返回上一步')
                    try:
                        step2 = int(input('请输入您想进行的操作: '))
                    except ValueError:
                        print('请输入正确的数字!')
                        continue

                    if step2 == 2:
                        break
                    elif step2 == 1:
                        continue
                    else:
                        print('请输入正确的数字!')
            # 编辑查询学生的界面
            elif step1 == 2:
                while True:
                    print('1.查询指定学生信息')
                    print('\n2.查询所有学生信息')
                    print('\n3.查询指定学生平均分')
                    print('\n4.返回上一步')
                    try:
                        step3 = int(input('请输入您想进行的操作: '))
                    except ValueError:
                        print('请输入正确的数字!')
                        continue
                    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()

登录系统yxy_login.py

import json
"""
作业一:学生关系系统最小系统,做数据本地化

作业二:写一个登陆注册
====================
1.登陆
2.注册
3.退出
====================
2
输入账号: aaa
输入密码:123456
提示注册成功!

====================
1.登陆
2.注册
3.退出
====================
1
账号:aaa
密码:123
密码错误

账号:bbb
账号不存在
"""
"""
思路:
建立数据的结构:
老师1 = {'account':输入账号, 'password': 输入密码}
list1 = [{老师1}, {老师2}]
dict2 = {输入账号1:列表1, 输入账号2:列表2}
dict3 = {输入账号1:学号池1,输入账号2:学号池2}

登录后输入账号,密码
保存在dict1中,如果信息不对,返回相应提示
如果通过,导入老师对应的列表,以及对应的学号池
"""


def yxy_save(content: dict or list, file_name):
    """
    用于进行文件保存
    :param content:
    :param file_name:
    :return:
    """
    with open('./homework/' + file_name, 'w', encoding='utf-8') as f1:
        json.dump(content, f1)


def yxy_load(empty_content, file_name):
    """
    用于进行文件读取,返回文件内容
    :param content: 空字典或者空列表,对应想要读取的数据类型
    :param file_name:
    :return:
    """
    try:
        with open('./homework/' + file_name, 'r', encoding='utf-8') as f1:
            content = json.load(f1)
            return content
    except FileNotFoundError:
        yxy_save(empty_content, file_name)
        return empty_content


account_list = yxy_load([], 'account_list.json')
dict_stus = yxy_load({}, 'dict_stus.json')
dict_num = yxy_load({}, '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():
    print('欢迎来到注册系统!')
    while True:
        username = input('请输入您的用户名,按q退出注册:')
        if username == 'q':
            print('退出注册!')
            return
        else:
            password = input('请输入您的密码:')
            re_password = input('请确认您的密码:')
            if re_password == password:
                print('恭喜您,注册成功!')
                dict1 = {}  # 创建字典用来存储注册账户信息
                dict1['username'] = username
                dict1['password'] = password
                account_list.append(dict1)
                yxy_save(account_list, 'account_list.json')
                dict_stus[username] = []  # 初始化账号对应的空列表,用来存放学生信息
                yxy_save(dict_stus, 'dict_stus.json')
                dict_num[username] = 0  # 初始化账号对应的学号池
                yxy_save(dict_num, 'dict_num.json')
                return
            else:
                print('密码输入不正确,返回注册页面!')
                continue


def check_password(account):
    password = input('请输入密码:')
    if password == account['password']:
        return True
    else:
        return False



def login_in():
    user_name = input('请输入用户名:')
    for account in account_list:
        if user_name == account['username']:
            re = check_password(account)
            if re:
                print('欢迎回来,%s' % (user_name))
                return user_name
            else:
                print('密码校验错误,返回上一级页面!')
                return False

    else:
        print('账户名不存在,返回上一级页面!')
        return False



def login_menu():
    while True:
        print('=====================')
        print('学生管理系统登录界面')
        print('1.登录')
        print('2.注册')
        print('0.退出')
        print('=====================')

        try:
            step1 = int(input('请选择您想进行的操作: '))
        except ValueError:
            print('输入错误,请输入对应的数字!')
            continue

        if step1 == 0:
            return False
        elif step1 == 1:
            re = login_in()
            if not re:
                continue
            else:
                return re
        elif step1 == 2:
            register()
            continue

if __name__ == '__main__':
    login_menu()

add_stu.py:

import yxy_login


# 定义一个生产学号的生成器

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.yxy_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.yxy_save(yxy_login.dict_stus, 'dict_stus.json')
    return stus

check_stu.py:

import yxy_login

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 check_all(user_name):
    """
    打印全班所有学生的信息
    :return:
    """
    stus = yxy_login.get_stus(user_name)
    print('班级所有学生信息如下:')
    for stu in stus:
        print_stu(stu)



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='')
        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('请输入您想进行的操作: '))
        except ValueError:
            print('请输入对应数字')
            continue

        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)
            print_stu(stu)
        else:
            print('输入错误,请重新选择:')




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.返回上一级')
        try:
            step1 = int(input('请输入您想进行的操作: '))
        except ValueError:
            print('请输入对应数字')
            continue
        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)
            print_stu(stu)
            get_avg(stu)

        else:
            print('输入错误,请重新选择:')

delete_stu.py:

import yxy_login
import check_stu


def del_stu(user_name):
    """
    删除指定的学生
    :return:
    """
    stus = yxy_login.get_stus(user_name)
    while True:
        print('1.根据名字删除')
        print('2.根据学号删除')
        print('3.返回上一级')
        try:
            step1 = int(input('请输入您想进行的操作: '))
        except ValueError:
            print('请输入对应数字')
            continue
        if step1 == 3:
            break
        elif step1 == 1:
            stu = check_stu.return_stu_name(user_name)  # 调用输入姓名,并选择序号后,返回所选择学生在数据库中元素的函数
            # print(stu)
            stus.remove(stu)
            yxy_login.yxy_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.yxy_save(yxy_login.dict_stus, 'dict_stus.json')
            print('恭喜恭喜恭喜您!删除成功')
        else:
            print('输入错误,请重新选择:')


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.返回上一级')
        try:
            r_key = int(input('请输入您想进行的操作: '))
        except ValueError:
            print('请输入对应数字')
            continue
        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.返回上一级')
        try:
            step1 = int(input('请输入您想进行的操作: '))
        except ValueError:
            print('请输入对应数字')
            continue
        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.返回上一级')
        try:
            step1 = int(input('请输入您想进行的操作: '))
        except ValueError:
            print('请输入对应数字')
            continue
        if step1 == 3:
            break
        elif step1 == 1:
            stu = check_stu.return_stu_name(user_name)  # 调用输入姓名,并选择序号后,返回所选择学生在数据库中元素的函数
            revise_menu(stu)
            yxy_login.yxy_save(yxy_login.dict_stus, 'dict_stus.json')

        elif step1 == 2:
            stu_num = input('请输入您要查找的学生的学号:')
            stu = check_stu.search_stu_num(stu_num, user_name)
            check_stu.print_stu(stu)
            revise_menu(stu)
            yxy_login.yxy_save(yxy_login.dict_stus, 'dict_stus.json')

        else:
            print('输入错误,请重新选择:')

你可能感兴趣的:(Day-12 - 作业(2018-10-15))