功能:
1. 創建學校
2. 創建課程
3. 課程包含,周期,價格,通過學校創建課程
4. 通過學校創建班級, 班級關聯課程、講師
5. 創建學員時,選擇學校,關聯班級
6. 創建講師角色時要關聯學校,
7. 提供兩個角色接口
7.1 學員視圖, 可以注冊, 交學費, 選擇班級,
7.2 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表,修改所管理的學員的成績
7.3 管理視圖,創建講師, 創建班級,創建課程
8. 上面的操作產生的數據都通過pickle序列化保存到文件里
環境:
python 3.5
知識點:
類的繼承
os模塊的應用
pickle模塊的應用
類方法的運用
md5加密方法
小結:
此系統大致實現了一個學校所需管理系統所需功能,所有信息都封裝成對象保存起來,並用uuid區別,以確保信息的獨立性,充分運用了類的知識,邏輯簡單
目錄結構:
選課系統
bin #存放start.py文件運行文件
conf #存放settings.py文件,進行程序路徑分配
db #存放角色信息
lib #存放commons.py文件,對信息進行md5加密處理
src #存放主要類文件和處理文件
services
admin_service.py
teacher_service.py
student_service.py
identifier.py
models.py

1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 # __author__ = "lx" 4 5 import os 6 import sys 7 8 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 sys.path.append(BASE_DIR) 10 11 from src.services import admin_service 12 from src.services import teacher_service 13 from src.services import student_service 14 from src.services import initialize_service 15 16 17 18 def show_role(): 19 msg = ''' 20 21 \033[1;31m___ 選課系統 ___\033[0m 22 23 0:初始化 24 1:管理員 25 2:老師 26 3:學生 27 4:退出''' 28 print(msg) 29 30 31 if __name__ == '__main__': 32 role_main = { 33 '0':initialize_service.main, 34 '1':admin_service.login, 35 '2':teacher_service.main, 36 '3':student_service.main, 37 '4':exit 38 } 39 while True: 40 show_role() 41 choice = input('請輸入角色:').strip() 42 if choice not in role_main:continue 43 role_main[choice]()

1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 # __author__ = "lx" 4 5 6 import time 7 import pickle 8 import os,sys 9 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 10 sys.path.append(BASE_DIR) 11 from conf import settings 12 from src import identifier 13 14 15 SCORE_DB_DIR = os.path.join(BASE_DIR,'src','services','score','score') 16 17 class BaseModel: 18 def save(self): 19 file_path = os.path.join(self.db_path,str(self.nid)) 20 pickle.dump(self,open(file_path,'wb')) 21 22 @classmethod 23 def get_all_obj_list(cls): 24 ret = [] 25 for filename in os.listdir(cls.db_path): 26 file_path = os.path.join(cls.db_path,filename) 27 ret.append(pickle.load(open(file_path,'rb'))) 28 return ret 29 30 31 class Admin(BaseModel): 32 db_path = settings.ADMIN_DB_DIR 33 def __init__(self,username,password): 34 self.nid = identifier.AdminNid(self.db_path) 35 self.username = username 36 self.password = password 37 self.create_time = time.strftime('%Y-%m-%d') 38 39 @staticmethod 40 def login(): 41 try: 42 name = input('請輸入用戶名:').strip() 43 pas = input('請輸入密碼:').strip() 44 for obj in Admin.get_all_obj_list(): 45 if obj.username == name and obj.password == pas: 46 status = True 47 error = '' 48 data = '\033[45;1m登陸成功\033[0m' 49 break 50 else: 51 raise Exception('\033[43;1m用戶名或密碼錯誤\033[0m' %name) 52 except Exception as e: 53 status = False 54 error = str(e) 55 data = '' 56 return {'status':status,'error':error,'data':data} 57 58 59 class School(BaseModel): 60 db_path = settings.SCHOOL_DB_DIR 61 def __init__(self,name,addr): 62 self.nid = identifier.SchoolNid(self.db_path) 63 self.name = name 64 self.addr = addr 65 self.create_time = time.strftime('%Y-%m-%d %X') 66 67 68 class Teacher(BaseModel): 69 db_path = settings.TEACHER_DB_DIR 70 def __init__(self,name,password,level): 71 self.nid = identifier.TeacherNid(self.db_path) 72 self.name = name 73 self.password = password 74 self.level = level 75 self.__account = 0 76 self.create_time = time.strftime('%Y-%m-%d %X') 77 78 79 80 class Course(BaseModel): 81 db_path = settings.COURSE_DB_DIR 82 def __init__(self,name,price,period,school_nid): 83 self.nid = identifier.CourseNid(self.db_path) 84 self.name = name 85 self.price = price 86 self.period = period 87 self.school_nid = school_nid 88 89 90 class Course_to_teacher(BaseModel): 91 db_path = settings.COURSE_TO_TEACHER_DB_DIR 92 def __init__(self,course_nid,teacher_nid,classes_nid): 93 self.nid = identifier.Course_to_teacherNid(self.db_path) 94 self.course_nid = course_nid 95 self.teacher_nid = teacher_nid 96 self.classes_nid = classes_nid 97 98 def get_course_to_teacher_list(self): 99 ret = self.get_all_obj_list() 100 if ret: 101 return [ret.course_nid.get_obj_by_uuid(),ret.classes_nid.get_obj_by_uuid()] 102 return [None,None] 103 104 105 class Classes(BaseModel): 106 db_path = settings.CLASSES_DB_DIR 107 def __init__(self,name,tuition,course_nid): 108 self.nid = identifier.ClassesNid(self.db_path) 109 self.name = name 110 self.tuition = tuition 111 self.course_nid = course_nid 112 113 114 class Score(BaseModel): 115 db_path = settings.SCORE_DB_DIR 116 def __init__(self,score): 117 self.nid = identifier.ScoreNid(self.db_path) 118 self.score = score 119 120 121 class Student(BaseModel): 122 db_path = settings.STUDENT_DB_DIR 123 def __init__(self,name,password,age,qq,classes_nid,score_nid): 124 self.nid = identifier.StudentNid(self.db_path) 125 self.name = name 126 self.password = password 127 self.age = age 128 self.qq = qq 129 self.classes_nid = classes_nid 130 self.score_nid = score_nid

1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 # __author__ = "lx" 4 5 import os,sys 6 7 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 8 print(BASE_DIR) 9 sys.path.append(BASE_DIR) 10 11 12 from models import Score 13 from models import Admin 14 from models import School 15 from models import Teacher 16 from models import Course 17 from models import Classes 18 from models import Student 19 from models import Course_to_teacher 20 21 22 23 24 25 def create_school(): 26 try: 27 name = input('請輸入學校名字:').strip() 28 addr = input('請輸入學校地址:').strip() 29 school_name_list = [(obj.name,obj.addr) for obj in School.get_all_obj_list()] 30 if (name,addr) in school_name_list: 31 raise Exception('\033[43;1m[%s] [%s]校區已經存在,不可重復創建,你有那么多學生嗎?\033[0m' % (name,addr)) 32 obj = School(name,addr) 33 obj.save() 34 status = True 35 error = '' 36 data = '\033[33;1m[%s] [%s]校區創建成功\033[0m' % (obj.name,obj.addr) 37 except Exception as e: 38 status = False 39 error = str(e) 40 data = '' 41 return {'status':status,'error':error,'data':data} 42 43 def show_school(): 44 for obj in School.get_all_obj_list(): 45 print('\033[45;1m學校[%s] 地址[%s] 創建日期[%s]\033[0m'.center(60,'-') \ 46 %(obj.name,obj.addr,obj.create_time)) 47 48 def create_teacher(): 49 try: 50 name = input('請輸入老師姓名:').strip() 51 password = input('請輸入登陸密碼:').strip() 52 level = input('請輸入老師級別:').strip() 53 teacher_name_list = [obj.name for obj in Teacher.get_all_obj_list()] 54 if name in teacher_name_list: 55 raise Exception('\033[43;1m老師[%s] 已存在,不可重復創建\033[0m' % name) 56 obj = Teacher(name,password,level) 57 obj.save() 58 status = True 59 error = '' 60 data ='\033[33;1m老師[%s] 級別[%s] 時間[%s] 創建成功 \033[0m' % (obj.name,obj.level,obj.create_time) 61 except Exception as e: 62 status = False 63 error = str(e) 64 data = '' 65 return {'status':status,'error':error,'data':data} 66 67 def show_teacher(): 68 for obj in Teacher.get_all_obj_list(): 69 print('\033[33;1m老師[%s] 級別[%s] 錄取時間[%s]\033[0m'.center(60,'-')\ 70 %(obj.name,obj.level,obj.create_time)) 71 72 def create_course(): 73 try: 74 print('創建課程'.center(60,'-')) 75 school_list = School.get_all_obj_list() 76 for k,obj in enumerate(school_list): 77 print(k,obj,obj.addr) 78 sid = int(input('請選擇學校:')) 79 school_obj = school_list[sid] 80 81 name = input('請輸入課程名:').strip() 82 price = input('請輸入課程價格:').strip() 83 period = input('請輸入課程周期:').strip() 84 85 course_name_list = [(obj.name,obj.school_nid.uuid) for obj in Course.get_all_obj_list()] 86 if (name,school_obj.nid.uuid) in course_name_list: 87 raise Exception('\033[43;1m課程[%s] 已存在,不可重復創建\033[0m' % name) 88 obj = Course(name,price,period,school_obj.nid) 89 obj.save() 90 status = True 91 error ='' 92 data = '\033[33;1m課程[%s] 價格[%s] 周期[%s] 創建成功\033[0m' % (obj.name,obj.price,obj.period) 93 except Exception as e: 94 status = False 95 error = str(e) 96 data = '' 97 return {'status':status,'error':error,'data':data} 98 99 def show_course(): 100 for obj in Course.get_all_obj_list(): 101 print('\033[33;1m[%s] [%s]校區 [%s]課程 價格[%s] 周期[%s]\033[0m'.center(60,'-') % (obj.school_nid.get_obj_by_uuid().name,obj.school_nid.get_obj_by_uuid().addr,obj.name,obj.price,obj.period)) 102 103 def create_course_to_teacher(): 104 105 106 print('課程導師'.center(60, '=')) 107 course_list = Course.get_all_obj_list() 108 for k, obj in enumerate(course_list): 109 print(k, obj, obj.name) 110 sid = int(input('請選擇課程: ')) 111 course_obj = course_list[sid] 112 113 teacher_list = Teacher.get_all_obj_list() 114 for k, obj in enumerate(teacher_list): 115 print(k, obj, obj.name) 116 sid = int(input('請選擇關聯導師: ')) 117 teacher_obj = teacher_list[sid] 118 119 classes_list = Classes.get_all_obj_list() 120 for k, obj in enumerate(classes_list): 121 print(k, obj, obj.name) 122 sid = int(input('請選擇負責班級: ')) 123 classes_obj = classes_list[sid] 124 125 obj = Course_to_teacher(course_obj.nid,teacher_obj.nid,classes_obj.nid) 126 obj.save() 127 status = True 128 error = '' 129 data = '\033[33;1m課程[%s] 班級[%s] 導師[%s] 分配成功\033[0m' % (course_obj.name, classes_obj.name, teacher_obj.name) 130 return {'status': status, 'error': error, 'data': data} 131 132 133 def create_classes(): 134 try: 135 print('創建班級'.center(60, '-')) 136 course_list = Course.get_all_obj_list() 137 for k, obj in enumerate(course_list): 138 print(k, obj, obj.name) 139 sid = int(input('請選擇課程:')) 140 course_obj = course_list[sid] 141 name = input('請輸入班級名:').strip() 142 tuition = input('請輸入學費:').strip() 143 144 classes_name_list = [obj.name for obj in Classes.get_all_obj_list()] 145 if name in classes_name_list: 146 raise Exception('\033[43;1m班級[%s] 已存在,不可重復創建\033[0m' % name) 147 obj = Classes(name, tuition, course_obj.nid) 148 obj.save() 149 status = True 150 error = '' 151 data = '\033[33;1m班級[%s] 學費[%s] 創建成功\033[0m' % (obj.name, obj.tuition) 152 153 except Exception as e: 154 status = False 155 error = str(e) 156 data = '' 157 return {'status': status, 'error': error, 'data': data} 158 159 160 def show_classes(): 161 for obj in Classes.get_all_obj_list(): 162 print('\033[33;1m [%s]課程 班級[%s] 學費[%s]\033[0m'.center(60,'-') \ 163 %(obj.course_nid.get_obj_by_uuid().name,obj.name,obj.tuition)) 164 165 166 def create_student(): 167 168 print('新生入學'.center(60, '-')) 169 classes_list = Classes.get_all_obj_list() 170 for k, obj in enumerate(classes_list): 171 print(k, obj, obj.name) 172 sid = int(input('請選擇班級:')) 173 classes_obj = classes_list[sid] 174 175 name = input('請輸入學生姓名:').strip() 176 password = input('請輸入登陸密碼:').strip() 177 age = input('請輸入學生年齡:').strip() 178 qq = input('請輸入學生QQ:').strip() 179 score_obj = Score(0) 180 score_obj.save() 181 obj = Student(name,password,age,qq,classes_obj.nid,score_obj.nid) 182 obj.save() 183 status = True 184 error = '' 185 data ='\033[33;1m學生[%s] age[%s] QQ[%s] 錄取成功 \033[0m' % (obj.name,obj.age,obj.qq) 186 187 return {'status':status,'error':error,'data':data} 188 189 190 def show_student(): 191 for obj in Student.get_all_obj_list(): 192 print('\033[33;1m學生[%s] age[%s] QQ[%s]\033[0m'.center(60,'-')\ 193 %(obj.name,obj.age,obj.qq)) 194 195 196 def show(): 197 msg = ''' 198 0:選項 199 1:創建學校 200 2:查看學校 201 3:創建老師 202 4:查看老師 203 5:創建課程 204 6:查看課程 205 7:關聯老師與課程 206 8:創建班級 207 9:查看班級 208 10:創建學生 209 11:查看學生 210 return 返回上一級 211 ''' 212 print(msg) 213 214 215 def main(): 216 choice_dic = { 217 '0':show, 218 '1':create_school, 219 '2':show_school, 220 '3':create_teacher, 221 '4':show_teacher, 222 '5':create_course, 223 '6':show_course, 224 '7':create_course_to_teacher, 225 '8':create_classes, 226 '9':show_classes, 227 '10':create_student, 228 '11':show_student, 229 } 230 while True: 231 show() 232 choice = input('請輸入選項:').strip() 233 if choice not in choice_dic and choice != 'return': 234 continue 235 elif choice == 'return': 236 break 237 else: 238 ret = choice_dic[choice]() 239 if ret: 240 if ret['status']: 241 print(ret['data'].center(60,'-')) 242 else: 243 print(ret['error'].center(60, '-')) 244 245 246 def login(): 247 ret = Admin.login() 248 if ret: 249 if ret['status']: 250 print(ret['data'].center(60,'-')) 251 main() 252 else: 253 print(ret['error'].center(60,'-'))

1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 # __author__ = "lx" 4 5 6 7 8 from lib import commons 9 import os,pickle 10 11 12 class Nid: 13 def __init__(self,role,db_path): 14 role_list = ['admin','school','teacher','course','course_to_teacher','classes','student','score'] 15 if role not in role_list: 16 raise Exception('用戶角色錯誤,選項:%s' % ','.join(role_list)) 17 self.role = role 18 self.uuid = commons.create_uuid() 19 self.db_path = db_path 20 21 def __str__(self): 22 return self.uuid 23 24 def get_obj_by_uuid(self): 25 for filename in os.listdir(self.db_path): 26 if filename == self.uuid: 27 return pickle.load(open(os.path.join(self.db_path,filename),'rb')) 28 return None 29 30 31 class AdminNid(Nid): 32 def __init__(self,db_path): 33 super(AdminNid, self).__init__('admin',db_path) 34 35 36 class SchoolNid(Nid): 37 def __init__(self,db_path): 38 super(SchoolNid,self).__init__('school',db_path) 39 40 41 class TeacherNid(Nid): 42 def __init__(self,db_path): 43 super(TeacherNid, self).__init__('teacher',db_path) 44 45 46 class CourseNid(Nid): 47 def __init__(self,db_path): 48 super(CourseNid, self).__init__('course',db_path) 49 50 51 class Course_to_teacherNid(Nid): 52 def __init__(self,db_path): 53 super(Course_to_teacherNid, self).__init__('course_to_teacher',db_path) 54 55 56 class ClassesNid(Nid): 57 def __init__(self,db_path): 58 super(ClassesNid, self).__init__('classes',db_path) 59 60 61 class StudentNid(Nid): 62 def __init__(self,db_path): 63 super(StudentNid, self).__init__('student',db_path) 64 65 66 class ScoreNid(Nid): 67 def __init__(self,db_path): 68 super(ScoreNid,self).__init__('score',db_path)

