開始搞:數據庫
寫程序的第一步就會遇到問題,由於alex給出的要求確實太亂了,這麼多關聯關係根本理不清,首先先把要求換成本身能懂得話,把邏輯關係從新屢一下架構
先來個框架:app
三個視圖:學員視圖 講師視圖 管理視圖 三個視圖即爲三個管理接口框架
五個角色:學校、學員、課程、講師、班級 五個角色即須要定義5個類ide
把要求對應成本身看懂的話:post
① 建立北京、上海 2 所學校 分析:定義學校類,經過類去建立學校實例
② 建立linux , python , go 3個課程 ,linux\py 在北京開,go 在上海開 分析:定義課程類,經過課程類去建立課程實例學習
③ 課程包含,週期,價格,經過學校建立課程 分析:課程類裏要包含週期、價格 課程實例經過學校類去建立spa
④ 班級關聯課程、班級關聯講師 分析:能夠建立班級的時候需輸入關聯的課程,建立講師的時候需輸入關聯的班級;一個班級對應一個課程 一個班級對應一個講師
⑤ 經過學校建立班級, 班級關聯課程、講師 分析:跟④同樣
⑥ 建立學員時,選擇學校,關聯班級 分析:定義學員類,建立時選擇學校,選擇班級,經過學校類建立學員實例,班級類裏面要有包含學員的信息的字典
⑦ 建立講師角色時要關聯學校 分析:以前同樣,依然經過學校類去建立講師實例
⑧ 學員視圖 能夠註冊, 交學費, 選擇班級 分析:看⑥ 學員選擇班級後,經過班級關聯的課程,打印課程的學費
⑨ 講師視圖, 講師能夠.....bala....bala 分析:講師視圖登陸須要講師名,經過講師名能夠找到對應的班級實例,班級實例裏包含班級名,課程名,學員信息等
注:一個班級對應一個課程 一個班級對應一個講師
一個課程可有多個班級
一個講師可教授多個班級
一個學員可學習多個班級的課
分析下管理視圖:
管理視圖具備的功能建立講師, 建立班級,建立課程,這些都是經過學校建立(即經過學校類的方法調用),除了建立之外咱們還須要增長查詢講師、班級、課程的功能(查看相應的信息),管理視圖要有6個功能
分析下講師視圖:
講師視圖可查看所授課的班級,班級學生信息 講師視圖具備2個功能
分析下學生視圖:
學生視圖,要選擇學校,選擇班級(顯示班級的名稱,課程,價錢),添加到對應的班級內
咋作數據庫呢?!
看看注裏面的內容就知道對應關係比較多,對應關係比較多就意味着,一個數據改了全部跟它有關係的數據都有變更,好比班級s14關聯講師alex,學生eric報名後,講師alex本身的班級學生信息裏就要能查到eric的我的信息;固然若是用數據庫去作的話,很是簡單;but 咱還沒學數據庫呢,只能用文件的方式存在本地,若是存多個文件的話,一個文件修改另外一個文件也跟着修改(互相關聯),因此爲了簡便,就只定義一個僞數據庫;經過shelve模塊,存儲類型{「北京」:北京實例,「上海」:上海實例}
看我怎麼作的類定義(只看__init__):
內容最小的學員類:只包含姓名,年齡,可擴展其餘信息,關聯信息再也不這存
1
2
3
4
5
|
class
Student(
object
):
'''學生類,包含姓名,年齡'''
def
__init__(
self
,student_name,student_age):
self
.student_name
=
student_name
self
.student_age
=
student_age
|
都跟它有關係,可是他是被關係的課程類:只包含週期,價格,名稱,可擴展其餘信息,被關聯,啥關聯信息都不用存
1
2
3
4
5
6
|
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
|
跟三個都有關係,還一一對應(課程、講師)的班級類:看④⑥ 包含班級名,課程對應課程類(對應關係在本類裏保存),班級學生成員字典,存放學生類,與講師關聯信息再也不本類存
1
2
3
4
5
6
|
class
Class(
object
):
'''班級類,包含名稱,課程,學生'''
def
__init__(
self
,class_name,course_obj):
self
.class_name
=
class_name
self
.class_courese
=
course_obj
self
.class_student
=
{}
#學生字典 {學生名:學生實例}
|
關聯性單一,只跟班級相好的講師類:看⑨ 包含講師名、薪資;講師關聯班級(對應關係在本類保存)班級成員列表,存放班級名(作判斷,不會重複);經過班級名查看班級類裏面的班級信息(包含學生),避免存雙份數據
1
2
3
4
5
6
7
8
9
|
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
|
內容最大,跟班級、課程、講師都有關係的學校類: 包含學校名,學校地址,存放課程實例、班級實例、講師實例,都是字典形式
1
2
3
4
5
6
7
8
9
|
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

