zoukankan      html  css  js  c++  java
  • 模拟选课系统

    功能:
        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 #教师
  • 相关阅读:
    Redis 思维导图 (解析版)
    一张图片了解redis
    Redis 思维导图
    计算机网络协议
    IT笔面试题
    Hadoop集群搭建
    天涯论坛只看楼主
    齐秦&r大约在冬季现场版
    郁可唯茶汤现场版
    MTK平台电路设计01
  • 原文地址:https://www.cnblogs.com/liyongbin/p/7210042.html
Copyright © 2011-2022 走看看