1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 # __author__ = "lx" 4 5 6 import uuid,hashlib 7 import time 8 9 def create_uuid(): 10 return str(uuid.uuid1()) 11 12 13 def create_md5(): 14 md = hashlib.md5() 15 md.update(bytes(str(time.time()),encoding='utf-8')) 16 return md.hexdigest

1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 # __author__ = "lx" 4 import os,sys 5 import pickle 6 7 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 8 sys.path.append(BASE_DIR) 9 10 from models import Score 11 from models import Teacher 12 from models import Student 13 from models import Course_to_teacher 14 15 16 17 SCORE_DB_DIR = os.path.join(BASE_DIR,'services','score','score') 18 19 def class_info(teacher_nid): 20 '''查看班級信息''' 21 classes_list = [] 22 for obj in Course_to_teacher.get_all_obj_list(): 23 if obj.teacher_nid.get_obj_by_uuid().name == teacher_nid.get_obj_by_uuid().name: 24 obj = obj.classes_nid 25 classes_list.append(obj.get_obj_by_uuid()) 26 return classes_list 27 28 29 def student_info(teacher_nid): 30 '''查看學生信息''' 31 classes_list = [] 32 student_list = [] 33 num = 0 34 classes_lists = class_info(teacher_nid) 35 for obj in classes_lists: 36 classes_list.append(obj.name) 37 for obj in Student.get_all_obj_list(): 38 if obj.classes_nid.get_obj_by_uuid().name in classes_list: 39 student_list.append(obj) 40 score_list = Score.get_all_obj_list() 41 for objs in score_list: 42 if str(objs.nid) == str(obj.score_nid): 43 print('\033[33;1m%s、學生[%s] age[%s] QQ[%s] 成績[%s]\033[0m'.center(60, '-') \ 44 % (num,obj.name, obj.age, obj.qq, objs.score)) 45 break 46 return student_list 47 48 49 def set_student_score(teacher_nid): 50 '''設置學生分數''' 51 52 print('set student') 53 student_list = student_info(teacher_nid) 54 choice = int(input('請選擇學生:').strip()) 55 number = float(input('請輸入分數:').strip()) 56 obj = Score(number) 57 obj.save() 58 student_list[choice].score_nid = obj.nid 59 student_list[choice].save() 60 print('------成績設置成功------') 61 62 63 def action(obj): 64 num = 0 65 to_list = Course_to_teacher.get_all_obj_list() 66 for to_obj in to_list: 67 if to_obj.teacher_nid.get_obj_by_uuid().name == obj.name: 68 teacher_nid = to_obj.teacher_nid 69 while True: 70 print('\n\033[1;31m____Teacher %s____\033[0m\n'%teacher_nid.get_obj_by_uuid().name) 71 print(' 1、查看班級信息\n 2、查看學生信息\n 3、設置學生分數\n 4、退出') 72 choice = str(input('>>>').strip()) 73 if choice == '1': 74 classes_list = class_info(teacher_nid) 75 for obj in classes_list: 76 print('\033[33;1m %s、課程[%s] 班級[%s] 學費[%s]\033[0m'.center(60, '-') \ 77 % (num, obj.course_nid.get_obj_by_uuid().name, obj.name, 78 obj.tuition)) 79 num += 1 80 input() 81 elif choice == '2': 82 student_info(teacher_nid) 83 input() 84 elif choice == '3': 85 set_student_score(teacher_nid) 86 input() 87 elif choice == '4': 88 break 89 else:continue 90 91 92 def main(): 93 print('教師界面'.center(60, '-')) 94 obj = login() 95 if obj == 'fail': 96 print('登陸失敗!!') 97 else: 98 action(obj) 99 100 101 def login(): 102 while True: 103 teacher_name = input('請輸入姓名:').strip() 104 teacher_password = input('請輸入登陸密碼:').strip() 105 teacher_list = Teacher.get_all_obj_list() 106 for obj in teacher_list: 107 if teacher_name == obj.name and teacher_password == obj.password: 108 return obj 109 choice = input('登陸失敗!是否重試?(y:是 n:否)').strip() 110 if choice == 'y': 111 continue 112 elif choice == 'n': 113 return 'fail'