程式名稱: 選課系統 角色:學校、學員、課程、講師要求: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. 創建學員時,選擇學校,關聯班級
6. 創建講師角色時要關聯學校,
7. 提供兩個角色介面
8. 學員視圖, 可以註冊, 交學費, 選擇班級,
9. 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績
10. 管理視圖,創建講師, 創建班級,創建課程
11. 上面的操作產生的數據都通過pickle序列化保存到文件里
之前low的代碼:
移步-》》http://www.cnblogs.com/lianzhilei/p/5832691.html
想法:
選課系統是在第六節課學完面向對象時Alex給留的練習作業,當時寫的程式得了個B+,當時寫出了覺得自己還挺厲害的,不過現在看之前的代碼慘不忍睹,純粹為了實現要求而實現的功能,程式的擴展性很差;剛好最近複習到面向對象的內容,覺得這個作業確實不錯(邏輯性很強),準備重新寫一下,加上之前看過天帥的代碼框架,覺得有一些啟發,下麵就開始搞起來!
寫這個博客的目的,一是為了方便自己以後用到時去查詢,二是記錄下自己的思路,以後再看的時候,明白當前的想法(有想法的對比,才能看出自己進步了多少)
開始搞:
寫程式的第一步就會遇到問題,因為alex給出的要求確實太亂了,這麼多關聯關係根本理不清,首先先把要求換成自己能懂得話,把邏輯關係重新屢一下
先來個框架:
三個視圖:學員視圖 講師視圖 管理視圖 三個視圖即為三個管理介面
五個角色:學校、學員、課程、講師、班級 五個角色即需要定義5個類
把要求對應成自己看懂的話:
① 創建北京、上海 2 所學校 分析:定義學校類,通過類去創建學校實例
② 創建linux , python , go 3個課程 ,linux\py 在北京開,go 在上海開 分析:定義課程類,通過課程類去創建課程實例
③ 課程包含,周期,價格,通過學校創建課程 分析:課程類里要包含周期、價格 課程實例通過學校類去創建
④ 班級關聯課程、班級關聯講師 分析:可以創建班級的時候需輸入關聯的課程,創建講師的時候需輸入關聯的班級;一個班級對應一個課程 一個班級對應一個講師
⑤ 通過學校創建班級, 班級關聯課程、講師 分析:跟④一樣
⑥ 創建學員時,選擇學校,關聯班級 分析:定義學員類,創建時選擇學校,選擇班級,通過學校類創建學員實例,班級類裡面要有包含學員的信息的字典
⑦ 創建講師角色時要關聯學校 分析:之前一樣,依然通過學校類去創建講師實例
⑧ 學員視圖 可以註冊, 交學費, 選擇班級 分析:看⑥ 學員選擇班級後,通過班級關聯的課程,列印課程的學費
⑨ 講師視圖, 講師可以.....bala....bala 分析:講師視圖登錄需要講師名,通過講師名可以找到對應的班級實例,班級實例里包含班級名,課程名,學員信息等
註:一個班級對應一個課程 一個班級對應一個講師
一個課程可有多個班級
一個講師可教授多個班級
一個學員可學習多個班級的課
分析下管理視圖:
管理視圖具有的功能創建講師, 創建班級,創建課程,這些都是通過學校創建(即通過學校類的方法調用),除了創建以外我們還需要增加查詢講師、班級、課程的功能(查看相應的信息),管理視圖要有6個功能
分析下講師視圖:
講師視圖可查看所授課的班級,班級學生信息 講師視圖具有2個功能
分析下學生視圖:
學生視圖,要選擇學校,選擇班級(顯示班級的名稱,課程,價錢),添加到對應的班級內
咋做資料庫呢?!
看看註裡面的內容就知道對應關係比較多,對應關係比較多就意味著,一個數據改了所有跟它有關係的數據都有變動,比如班級s14關聯講師alex,學生eric報名後,講師alex自己的班級學生信息里就要能查到eric的個人信息;當然如果用資料庫去做的話,非常簡單;but 咱還沒學資料庫呢,只能用文件的方式存在本地,如果存多個文件的話,一個文件修改另一個文件也跟著修改(互相關聯),所以為了簡便,就只定義一個偽資料庫;通過shelve模塊,存儲類型{“北京”:北京實例,“上海”:上海實例}
看我怎麼做的類定義(只看__init__):
內容最小的學員類:只包含姓名,年齡,可擴展其他信息,關聯信息不再這存
class Student(object): '''學生類,包含姓名,年齡''' def __init__(self,student_name,student_age): self.student_name = student_name self.student_age = student_age
都跟它有關係,但是他是被關係的課程類:只包含周期,價格,名稱,可擴展其他信息,被關聯,啥關聯信息都不用存
class Course(): '''定義課程類,包含名稱,價格,周期''' def __init__(self,course_name,course_price,course_time): self.course_name = course_name self.course_price = course_price self.course_time = course_time
跟三個都有關係,還一一對應(課程、講師)的班級類:看④⑥ 包含班級名,課程對應課程類(對應關係在本類里保存),班級學生成員字典,存放學生類,與講師關聯信息不再本類存
class Class(object): '''班級類,包含名稱,課程,學生''' def __init__(self,class_name,course_obj): self.class_name = class_name self.class_courese = course_obj self.class_student = {} #學生字典 {學生名:學生實例}
關聯性單一,只跟班級相好的講師類:看⑨ 包含講師名、薪資;講師關聯班級(對應關係在本類保存)班級成員列表,存放班級名(做判斷,不會重覆);通過班級名查看班級類裡面的班級信息(包含學生),避免存雙份數據
class Teacher(object): '''講師類,定義teacher_name,teacher_salary,包含teacher_class''' def __init__(self, teacher_name, teacher_salary): self.teacher_name = teacher_name self.teacher_salary = teacher_salary self.teacher_calss = [] #班級列表 [s14,15] def teacher_add_class(self,class_name,class_obj): self.teacher_calss[class_name] = class_obj
內容最大,跟班級、課程、講師都有關係的學校類: 包含學校名,學校地址,存放課程實例、班級實例、講師實例,都是字典形式
class School(object): '''學校類,包含名稱,地址,課程,班級,教師''' def __init__(self,school_name,school_addr): self.school_name = school_name self.school_addr = school_addr self.school_course = {} #學校所有的課程實例 {"課程名“:課程實例} self.school_class = {} self.school_teacher = {} #類型與course一致 #self.school_student = {} #可擴展學生
框架有了,類有了,業務邏輯還不so easy?!
直接放目錄架構:
代碼區:
程式入口bin下的start.py: 註:判斷了系統環境,添加了環境變數,調用了主業務區main.py
import os import sys import platform if platform.system() == "Windows": BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1]) else: BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1]) sys.path.insert(0,BASE_DIR) #print(sys.path) from core import main from conf import settings if __name__ == '__main__': obj = main.Manage_center() obj.run()start.py
配置文件conf下的settings.py: 註:定義了資料庫路徑
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import os import sys import platform if platform.system() == "Windows": BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1]) database_path = os.path.join(BASE_DIR,"database") else: BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1]) database_path = os.path.join(BASE_DIR, "database") school_db_file = os.path.join(database_path,"school")settings.py
主業務core下的main.py: 註:定義了4個類,管理中心,學員視圖,講師視圖,學校視圖
import os import sys import shelve from conf import settings from modules.school import School class Manage_center(object): def __init__(self): pass def run(self): while True: print("\n歡迎進入CLASS_SYSTEM系統\n" "1 學生視圖\n" "2 教師視圖\n" "3 學校視圖\n" "q 退出學員管理系統\n") user_choice = input("\033[34;0m請輸入您要登錄的視圖:\033[0m") if user_choice == '1': Manage_student() elif user_choice == '2': Manage_teacher() elif user_choice == '3': Manage_school() elif user_choice == 'q': print("\033[34;1m感謝使用學員管理系統,退出\033[0m") break else: print("\033[31;1m請輸入正確的選項\033[0m") class Manage_school(object): '''學校管理視圖''' def __init__(self): if os.path.exists(settings.school_db_file+".dat"): #shelve會生成三個文件,其中有.dat結尾 self.school_db = shelve.open(settings.school_db_file) #打開學校資料庫文件 self.run_manage() #運行管理視圖 self.school_db.close() #關閉資料庫文件 else: print("\33[31;1m系統信息:初始化資料庫\33[0m") self.initialize_school() #初始化資料庫 self.run_manage() self.school_db.close() def initialize_school(self): '''實例化兩個學校北京/上海''' self.school_db = shelve.open(settings.school_db_file) self.school_db['北京'] = School('北京', '中國.北京') self.school_db['上海'] = School('上海', '中國.上海') def run_manage(self): '''運行學校管理視圖 ''' while True: for key in self.school_db: print("學校名稱:",key) choice_school = input("\33[34;0m輸入選擇管理的學校名:\33[0m").strip() if choice_school in self.school_db: self.choice_school = choice_school self.school_obj = self.school_db[choice_school] while True: print("\n歡迎來到老男孩%s校區\n" "添加課程 add_course\n" "增加班級 add_class\n" "招聘講師 add_teacher\n" "查看課程 check_course\n" "查看班級 check_class\n" "查看講師 check_teacher\n" "退出程式 exit"% self.school_obj.school_name) user_func = input('''\033[34;0m輸入要操作的命令:\033[0m''').strip() if hasattr(self,user_func): getattr(self,user_func)() else: print("\33[31;1m輸入錯誤:請輸入正確的學校名\33[0m") def add_course(self): course_name = input('''\033[34;0m輸入要添加課程的名稱:\033[0m''').strip() course_price = input('''\033[34;0m輸入要添加課程的價格:\033[0m''').strip() course_time = input('''\033[34;0m輸入要添加課程的時長:\033[0m''').strip() if course_name in self.school_obj.school_course: #判斷課程是否已經添加過 print("\33[32;1m課程存在\33[0m") self.school_obj.create_course(course_name, course_price, course_time) print("\33[32;1m課程更新完成\33[0m") else: self.school_obj.create_course(course_name,course_price,course_time) print("\33[32;1m課程添加成功\33[0m") self.school_db.update({self.choice_school: self.school_obj}) #更新資料庫數據 def add_class(self): class_name = input('''\033[34;0m輸入要添加班級的名稱:\033[0m''').strip() course_name = input('''\033[34;0m輸入要關聯的課程:\033[0m''').strip() if class_name not in self.school_obj.school_class: if course_name in self.school_obj.school_course: course_obj = self.school_obj.school_course[course_name] self.school_obj.create_class(class_name,course_obj) self.school_db.update({self.choice_school: self.school_obj}) # 更新資料庫數據 print("\33[32;1m班級創建成功\33[0m") else: print("\33[31;1m系統錯誤:關聯的課程不存在\33[0m") else: print("\33[31;1m系統錯誤:班級已經存在\33[0m") def add_teacher(self): teacher_name = input('''\033[34;0m輸入要招聘教師的名稱:\033[0m''').strip() teacher_salary = input('''\033[34;0m輸入教師的薪資:\033[0m''').strip() teacher_class = input('''\033[34;0m輸入要關聯的班級:\033[0m''').strip() if teacher_class in self.school_obj.school_class: #判斷班級是否存在 class_obj = self.school_obj.school_class[teacher_class] #獲取班級名對應的實例 if teacher_name not in self.school_obj.school_teacher: #判斷招聘教師是否存在,不存在創建,存在更新 self.school_obj.create_teacher(teacher_name,teacher_salary,teacher_class,class_obj) print("\33[32;1m新講師招聘成功\33[0m") else: self.school_obj.update_teacher(teacher_name, teacher_class, class_obj) print("\33[32;1m講師已經存在,信息更新完成\33[0m") self.school_db.update({self.choice_school: self.school_obj}) # 更新資料庫數據 else: print("\33[31;1m系統錯誤:關聯的班級不存在\33[0m") def check_course(self): self.school_obj.show_course() def check_class(self): self.school_obj.show_class() def check_teacher(self): self.school_obj.show_teacher() def exit(self): self.school_db.close() sys.exit("\033[32;1m歡迎下次使用學員管理系統\033[0m") class Manage_student(object): '''學生視圖''' def __init__(self): if os.path.exists(settings.school_db_file + ".dat"): # shelve會生成三個文件,其中有.dat結尾 self.school_db = shelve.open(settings.school_db_file) # 打開學校資料庫文件 self.run_manage() # 運行管理視圖 self.school_db.close() # 關閉資料庫文件 else: print("\033[31;1m資料庫文件不存在,請先創建學校\033[0m") exit() def run_manage(self): print("\n歡迎進入學員視圖") for key in self.school_db: print("學校名稱:", key) choice_school = input("\33[34;0m輸入選擇註冊的學校名:\33[0m").strip() if choice_school in self.school_db: self.choice_school = choice_school self.school_obj = self.school_db[choice_school] student_name = input('''\033[34;0m輸入學生的姓名:\033[0m''').strip() student_age = input('''\033[34;0m輸入學生的年齡:\033[0m''').strip() self.school_obj.show_class_course() class_choice = input('''\033[34;0m輸入上課的班級:\033[0m''').strip() if class_choice in self.school_obj.school_class: self.school_obj.create_student(student_name,student_age,class_choice) self.school_db.update({self.choice_school: self.school_obj}) # 更新資料庫數據 print("\33[32;1m學生註冊成功\33[0m") else: print("\33[31;1m系統錯誤:輸入的班級不存在\33[0m") else: print("\33[31;1m系統錯誤:輸入的學校不存在\33[0m") class Manage_teacher(object): '''教師視圖''' def __init__(self): if os.path.exists(settings.school_db_file + ".dat"): # shelve會生成三個文件,其中有.dat結尾 self.school_db = shelve.open(settings.school_db_file) # 打開學校資料庫文件 self.run_manage() # 運行管理視圖 self.school_db.close() # 關閉資料庫文件 else: print("\033[31;1m資料庫文件不存在,請先創建學校\033[0m") exit() def run_manage(self): for key in self.school_db: print("學校名稱:", key) choice_school = input("\33[34;0m輸入選擇學校名:\33[0m").strip() if choice_school in self.school_db: self.choice_school = choice_school self.school_obj = self.school_db[choice_school] teacher_name = input('''\033[34;0m輸入登錄講師的姓名:\033[0m''').strip() while True: if teacher_name in self.school_obj.school_teacher: print("\n歡迎來到教師中心\n" "查看班級 check_class\n" "退出程式 exit" ) user_func = input('''\033[34;0m輸入要操作的命令:\033[0m''').strip() if hasattr(self, user_func): getattr(self, user_func)(teacher_name) else: print("\033[31;1m講師不存在\033[0m") def check_class(self,teacher_name): self.school_obj.show_teacher_classinfo(teacher_name) def exit(self,*args): self.school_db.close() sys.exit("\033[32;1m歡迎下次使用學員管理系統\033[0m")main.py
數據文件database: 註:不用管,自動初始化生成
註:不用管,自動初始化生成database
模塊modules下的school:
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian from modules.course import Course from modules.classs import Class from modules.teacher import Teacher from modules.student import Student class School(object): '''學校類,包含名稱,地址,課程,班級,教師''' def __init__(self,school_name,school_addr): self.school_name = school_name self.school_addr = school_addr self.school_course = {} #學校所有的課程實例 self.school_class = {} self.school_teacher = {} #self.school_student = {} def create_course(self,course_name,course_price,course_time): '''創建課程''' course_obj = Course(course_name,course_price,course_time) self.school_course[course_name] = course_obj def show_course(self): '''查看課程信息''' for key in self.school_course: course_obj = self.school_course[key] print("\33[32;1m課程:%s\t價格:%s\t周期:%s月\33[0m"%(course_obj.course_name,course_obj.course_price, course_obj.course_time,)) def create_class(self,class_name,courese_obj): '''創建班級''' class_obj = Class(class_name,courese_obj) self.school_class[class_name] = class_obj def show_class(self): for key in self.school_class: class_obj = self.school_class[key] print("\33[32;1m班級:%s\t關聯課程:%s\33[0m" % (class_obj.class_name, class_obj.class_courese.course_name)) def show_class_course(self): for key in self.school_class: class_obj = self.school_class[key] course_obj = class_obj.class_courese print("\33[32;1m班級:%s\t關聯課程:%s\t價格:%s\t周期:%s月\33[0m" % (class_obj.class_name, course_obj.course_name, course_obj.course_price,course_obj.course_time)) def create_teacher(self,teacher_name, teacher_salary,class_name,class_obj): '''創建講師''' teacher_obj = Teacher(teacher_name, teacher_salary) teacher_obj.teacher_add_class(class_name,class_obj) self.school_teacher[teacher_name] = teacher_obj def update_teacher(self,teacher_name,class_name,class_obj): '''更新教師信息''' teacher_obj = self.school_teacher[teacher_name] teacher_obj.teacher_add_class(class_name,class_obj) def show_teacher(self): '''查看講師信息''' for key in self.school_teacher: teacher_obj = self.school_teacher[key] class_list = [] for i in teacher_obj.teacher_calss: class_list.append(i) print("\33[32;1m講師:%s\t薪資:%s\t關聯班級:%s\33[0m" % (teacher_obj.teacher_name, teacher_obj.teacher_salary, class_list )) def create_student(self,student_name,student_age,class_choice): '''註冊學生''' student_obj = Student(student_name,student_age) #生成學生實例 class_obj = self.school_class[class_choice] #獲取學生所註冊班級的實例對象 class_obj.class_student[student_name]=student_obj #班級實例里添加學生信息 self.school_class[class_choice] = class_obj #學校班級字典更新 def show_teacher_classinfo(self,teacher_name): teacher_obj = self.school_teacher[teacher_name] for i in teacher_obj.teacher_calss: class_obj = self.school_class[i] student_list = [] for k in class_obj.class_student: student_list.append(k) print("\33[32;1m班級:%s\t關聯課程:%s\t學員:%s\33[0m" % (class_obj.class_name, class_obj.class_courese.course_name, student_list))student.py
模塊modules下的class:
class Class(object): '''班級類,包含名稱,課程,學生''' def __init__(self,class_name,course_obj): self.class_name = class_name self.class_courese = course_obj self.class_student = {} #學生字典class.py
模塊modules下的course:
class Course(): '''定義課程類,包含名稱,價格,周期''' def __init__(self,course_name,course_price,course_time): self.course_name = course_name self.course_price = course_price self.course_time = course_timecourse.py
模塊modules下的student:
class Student(object): '''學生類,包含姓名,年齡''' def __init__(self,student_name,student_age): self.student_name = student_name self.student_age =