模拟选课系统

功能:
    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 33[1;31m___ 选课系统 ___33[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]()
start #运行文件
  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 = '33[45;1m登陆成功33[0m'
 49                     break
 50                 else:
 51                     raise Exception('33[43;1m用户名或密码错误33[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
models #定义对象属性
  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('33[43;1m[%s] [%s]校区已经存在,不可重复创建,你有那么多学生吗?33[0m' % (name,addr))
 32         obj = School(name,addr)
 33         obj.save()
 34         status = True
 35         error = ''
 36         data = '33[33;1m[%s] [%s]校区创建成功33[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('33[45;1m学校[%s] 地址[%s] 创建日期[%s]33[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('33[43;1m老师[%s] 已存在,不可重复创建33[0m' % name)
 56         obj = Teacher(name,password,level)
 57         obj.save()
 58         status = True
 59         error = ''
 60         data ='33[33;1m老师[%s] 级别[%s] 时间[%s] 创建成功 33[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('33[33;1m老师[%s] 级别[%s] 录取时间[%s]33[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('33[43;1m课程[%s] 已存在,不可重复创建33[0m' % name)
 88         obj = Course(name,price,period,school_obj.nid)
 89         obj.save()
 90         status = True
 91         error =''
 92         data = '33[33;1m课程[%s] 价格[%s] 周期[%s] 创建成功33[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('33[33;1m[%s] [%s]校区 [%s]课程 价格[%s] 周期[%s]33[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 = '33[33;1m课程[%s] 班级[%s] 导师[%s] 分配成功33[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('33[43;1m班级[%s] 已存在,不可重复创建33[0m' % name)
147         obj = Classes(name, tuition, course_obj.nid)
148         obj.save()
149         status = True
150         error = ''
151         data = '33[33;1m班级[%s] 学费[%s] 创建成功33[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('33[33;1m [%s]课程 班级[%s] 学费[%s]33[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 ='33[33;1m学生[%s] age[%s] QQ[%s] 录取成功 33[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('33[33;1m学生[%s] age[%s] QQ[%s]33[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,'-'))
admin_service #管理员
 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)
identifier #分配nid
 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
commons #生成nid
  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('33[33;1m%s、学生[%s] age[%s] QQ[%s] 成绩[%s]33[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('
33[1;31m____Teacher %s____33[0m
'%teacher_nid.get_obj_by_uuid().name)
 71         print('    1、查看班级信息
    2、查看学生信息
    3、设置学生分数
    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('33[33;1m %s、课程[%s] 班级[%s] 学费[%s]33[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'
teacher_service #教师
原文地址:https://www.cnblogs.com/liyongbin/p/7210042.html