1 import os 2 import sys 3 import platform 4 5 if platform.system() == "Windows": 6 BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1]) 7 8 else: 9 BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1]) 10 11 sys.path.insert(0,BASE_DIR) 12 #print(sys.path) 13 14 from core import main 15 from conf import settings 16 17 if __name__ == '__main__': 18 obj = main.Manage_center() 19 obj.run()
配置文件conf下的settings.py: 注:定義了數據庫路徑

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #-Author-Lian 4 5 import os 6 import sys 7 import platform 8 9 if platform.system() == "Windows": 10 BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1]) 11 database_path = os.path.join(BASE_DIR,"database") 12 13 else: 14 BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1]) 15 database_path = os.path.join(BASE_DIR, "database") 16 17 school_db_file = os.path.join(database_path,"school")
主業務core下的main.py: 注:定義了4個類,管理中心,學員視圖,講師視圖,學校視圖

1 import os 2 import sys 3 import shelve 4 from conf import settings 5 from modules.school import School 6 7 8 class Manage_center(object): 9 def __init__(self): 10 pass 11 12 def run(self): 13 while True: 14 print("\n歡迎進入CLASS_SYSTEM系統\n" 15 "1 學生視圖\n" 16 "2 教師視圖\n" 17 "3 學校視圖\n" 18 "q 退出學員管理系統\n") 19 user_choice = input("\033[34;0m請輸入您要登陸的視圖:\033[0m") 20 if user_choice == '1': 21 Manage_student() 22 elif user_choice == '2': 23 Manage_teacher() 24 elif user_choice == '3': 25 Manage_school() 26 elif user_choice == 'q': 27 print("\033[34;1m感謝使用學員管理系統,退出\033[0m") 28 break 29 else: 30 print("\033[31;1m請輸入正確的選項\033[0m") 31 32 class Manage_school(object): 33 '''學校管理視圖''' 34 def __init__(self): 35 if os.path.exists(settings.school_db_file+".dat"): #shelve會生成三個文件,其中有.dat結尾 36 self.school_db = shelve.open(settings.school_db_file) #打開學校數據庫文件 37 self.run_manage() #運行管理視圖 38 self.school_db.close() #關閉數據庫文件 39 else: 40 print("\33[31;1m系統信息:初始化數據庫\33[0m") 41 self.initialize_school() #初始化數據庫 42 self.run_manage() 43 self.school_db.close() 44 45 def initialize_school(self): 46 '''實例化兩個學校北京/上海''' 47 self.school_db = shelve.open(settings.school_db_file) 48 self.school_db['北京'] = School('北京', '中國.北京') 49 self.school_db['上海'] = School('上海', '中國.上海') 50 51 def run_manage(self): 52 '''運行學校管理視圖 ''' 53 while True: 54 for key in self.school_db: 55 print("學校名稱:",key) 56 choice_school = input("\33[34;0m輸入選擇管理的學校名:\33[0m").strip() 57 if choice_school in self.school_db: 58 self.choice_school = choice_school 59 self.school_obj = self.school_db[choice_school] 60 while True: 61 print("\n歡迎來到老男孩%s校區\n" 62 "添加課程 add_course\n" 63 "增長班級 add_class\n" 64 "招聘講師 add_teacher\n" 65 "查看課程 check_course\n" 66 "查看班級 check_class\n" 67 "查看講師 check_teacher\n" 68 "退出程序 exit"% self.school_obj.school_name) 69 user_func = input('''\033[34;0m輸入要操做的命令:\033[0m''').strip() 70 if hasattr(self,user_func): 71 getattr(self,user_func)() 72 else: 73 print("\33[31;1m輸入錯誤:請輸入正確的學校名\33[0m") 74 75 def add_course(self): 76 course_name = input('''\033[34;0m輸入要添加課程的名稱:\033[0m''').strip() 77 course_price = input('''\033[34;0m輸入要添加課程的價格:\033[0m''').strip() 78 course_time = input('''\033[34;0m輸入要添加課程的時長:\033[0m''').strip() 79 if course_name in self.school_obj.school_course: #判斷課程是否已經添加過 80 print("\33[32;1m課程存在\33[0m") 81 self.school_obj.create_course(course_name, course_price, course_time) 82 print("\33[32;1m課程更新完成\33[0m") 83 else: 84 self.school_obj.create_course(course_name,course_price,course_time) 85 print("\33[32;1m課程添加成功\33[0m") 86 self.school_db.update({self.choice_school: self.school_obj}) #更新數據庫數據 87 88 def add_class(self): 89 class_name = input('''\033[34;0m輸入要添加班級的名稱:\033[0m''').strip() 90 course_name = input('''\033[34;0m輸入要關聯的課程:\033[0m''').strip() 91 if class_name not in self.school_obj.school_class: 92 if course_name in self.school_obj.school_course: 93 course_obj = self.school_obj.school_course[course_name] 94 self.school_obj.create_class(class_name,course_obj) 95 self.school_db.update({self.choice_school: self.school_obj}) # 更新數據庫數據 96 print("\33[32;1m班級建立成功\33[0m") 97 else: 98 print("\33[31;1m系統錯誤:關聯的課程不存在\33[0m") 99 else: 100 print("\33[31;1m系統錯誤:班級已經存在\33[0m") 101 102 def add_teacher(self): 103 teacher_name = input('''\033[34;0m輸入要招聘教師的名稱:\033[0m''').strip() 104 teacher_salary = input('''\033[34;0m輸入教師的薪資:\033[0m''').strip() 105 teacher_class = input('''\033[34;0m輸入要關聯的班級:\033[0m''').strip() 106 if teacher_class in self.school_obj.school_class: #判斷班級是否存在 107 class_obj = self.school_obj.school_class[teacher_class] #獲取班級名對應的實例 108 if teacher_name not in self.school_obj.school_teacher: #判斷招聘教師是否存在,不存在建立,存在更新 109 self.school_obj.create_teacher(teacher_name,teacher_salary,teacher_class,class_obj) 110 print("\33[32;1m新講師招聘成功\33[0m") 111 else: 112 self.school_obj.update_teacher(teacher_name, teacher_class, class_obj) 113 print("\33[32;1m講師已經存在,信息更新完成\33[0m") 114 115 self.school_db.update({self.choice_school: self.school_obj}) # 更新數據庫數據 116 else: 117 print("\33[31;1m系統錯誤:關聯的班級不存在\33[0m") 118 119 def check_course(self): 120 self.school_obj.show_course() 121 122 def check_class(self): 123 self.school_obj.show_class() 124 125 def check_teacher(self): 126 self.school_obj.show_teacher() 127 128 def exit(self): 129 self.school_db.close() 130 sys.exit("\033[32;1m歡迎下次使用學員管理系統\033[0m") 131 132 class Manage_student(object): 133 '''學生視圖''' 134 def __init__(self): 135 if os.path.exists(settings.school_db_file + ".dat"): # shelve會生成三個文件,其中有.dat結尾 136 self.school_db = shelve.open(settings.school_db_file) # 打開學校數據庫文件 137 self.run_manage() # 運行管理視圖 138 self.school_db.close() # 關閉數據庫文件 139 else: 140 print("\033[31;1m數據庫文件不存在,請先建立學校\033[0m") 141 exit() 142 143 def run_manage(self): 144 print("\n歡迎進入學員視圖") 145 for key in self.school_db: 146 print("學校名稱:", key) 147 choice_school = input("\33[34;0m輸入選擇註冊的學校名:\33[0m").strip() 148 if choice_school in self.school_db: 149 self.choice_school = choice_school 150 self.school_obj = self.school_db[choice_school] 151 student_name = input('''\033[34;0m輸入學生的姓名:\033[0m''').strip() 152 student_age = input('''\033[34;0m輸入學生的年齡:\033[0m''').strip() 153 self.school_obj.show_class_course() 154 class_choice = input('''\033[34;0m輸入上課的班級:\033[0m''').strip() 155 if class_choice in self.school_obj.school_class: 156 self.school_obj.create_student(student_name,student_age,class_choice) 157 self.school_db.update({self.choice_school: self.school_obj}) # 更新數據庫數據 158 print("\33[32;1m學生註冊成功\33[0m") 159 else: 160 print("\33[31;1m系統錯誤:輸入的班級不存在\33[0m") 161 else: 162 print("\33[31;1m系統錯誤:輸入的學校不存在\33[0m") 163 164 165 class Manage_teacher(object): 166 '''教師視圖''' 167 def __init__(self): 168 if os.path.exists(settings.school_db_file + ".dat"): # shelve會生成三個文件,其中有.dat結尾 169 self.school_db = shelve.open(settings.school_db_file) # 打開學校數據庫文件 170 self.run_manage() # 運行管理視圖 171 self.school_db.close() # 關閉數據庫文件 172 else: 173 print("\033[31;1m數據庫文件不存在,請先建立學校\033[0m") 174 exit() 175 176 def run_manage(self): 177 for key in self.school_db: 178 print("學校名稱:", key) 179 choice_school = input("\33[34;0m輸入選擇學校名:\33[0m").strip() 180 if choice_school in self.school_db: 181 self.choice_school = choice_school 182 self.school_obj = self.school_db[choice_school] 183 teacher_name = input('''\033[34;0m輸入登陸講師的姓名:\033[0m''').strip() 184 while True: 185 if teacher_name in self.school_obj.school_teacher: 186 print("\n歡迎來到教師中心\n" 187 "查看班級 check_class\n" 188 "退出程序 exit" ) 189 user_func = input('''\033[34;0m輸入要操做的命令:\033[0m''').strip() 190 if hasattr(self, user_func): 191 getattr(self, user_func)(teacher_name) 192 else: 193 print("\033[31;1m講師不存在\033[0m") 194 195 def check_class(self,teacher_name): 196 self.school_obj.show_teacher_classinfo(teacher_name) 197 198 def exit(self,*args): 199 self.school_db.close() 200 sys.exit("\033[32;1m歡迎下次使用學員管理系統\033[0m")
數據文件database: 注:不用管,自動初始化生成

