本節作業: 選課系統 角色:學校、學員、課程、講師要求:1. 創建北京、上海 2 所學校2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開3. 課程包含,周期,價格,通過學校創建課程 4. 通過學校創建班級, 班級關聯課程、講師5. 創建學員 ...
本節作業: 選課系統
角色:學校、學員、課程、講師
要求:
1. 創建北京、上海 2 所學校
2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
3. 課程包含,周期,價格,通過學校創建課程
4. 通過學校創建班級, 班級關聯課程、講師
5. 創建學員時,選擇學校,關聯班級
5. 創建講師角色時要關聯學校,
6. 提供兩個角色介面
7. 學員視圖, 可以註冊, 交學費, 選擇班級,
8. 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績
9. 管理視圖,創建講師, 創建班級,創建課程
10. 上面的操作產生的數據都通過pickle序列化保存到文件里
程式:
1、最最重要的readme:
### 作者介紹: * author:lzl ### 博客地址: * http://www.cnblogs.com/lianzhilei/p/5813986.html ### 功能實現 1. 創建北京、上海 2 所學校 2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開 3. 課程包含,周期,價格,通過學校創建課程 4. 通過學校創建班級, 班級關聯課程、講師 5. 創建學員時,選擇學校,關聯班級 5. 創建講師角色時要關聯學校, 6. 提供兩個角色介面 6.1 學員視圖, 可以註冊, 交學費, 選擇班級, 6.2 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績 6.3 管理視圖,創建講師, 創建班級,創建課程 7. 上面的操作產生的數據都通過pickle序列化保存到文件里 (所有功能均實現) ###程式需知 1. 當前資料庫已建立好信息,可以直接進行查看增加 北京 課程:Python 講師:金角大王 班級:S14 學員:我要學python 課程:Linux 講師:銀角大王 班級:L01 學員:我要學Linux 上海 課程:Go 講師:天棚元帥 班級:G01 學員:我要學GO 2. 也可以把database下的兩個資料庫文件刪除掉,數據清空,執行程式,資料庫進行初始化,初始化只生成北京、上海學校名 3. 資料庫結構main_dict 儲存主要的邏輯結構: {學校名:{課程名1:{"teacher":講師,"grade":班級},課程名2:{"teacher":講師2,"grade":班級2}}, 學校名:{課程名3:{"teacher":講師3,"grade":班級3},課程名4:{"teacher":講師4,"grade":班級4}}} 存儲的數據類型都為實例對象 資料庫結構teacher_dict 存儲講師與班級的對應關係,用於方便講師登錄系統認證,結構為 {講師:{grade:班級} 兩個資料庫文件均可擴展 4. 程式實現了以下嚴格限制: ①一個學校裡面不能出現同名的課程 ②一個課程只能有一個講師 ③講師被聘用後,不能再進行聘用,一個講師也只能教一門課程(教python,就不能再教linux了) ④班級只能對應一門課程,班級名只能出現一次,不能重覆(python班級s14,linux的班級就不能再出現s14班級了) ###後期擴展 程式沒有定義學生類,後期可定義類,添加學生屬性(年齡,成績),對可學生成績信息進行修改,把功能添加到教師中心,很顯然 我沒時間了。。。。。 程式按功能分出不同的模塊,可以更簡潔Readme
2、程式目錄結構:
3、資料庫:
main_dict和teacher_dict兩個資料庫文件可不創建,運行程式自動生成
�}q (c__main__ School q)�q}q(X nameqX 北京qX addrqX 北京市qub}q(c__main__ Course q )�q }q(X priceqX 9900q hX PythonqX timeqX 7qub}q(X teacherqc__main__ Teacher q)�q}q(X roleqX 講師qX schoolqhhX 金角大王qX ageqX 33qX courseqX PythonqubX gradeqc__main__ Grade q)�q }q!(hhX studentq"cbuiltins set q#]q$�q%Rq&hX Pythonq'hX S14q(ubuh )�q)}q*(hX 9000q+hX Linuxq,hX 8q-ub}q.(hh)�q/}q0(hhhhhX 銀角大王q1hX 25q2hX Linuxq3ubhh)�q4}q5(hh1h"h#]q6�q7Rq8hX Linuxq9hX L01q:ubuuh)�q;}q<(hX 上海q=hX 上海市q>ub}q?h )�q@}qA(hX 8000qBhX GoqChX 9qDub}qE(X teacherqFh)�qG}qH(hX 講師qIhh=hX 天蓬元帥qJhX 25qKhX GoqLubX gradeqMh)�qN}qO(hhJh"h#]qP�qQRqRhX GoqShX S01qTubusu.main_dict
�}q (c__main__ Teacher q)�q}q(X roleqX 講師qX schoolqX 北京qX nameqX 金角大王q X ageq X 33qX courseqX Pythonq ub}qX gradeqc__main__ Grade q)�q}q(X teacherqh X studentqcbuiltins set q]qX 我要學pythonqa�qRqhX PythonqhX S14qubsh)�q}q(hX 講師qhX 北京qhX 銀角大王q h X 25q!hX Linuxq"ub}q#X gradeq$h)�q%}q&(hh hh]q'X 我要學linuxq(a�q)Rq*hX Linuxq+hX L01q,ubsh)�q-}q.(hX 講師q/hX 上海q0hX 天蓬元帥q1h X 25q2hX Goq3ub}q4X gradeq5h)�q6}q7(hh1hh]q8X 我要學go語言q9a�q:Rq;hX Goq<hX S01q=ubsu.teacher_dict
4、程式main.py
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import pickle,os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #數據地址 __db_main = BASE_DIR + r"\database\main_dict" __db_teacher = BASE_DIR + r"\database\teacher_dict" class School(object): #創建學校 def __init__(self,name,addr): self.name = name self.addr = addr def cat_school(self): print("學校名:【%s】\t地址:【%s】"%(self.name,self.addr)) def hire_teacher(self,dict,course,teacher,file): #資料庫添加講師信息 dict[self][course] = {"teacher":teacher} file_oper(file,"wb", dict) def create_course(self,dict,course,file): # 資料庫添加課程資料 dict[self][course]={} file_oper(file,"wb", dict) def create_grade(self,dict,teacher_dict,course,grade,teacher,file1,file2): #資料庫添加班級信息 dict[self][course]["grade"] = grade file_oper(file1, "wb", dict) teacher_dict[teacher] = {"grade":grade} file_oper(file2, "wb", teacher_dict) class Course(): #創建課程 def __init__(self,name,price,time): self.name = name self.price = price self.time = time def cat_course(self): #查看課程信息 print("課程:【%s】\t價格:【¥%s】\t周期:【%s個月】" %(self.name,self.price,self.time)) class Grade(): # 創建班級 def __init__(self,name,course,teacher): student = set([]) self.name = name self.course = course self.teacher = teacher self.student = student def cat_grade(self): #查看班級信息 print("班級:【%s】\t課程:【%s】\t講師:【%s】" %(self.name, self.course, self.teacher)) def add_student(self,student_name,dict,teacher,file): self.student.add(student_name) dict[teacher]={"grade":self} file_oper(file, "wb", dict) class People(): def __init__(self,name,age): self.name = name self.age = age class Teacher(People): # 創建講師 def __init__(self,name,age,school,course,role="講師"): super(Teacher,self).__init__(name,age) self.role = role self.school = school self.course = course def cat_teacher(self): #查看老師資料和課程 print('課程【%s】\t講師【%s】'%(self.course,self.name)) def file_oper(file,mode,*args): #資料庫寫入、讀取操作 if mode == "wb": with open(file, mode) as f: dict = args[0] f.write(pickle.dumps(dict)) if mode == "rb": with open(file, mode) as f: dict = pickle.loads(f.read()) return dict def information(dict,mode,*args): '''通過匹配mode模式,列印相應的輸出信息''' if args: dict_info, set_info = {}, args[0] else: dict_info,set_info = {},set([]) if dict: for key in dict: if mode == "course": key.cat_course() if mode == "main": key.cat_school() if mode == "teacher" and key == "teacher": dict[key].cat_teacher() # dict_info[key] = dict[key] set_info.add(dict[key].name) if mode == "grade" and key == "grade": dict[key].cat_grade() set_info.add(dict[key].name) if mode == "teacher_center": pass if type(key) != str: #key值不是字元串 dict_info[key.name] = key return dict_info,set_info def school_center(): #學校管理中心 Flag = True while Flag: dict_main = file_oper(__db_main,"rb") #主字典 res_dict = information(dict_main,"main")[0] #列印學校信息 school_name = input("\33[34;0m輸入要選擇的學校名\33[0m:").strip() if school_name in res_dict: school = res_dict[school_name] #匹配選擇的學校 while Flag: print("\33[32;1m歡迎進入【%s】學校\33[0m".center(50, "*")%school.name) choice = options(list_school) #列印當前選項 if choice == "1": while True: print("\33[32;0m學校【%s】目前已經有的班級信息\33[0m".center(40, "-")%school.name) teacher_dict = file_oper(__db_teacher,"rb") res_course = information(dict_main[school], "None")[0] set_info = set([]) if res_course: # 列印課程與講師對應關係 for i in res_course: k = res_course[i] res_grade = information(dict_main[school][k], "grade",set_info)[1] if_cont = input("\n\33[34;0m是否要創建班級 【y】創建 【b】退出\33[0m:") if if_cont == "y": grade_name = input("\33[34;0m輸入要創建班級的名稱\33[0m:").strip() course_name = input("\33[34;0m輸入要班級要上的課程\33[0m:").strip() if course_name in res_course: course = res_course[course_name] if dict_main[school][course]: teacher = dict_main[school][course]["teacher"] if grade_name not in res_grade: grade = Grade(grade_name, course_name, teacher.name) school.create_grade(dict_main, teacher_dict, course, grade, teacher, __db_main, __db_teacher) else: print("\33[31;0m錯誤:當前班級已經存在\33[0m") else: print("\33[31;0m錯誤:當前課程還沒有講師\33[0m") else: print("\33[31;0m錯誤:課程【%s】不存在,請先創建課程\33[0m" % course_name) if if_cont == "b": break if choice == "2": #招聘講師 while True: print("\33[32;0m學校【%s】目前已經有的課程與講師\33[0m".center(40, "-")%school.name) res_course = information(dict_main[school],"None")[0] set_info = set([]) if res_course: #列印課程與講師對應關係 for i in res_course: k = res_course[i] res_teacher = information(dict_main[school][k], "teacher",set_info)[1] if not res_teacher: print("課程【%s】\t講師【None】" %(i)) if_cont = input("\n\33[34;0m是否要招聘講師 【y】招聘 【b】退出\33[0m:") if if_cont == "y": teacher_name = input("\33[34;0m輸入要招聘講師的名字\33[0m:").strip() teacher_age = input("\33[34;0m輸入要招聘講師的年齡\33[0m:").strip() course_name = input("\33[34;0m輸入講師【%s】要授課的課程\33[0m:"%teacher_name).strip() if course_name in res_course: course = res_course[course_name] #創建講師並寫入資料庫 if teacher_name not in res_teacher: teacher = Teacher(teacher_name,teacher_age,school.name,course_name) school.hire_teacher(dict_main, course, teacher, __db_main) else: print("\33[31;0m錯誤:教師【%s】已經被聘用\33[0m" %teacher_name) else: print("\33[31;0m錯誤:課程【%s】不存在,請先創建課程\33[0m" %course_name) if if_cont == "b": break if choice == "3": #創建課程 while True: print("\33[32;0m學校【%s】目前已經有的課程\33[0m".center(40,"-")%school.name) res_dict = information(dict_main[school],"course")[0] #列印課程信息賦值給字典course_dict if_cont = input("\n\33[34;0m是否要創建課程 【y】創建 【b】退出\33[0m:") if if_cont == "y": course_name = input("\33[34;0m輸入要創建的課程\33[0m:").strip() if course_name not in res_dict: #課程不存在,創建 price = input("\33[34;0m輸入課程 【%s】 的價格\33[0m:" % (course_name)) time = input("\33[34;0m輸入課程 【%s】 的周期(月)\33[0m:" % (course_name)) course = Course(course_name, price, time) #創建課程course school.create_course(dict_main,course, __db_main) #關聯學校和課程 else: #課程存在 print("\33[31;0m錯誤:當前課程 【%s】 已經存在\33[0m" % (course_name)) if if_cont == "b": break if choice == "4": Flag = False if Flag: print("\33[31;0m錯誤:輸入的學校 【%s】 不存在\33[0m"%(school_name)) def teacher_center(): #講師中心 print("\33[32;1m歡迎進入講師中心\33[0m".center(50, "*")) teacher_dict = file_oper(__db_teacher, "rb") dict_info = information(teacher_dict,"teacher_center")[0] #驗證登錄 teacher_name = input("\n\33[34;0m輸入要登錄講師的名字\33[0m:").strip() if teacher_name in dict_info: while True: print("\33[32;1m歡迎進入講師【%s】的管理中心\33[0m".center(40, "*")%teacher_name) choice = options(list_teacher) teacher = dict_info[teacher_name] grade = teacher_dict[teacher]["grade"] if choice == "1": print("\33[32;0m講師【%s】的班級信息\33[0m".center(40,"-")%teacher.name) print("學校【%s】\t課程【%s】\t班級【%s】\t"%(teacher.school,teacher.course,grade.name)) any = input("\n\33[34;0m輸入任意鍵退出當前\33[0m:") if choice == "2": print("\33[32;0m講師【%s】的班級學員列表\33[0m".center(40, "-") % teacher.name) print("班級【%s】\n學員【%s】"%(grade.name,grade.student)) any = input("\n\33[34;0m輸入任意鍵退出當前\33[0m:") if choice == "3": break else: print("\33[31;0m錯誤:講師【%s】 不存在\33[0m"%(teacher_name)) def student_center(): #學員中心 print("\33[32;1m歡迎進入學員中心中心\33[0m".center(50, "*")) while True: choice = options(list_student) #列印學生中心選項 if choice == "1": student_name = input("\33[34;0m輸入學員的名字\33[0m:") dict = file_oper(__db_main, "rb") teacher_dict = file_oper(__db_teacher,"rb") school_dict = information(dict,"main")[0] #列印當前可選的學校 school_name = input("\33[34;0m輸入要選擇的學校名\33[0m:").strip() if school_name in school_dict: school = school_dict[school_name] if dict[school]: course_dict = information(dict[school],"course")[0] # 列印當前學校下的課程 course_name = input("\33[34;0m輸入要選擇的課程\33[0m:").strip() if course_name in course_dict: course = course_dict[course_name] if dict[school][course].get("grade"): for i in teacher_dict: if course.name == i.course: teacher = i grade = teacher_dict[teacher]["grade"] print("課程【%s】的費用為【%s】"%(course.name,course.price)) if_pay = input("\33[34;0m是否支付當前費用 支付【y】\33[0m:") if if_pay == "y": #上面全部匹配成功,選課成功 grade.add_student(student_name,teacher_dict,teacher,__db_teacher) print("\33[31;0m選課成功\33[0m") any = input("\n\33[34;0m輸入任意鍵退出當前\33[0m:") else: print("\33[31;0m錯誤:課程沒有班級\33[0m") else: print("\33[31;0m錯誤:課程不存在\33[0m") else: print("\33[31;0m錯誤:當前學校沒有課程\33[0m") if choice == "2": break def options(list): #列印可選擇的操作模式,並返回選擇值 for i, v in enumerate(list): print(i+1, v) choice = input("\33[34;0m選擇要進入模式\33[0m:") return choice def start(): '''程式開始''' while True: print("\33[35;1m歡迎進入選課系統\33[0m".center(50, "#")) choice = options(list_main) #列印選項 if choice == "1": student_center() #學生中心 if choice == "2": teacher_center() #教師中心 if choice == "3": school_center() #學校中心 if choice == "4": break def init_database(): '''資料庫初始化,不存在則創建,存在跳過''' bj = School("北京","北京市") sh = School("上海","上海市") if not os.path.exists(__db_teacher): dict = {bj:{},sh:{}} file_oper(__db_main,"wb",dict) if not os.path.exists(__db_teacher): dict = {} file_oper(__db_teacher,"wb",dict) if __name__ == '__main__': init_database() #初始化資料庫 list_main = ["學生中心", "講師中心", "學校中心","退出"] list_school = ["創建班級", "招聘講師", "創建課程","返回"] list_teacher = ["查看班級", "查看班級學員列表","返回" ] list_student = ["學員註冊","返回"] start()
5、程式運行過程的簡略圖
*********************學校中心***********************
*********************學生中心***********************
*********************講師中心***********************