模拟选课系统
功能:
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'
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步