1 注:不用管,自動初始化生成
模塊modules下的school:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #-Author-Lian 4 from modules.course import Course 5 from modules.classs import Class 6 from modules.teacher import Teacher 7 from modules.student import Student 8 9 class School(object): 10 '''學校類,包含名稱,地址,課程,班級,教師''' 11 def __init__(self,school_name,school_addr): 12 self.school_name = school_name 13 self.school_addr = school_addr 14 self.school_course = {} #學校全部的課程實例 15 self.school_class = {} 16 self.school_teacher = {} 17 #self.school_student = {} 18 19 def create_course(self,course_name,course_price,course_time): 20 '''建立課程''' 21 course_obj = Course(course_name,course_price,course_time) 22 self.school_course[course_name] = course_obj 23 24 def show_course(self): 25 '''查看課程信息''' 26 for key in self.school_course: 27 course_obj = self.school_course[key] 28 print("\33[32;1m課程:%s\t價格:%s\t週期:%s月\33[0m"%(course_obj.course_name,course_obj.course_price, 29 course_obj.course_time,)) 30 31 def create_class(self,class_name,courese_obj): 32 '''建立班級''' 33 class_obj = Class(class_name,courese_obj) 34 self.school_class[class_name] = class_obj 35 36 def show_class(self): 37 for key in self.school_class: 38 class_obj = self.school_class[key] 39 print("\33[32;1m班級:%s\t關聯課程:%s\33[0m" % (class_obj.class_name, class_obj.class_courese.course_name)) 40 41 def show_class_course(self): 42 for key in self.school_class: 43 class_obj = self.school_class[key] 44 course_obj = class_obj.class_courese 45 print("\33[32;1m班級:%s\t關聯課程:%s\t價格:%s\t週期:%s月\33[0m" % (class_obj.class_name, course_obj.course_name, 46 course_obj.course_price,course_obj.course_time)) 47 48 def create_teacher(self,teacher_name, teacher_salary,class_name,class_obj): 49 '''建立講師''' 50 teacher_obj = Teacher(teacher_name, teacher_salary) 51 teacher_obj.teacher_add_class(class_name,class_obj) 52 self.school_teacher[teacher_name] = teacher_obj 53 54 def update_teacher(self,teacher_name,class_name,class_obj): 55 '''更新教師信息''' 56 teacher_obj = self.school_teacher[teacher_name] 57 teacher_obj.teacher_add_class(class_name,class_obj) 58 59 def show_teacher(self): 60 '''查看講師信息''' 61 for key in self.school_teacher: 62 teacher_obj = self.school_teacher[key] 63 class_list = [] 64 for i in teacher_obj.teacher_calss: 65 class_list.append(i) 66 print("\33[32;1m講師:%s\t薪資:%s\t關聯班級:%s\33[0m" % (teacher_obj.teacher_name, teacher_obj.teacher_salary, 67 class_list )) 68 def create_student(self,student_name,student_age,class_choice): 69 '''註冊學生''' 70 student_obj = Student(student_name,student_age) #生成學生實例 71 class_obj = self.school_class[class_choice] #獲取學生所註冊班級的實例對象 72 class_obj.class_student[student_name]=student_obj #班級實例裏添加學生信息 73 self.school_class[class_choice] = class_obj #學校班級字典更新 74 75 def show_teacher_classinfo(self,teacher_name): 76 teacher_obj = self.school_teacher[teacher_name] 77 for i in teacher_obj.teacher_calss: 78 class_obj = self.school_class[i] 79 student_list = [] 80 for k in class_obj.class_student: 81 student_list.append(k) 82 print("\33[32;1m班級:%s\t關聯課程:%s\t學員:%s\33[0m" % (class_obj.class_name, class_obj.class_courese.course_name, 83 student_list))
模塊modules下的class:

1 class Class(object): 2 '''班級類,包含名稱,課程,學生''' 3 def __init__(self,class_name,course_obj): 4 self.class_name = class_name 5 self.class_courese = course_obj 6 self.class_student = {} #學生字典
模塊modules下的course:

1 class Course(): 2 '''定義課程類,包含名稱,價格,週期''' 3 def __init__(self,course_name,course_price,course_time): 4 self.course_name = course_name 5 self.course_price = course_price 6 self.course_time = course_time
模塊modules下的student:

class Student(object): '''學生類,包含姓名,年齡''' def __init__(self,student_name,student_age): self.student_name = student_name self.student_age = student_age
模塊modules下的teacher:

1 class Teacher(object): 2 '''講師類,定義teacher_name,teacher_salary,包含teacher_class''' 3 def __init__(self, teacher_name, teacher_salary): 4 self.teacher_name = teacher_name 5 self.teacher_salary = teacher_salary 6 self.teacher_calss = [] #班級列表 [s14,15] 7 8 def teacher_add_class(self,class_name,class_obj): 9 self.teacher_calss[class_name] = class_obj
運行示例圖:
學校視圖:
學生視圖:
講師視圖: