創作不易,各位看官,點個贊收藏、關注必回關、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()