Python開發【項目】:選課系統

程序名稱: 選課系統

角色:學校、學員、課程、講師
要求:
1. 建立北京、上海 2 所學校
2. 建立linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
3. 課程包含,週期,價格,經過學校建立課程 
4. 經過學校建立班級, 班級關聯課程、講師
5. 建立學員時,選擇學校,關聯班級
6. 建立講師角色時要關聯學校, 
7. 提供兩個角色接口
8. 學員視圖, 能夠註冊, 交學費, 選擇班級,
9. 講師視圖, 講師可管理本身的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績 
10. 管理視圖,建立講師, 建立班級,建立課程python

11. 上面的操做產生的數據都經過pickle序列化保存到文件裏linux

開始搞:數據庫

寫程序的第一步就會遇到問題,由於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()
start.py

配置文件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")
settings.py

主業務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")
main.py

數據文件database:  注:不用管,自動初始化生成

1 注:不用管,自動初始化生成
database

模塊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))
student.py

模塊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 = {}         #學生字典
class.py

模塊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
course.py

模塊modules下的student:

class Student(object):
    '''學生類,包含姓名,年齡'''
    def __init__(self,student_name,student_age):
        self.student_name = student_name
        self.student_age = student_age
student.py

模塊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
teacher.py

 

運行示例圖:

學校視圖:

 

學生視圖:

 

講師視圖:

相關文章
相關標籤/搜索