Python_学生选课系统_装饰器_V1.03版本_(3)

创作不易,各位看官,点个赞收藏、关注必回关、QAQ、您的点赞是我更新的最大动力!


接着上一篇文章 [函数式开发一个学生选课系统]继续完成代码
后面会逐步编程模块式开发,慢慢升级,过程当中可能会出现逻辑上不全,QAQ
第二个版本V1.02 函数式编程开发:https://blog.csdn.net/weixin_44238683/article/details/105822475

#v1.03 开发日志 :
需求:学生选课系统添加功能 ,学生选课,管理员增加、删除课程前需要验证,
			输入4位验证码才可以执行后续功能
			
策略:通过装饰器来验证

在 V1.01,V1.02 的基础上完善了功能出现bug情况,学生选课不输入编号报错问题

生成验证码:
这里简单的生成就好了,小写字母和数字,可以大写字母

import string
import random

#生成ascii 字母表 小写
# print(string.ascii_lowercase)

#小写字母集合
lst_word = []
#数字集合
lst_digits = []

#生成小写字母
for a in string.ascii_lowercase:
    lst_word.append(a)
#生成 数字
for a in string.digits :
    lst_digits.append(a)

#选取4个组合
n = random.randint(1,4)
choice_1 = random.choices(lst_word,k=n)
choice_2 = random.choices(lst_digits,k=4-n)
#生成验证码
lst_3 = choice_1+choice_2 #["q","2","2","w"]
check_ma = "".join(lst_3) #拼接成一个字符串
print(check_ma)

有了这个东西把通过验证封装到装饰器

这里的话,相对V1.02 在学生和管理员界面中,做出选择时候,封装出3个函数,并且进行装饰
三个函数:
			stu_choice_course()  相对于V1.02 在157行拿出去封装的
			admin_add_course() 同样的 191
			admin_remove_courses()   195
装饰器:
			将验证码放到里面,并且通过登录用户来返回相对应页面
"""
"""
项目描述:学生选课系统 装饰器
时间:2020-04-29
版本:v1.03
作者:稳稳c9

需求:
    学生选课系统添加功能 ,学生选课,管理员增加、删除课程前需要验证,
    输入4位验证码才可以执行后续功能

"""
import os
#课程存储
course_dic = {
    "1":{"course":"Python"},
    "2":{"course":"Java"},
    "3":{"course":"Web"},
    "4":{"course":"unity"},
    "5":{"course":"UI"}
}
#管理员
admin_dic = {"admin":"123"}
#学生
users_dict = { "1":{"username":"1","password":"1","course":["Python"]}}
#装饰器 检验功能
def outter(f):
    def inner():
        # 验证码
        import string
        import random

        # 小写字母集合
        lst_word = []
        # 数字集合
        lst_digits = []

        # 生成小写字母
        for a in string.ascii_lowercase:
            lst_word.append(a)
        # 生成 数字
        for a in string.digits:
            lst_digits.append(a)

        # 选取4个组合
        n = random.randint(1, 4)
        choice_1 = random.choices(lst_word, k=n)
        choice_2 = random.choices(lst_digits, k=4 - n)
        # 生成验证码
        lst_3 = choice_1 + choice_2  # ["q","2","2","w"]
        check_ma = "".join(lst_3)  # 拼接成一个字符串
        print(f"验证码→→→→→→→→{check_ma}")

        ret = input("请输入4位验证码 :")
        #验证码正确启动函数
        if ret == check_ma:
            f()
        else:
            input("验证码输入错误,按任意键回到主菜单")
            #通过用户名分别跳转自己的界面
            if username in users_dict:
                return student_page()
            elif username in admin_dic:
                return admin_page()
    return inner
#打印系统主页面
def show_index():
    os.system("cls")
    # 打印主界面菜单
    print("         学生选课系统")
    print("◆" * 30)
    print("         1.用户登录[学生/管理员]")
    print("         2.用户注册")
    print("         3.密码修改")
    print("         4.退出系统")
    print("◆" * 30)

    # 提示用户输入选项
    choice = input("请输入您的选项:").strip()

    #启动用户检测
    if choice == "1" :
        login_check()
    # 启动用户注册
    elif choice == "2":
        user_regist()
    # 启动密码修改
    elif choice == "3":
        change_password()
    # 退出系统
    else:
        pass
# 用户登录
def login_check():
    global username,password
    # 提示用户输入账户密码
    username = input("请输入您的账户:")
    password = input("请输入您的密码:")
    # 学生判断
    if username in users_dict:
        # 获取用户储存信息 并且根据账户获取密码
        data_password = users_dict.get(username).get("password")
        # 判断密码是否正确
        if password == data_password:
            # 跳转学生界面
            student_page()
    # 管理员判断
    elif username in admin_dic:
        # 获取用户储存信息 并且根据账户获取密码
        data_password = admin_dic.get(username)
        # 判断密码是否正确
        if password == data_password:
            # 跳转管理员界面
                admin_page()
    else :
        input("账户不存在或密码错误..按任意键返回主菜单")
        return show_index()
# 用户注册
def user_regist():
    # 提示用户输入想要注册账户名
    username = input("请输入您的账户:")

    # 检测账户名是否已经存在库中
    if username in users_dict:
        input("对不起,您注册的账户已存在,按任意键返回主菜单")
        # 回到主页面
        return show_index()
    else:
        # 提示用户输入密码
        password = input("请输入注册账户密码:")
        confirm_ps = input("请再一次输入密码:")

        # 确保两次密码一致
        if password == confirm_ps:
            # 一致后录入注册信息
            users_dict[username] = {
                "username": username,
                "password": password,
                "course": []
            }
            input("注册成功,按任意键退出")
            return show_index()
        else:
            input("两次密码不一致,按任意键返回主菜单")
            return show_index()
# 学生界面
def student_page():
    print("◆" * 30)
    print("         1.选课")
    print("         2.查看已选课程")
    print("         3.任意键返回上一级")
    print("◆" * 30)
    # 提示学生做出选择
    choice_stu = input("请输入您的选项:").strip()
    # 选课
    if choice_stu == "1":
            # 比较V1.02 拿出去单独封装
            stu_choice_course()
    # 查看已选课程
    elif choice_stu == "2":
        # 获取用户已选课程数据
        user_course = users_dict.get(username).get('course')
        print(f"您已选择的课程:{user_course}")
        input("按任意键返回上一级")
        return student_page()
    # 返回上一级
    else:
        return show_index()
# 管理员界面
def admin_page():
    print("◆" * 30)
    print("         1.查看课程")
    print("         2.添加课程")
    print("         3.删除课程")
    print("         4.任意键返回上一级")
    print("◆" * 30)

    # 提醒管理员做出选择
    choice_adm = input("请输入您的选项:").strip()

    # 查看课程 1
    if choice_adm == "1":
        # 打印出可选课程信息
        print("课程编号\t课程名称")
        for key, value in course_dic.items():
            print(f"{key}\t\t{value.get('course')}")
        input("按任意键返回上一级")
        return admin_page()
    # 添加课程 2
    elif choice_adm == "2":
        # 比较V1.02 拿出去单独封装
        admin_add_course()
    # 删除课程 3
    elif choice_adm == "3":
        # 比较V1.02 拿出去单独封装
        admin_remove_courses()
    # 返回上一级 4
    else:
        return show_index()
# 密码修改界面
def change_password():
    username = input("请输入您原来的账户 : ").strip()
    password = input("请输入您原来的密码 :").strip()
    if username in users_dict:  # 检测用户输入的账户是否在 字典中
        user = users_dict.get(username)  # 根据键获取用户对应的值,
        if password in user.get("password"):  # get("password")即得到了对应的值
            while True:
                check_new_password = input("请输入您需要修改的新密码 : ")
                check_new_again = input("请再次输入您需要修改的新密码 : ")
                if check_new_password == check_new_again:
                    user["password"] = check_new_password
                    input("修改完毕。。按任意键返回上一级")
                    return show_index()
                else:
                    input("账户或者密码不存在,按任意键返回上一级")
                    return show_index()
        else:
            input("密码错误,按任意键返回上级")
            return show_index()
    else:
        input("账户不存在。。按任意键返回上级")
        return show_index()
# 学生选课界面
@outter
def stu_choice_course():
    # 打印出可选课程信息
    print("课程编号\t课程名称")
    for key, value in course_dic.items():
        print(f"{key}\t\t{value.get('course')}")
    # 选课
    choice_course = input("请输入您的选项:").strip()
    if choice_course :
        # 通过用户输入的编号获取课程存储
        res = course_dic.get(choice_course).get("course")
        # 检测用户是否重复选择课程
        if res in users_dict.get(username).get('course'):
            input("您已选择该课程,请勿重复选择,按任意键返回上一级..")
            return student_page()
        # 用户课程数据没有 该课程
        else:
            users_dict.get(username).get('course').append(res)
            input(f"您已成功选择课程:{res}..按任意键返回上一级")
            return student_page()
    else:
        input("请输入正确的选项")
        return stu_choice_course()

# 管理员添加课程界面
@outter
def admin_add_course():
    # 提示管理员 添加课程名称
    add_course = input("请输入需要添加的课程名称: ").strip()
    # 根据已经存在的课程数量 获取编号建立如"6"
    id = str(len(course_dic) + 1)
    # 遍历出课程
    course_check = []
    for a in course_dic.values():
        b = a.get("course")
        course_check.append(b.upper())
    if add_course.upper() in course_check:
        input(f"您添加{add_course}课程已存在..按任意键返回上一级")
        return admin_page()
    else:
        course_dic[id] = {
            "course": add_course
        }
        input(f"您已成功添加课程{add_course}.按任意键返回上一级")
        return admin_page()

# 管理员删除课程界面
@outter
def admin_remove_courses():
    while True:
        # 展示已有课程
        print("课程编号\t课程名称")
        for key, value in course_dic.items():
            print(f"{key}\t\t{value.get('course')}")
        # 提示管理员 删除课程名
        rem_course = input("请输入需要删除的课程编号: ").strip()
        if rem_course in course_dic.keys():
            # 并且删除用户课程中的信息 TODO
            c = course_dic.get(rem_course).get("course")
            for d in users_dict.values():
                if c in d.get('course'):
                    d.get('course').remove(c)
                else:
                    break
            # 删除系统课程中
            course_dic.pop(rem_course)
            input("您已经成功删除,按任意键返回上一级.")
            return admin_page()
        else:
            input("请输入正确的课程编号!..按任意键继续")
            return admin_page()

# 系统退出
def system_exit():
    pass

show_index()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值