模擬選課系統


功能:
    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]()
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 = '\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
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('\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,'-'))
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('\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'
teacher_service #教師

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM