Python选课系统

总是感觉写的很繁琐,请看到的各位帮忙分析下。

需求:

  1. 创建北京、上海 2 所学校
  2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
  3. 课程包含,周期,价格,通过学校创建课程 
  4. 通过学校创建班级, 班级关联课程、讲师
  5. 创建学员时,选择学校,关联班级
  5. 创建讲师角色时要关联学校, 
  6. 提供两个角色接口
    6.1 学员视图, 可以注册, 交学费, 选择班级,
      6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩 
    6.3 管理视图,创建讲师, 创建班级,创建课程

  7. 上面的操作产生的数据都通过pickle序列化保存到文件里

分析:

 1.找名词(类)

  学校,课程,班级,讲师,学员

 2.找动作(类的属性)

  学校: 名称,校区,创建/显示课程/班级/讲师/学员

  课程:名称,周期,学费

  班级:名称

  讲师:姓名,薪水

  学员:姓名,年龄

 3.组织关系

  课程关联学校

  班级关联课程

  讲师关联班级

  学员关联班级

 

1.模块设计

  

2.执行过程部分

 

3.代码

import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import pickle
from config import settings
from lib.modules import School


class Manage_center:
    def __init__(self):
        school_list = {}
        school_name1 = '北京'
        school_obj1 = School(school_name1)
        school_name2 = '上海'
        school_obj2 = School(school_name2)
        school_list.update({school_name1:school_obj1,school_name2:school_obj2})
        pickle.dump(school_list,open(settings.SCHOOL_FILE,'wb'))
        self.school_location_view = '''\033[33;0m
                1-北京
                2-上海
                \033[0m'''

    def run(self):
        print('欢迎进入SLITOBO开发学院')
        print(self.school_location_view)
        school_obj_dict = pickle.load(open(settings.SCHOOL_FILE, 'rb'))
        user_choice = input('请选择校区:')
        if user_choice == '1':
            school_obj = school_obj_dict['北京']
        elif user_choice == '2':
            school_obj = school_obj_dict['上海']
        print('\033[34;1m欢迎进入 <%s> <%s>校区\033[0m' % (school_obj.name, school_obj.location))
        while True:
            menu_view = ('''\033[32;0m
                1:学校视图
                2:讲师视图
                3:学员视图
                4:退出
            \033[0m'''

            )
            print(menu_view)
            menu_dict = {
                '1': School_view,
                '2': Teacher_view,
                '3': Student_view,
            }
            user_choice = input("请选择登陆的视图序号:").strip()
            if user_choice == '4':
                break
            try:
                menu_dict[user_choice](school_obj).run()
            except KeyError as e :
                print('无效输入')


class School_view:
    def __init__(self,school_obj):
        self.school_obj = school_obj
        self.school_menu_view = (
        '''\033[32;0m
        1:创建讲师      2:查看讲师      
        3:创建课程      4:查看课程      
        5:创建班级      6:查看班级
        7:返回首页          
        \033[0m''')

        self.school_menu_dict = {
            '1':self.create_teacher,
            '2':self.show_teacher,
            '3':self.create_course,
            '4':self.show_course,
            '5':self.create_class,
            '6':self.show_class,
        }


    def run(self):

        while True:
            print('\033[34;1m欢迎进入 <%s> <%s>校区\033[0m' % (self.school_obj.name, self.school_obj.location))
            print('--------------------------------------------------------')
            print(self.school_menu_view)
            user_choice = input("请选择操作的序号:").strip()
            if user_choice == '7':
                break
            try:
                self.school_menu_dict[user_choice]()
            except KeyError as e:
                print("\33[31;1m无效输入\33[0m")

    def create_teacher(self):
        teacher_name = input("请输入老师的名字:")
        teacher_salary = input("请输入老师的薪水:")
        class_name = input("请输入关联的班级:")

        if os.path.exists(settings.CLASSES_FILE):
            class_obj_dict = pickle.load(open(settings.CLASSES_FILE, 'rb'))
        else:
            class_obj_dict = self.school_obj.school_class

        if os.path.exists(settings.TEACHER_FILE):
            teacher_obj_dict = pickle.load(open(settings.TEACHER_FILE, 'rb'))
        else:
            teacher_obj_dict = self.school_obj.school_teacher

        if class_name in class_obj_dict:
            class_obj = class_obj_dict[class_name]
            if teacher_name not in teacher_obj_dict:
                self.school_obj.create_teacher(teacher_name, teacher_salary, class_name, class_obj)
            else:
                user_choice = input("\33[31;1m讲师已经存在,是否要更新(y/n)?\33[0m")
                if user_choice == 'y':

                    self.school_obj.update_teacher(teacher_name, class_name, class_obj)
                    print("\33[31;1m讲师已经存在,属性已更新\33[0m")
                else:
                    print("\33[31;1m未更新\33[0m")

        else:
            print("\33[31;1m班级不存在,不能关联讲师\33[0m")

    def show_teacher(self):
        self.school_obj.show_teacher()

    def create_course(self):
        course_name = input('请创建课程:')
        if os.path.exists(settings.COURSE_FILE):
            course_obj_dict = pickle.load(open(settings.COURSE_FILE, 'rb'))
            if course_name not in course_obj_dict:
                course_cost = input('请输入课程费用:')
                course_cycle = input("请输入课程周期:")
                self.school_obj.create_course(course_name, course_cost, course_cycle)
            else:
                print("\33[31;1m课程已经存在\33[0m")
        else:
            course_cost = input('请输入课程费用:')
            course_cycle = input("请输入课程周期:")
            self.school_obj.create_course(course_name, course_cost, course_cycle)


    def show_course(self):
        self.school_obj.show_course()

    def create_class(self):
        class_name = input("请创建班级名称:")
        course_name = input("请输入班级的课程:")

        if os.path.exists(settings.COURSE_FILE):
            course_obj_dict = pickle.load(open(settings.COURSE_FILE, 'rb'))
        else:
            course_obj_dict = self.school_obj.school_course
        if os.path.exists(settings.CLASSES_FILE):
            class_obj_dict = pickle.load(open(settings.CLASSES_FILE, 'rb'))
        else:
            class_obj_dict = self.school_obj.school_class

        if class_name not in class_obj_dict:
            if course_name in course_obj_dict:
                course_obj = course_obj_dict[course_name]
                self.school_obj.create_class(class_name,course_obj)
            else:
                print("\33[31;1m没有这个课程\33[0m")
        else:
            print("\33[31;1m班级已经存在\33[0m")

    def show_class(self):
        self.school_obj.show_class()



class Teacher_view:
    def __init__(self,school_obj):
        self.school_obj = school_obj
        self.school_menu_view = (
            '''\033[32;0m
            1:查看开班信息
            2.查看班级学员列表
            3.批改成绩
            4:返回首页            
            \033[0m''')

        self.school_menu_dict = {
            '1': self.show_class,
            '2': self.show_class_student,
            '3': self.check_grades,
        }


    def run(self):

        while True:
            print('\033[34;1m欢迎进入 <%s> <%s>校区\033[0m' % (self.school_obj.name, self.school_obj.location))
            print('--------------------------------------------------------')
            print(self.school_menu_view)
            user_choice = input("请选择操作的序号:").strip()
            if user_choice == '4':
                break
            try:
                self.school_menu_dict[user_choice]()
            except KeyError as e:
                print("\33[31;1m无效输入\33[0m")


    def show_class(self):
        teacher_name = input("请输入教师姓名:")
        teacher_obj_dict = pickle.load(open(settings.TEACHER_FILE,'rb'))
        teacher_obj = teacher_obj_dict[teacher_name]
        class_list = []
        for i in teacher_obj.teacher_classes:
            if self.school_obj.location == teacher_obj.teacher_classes[i].class_course.school_obj.location:
                class_list.append(i)
                print(teacher_obj.teacher_name, teacher_obj.teacher_salary, class_list)
    def show_class_student(self):
        teacher_name = input('请输入老师名字:')
        self.school_obj.show_teacher_classinfo(teacher_name)



    def check_grades(self):
        pass

class Student_view:
    def __init__(self,school_obj):
        self.school_obj = school_obj
        self.student_menu_view = (
            '''\033[32;0m
            1.查看班级
            2:选择班级(缴费)
            3.查看班级学员
            4:返回首页            
            \033[0m''')

        self.student_menu_dict = {
            '1': self.show_class,
            '2': self.select_class,
            '3': self.show_stu_in_class
        }

    def run(self):
        while True:
            print('\033[34;1m欢迎进入 <%s> <%s>校区\033[0m' % (self.school_obj.name, self.school_obj.location))
            print('--------------------------------------------------------')
            print(self.student_menu_view)
            user_choice = input("请选择操作的序号:").strip()
            if user_choice == '4' or user_choice == 'q':
                break
            try:
                self.student_menu_dict[user_choice]()
            except KeyError as e:
                print("\33[31;1m无效输入\33[0m")



    def show_class(self):
        self.school_obj.show_class()
    def select_class(self):
        stu_name = input("请输入学员姓名:")
        stu_age = input("请输入学员年龄")
        class_name= input("请输入要加入的班级:")
        self.school_obj.create_student(stu_name, stu_age, class_name)

    def show_stu_in_class(self):
        self.school_obj.show_stu_in_class()



if __name__ == '__main__':

    obj = Manage_center()
    obj.run()
main.py
import os,sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

import time
import pickle
from config import settings

# class Admin:
#     '''
#     login做判断
#     register注册用户,存储admin_obj在文件中
#     '''
#     def __init__(self):
#         self.username = None
#         self.password = None
# 
#     def login(self,user,pwd):
#         if self.username == user and self.password == pwd:
#             return True
#         else:
#             return False
# 
#     def register(self,user,pwd):
#         self.username = user
#         self.password = pwd
# 
#         admin_file = os.path.join(settings.BASE_ADMIN_DIR,self.username)
#         pickle.dump(self,open(admin_file,'ab',0))

class School:
    name = 'SLITOBO开发学院'
    def __init__(self,location):
        self.location = location
        # self.create_admin = admin_obj
        self.create_time = time.strftime('%Y-%m-%d %H:%M:%S')
        self.school_course = {}
        self.school_class = {}
        self.school_teacher = {}

    #创建课程
    def create_course(self,course_name,course_cost,course_cycle):
        # 如果文件中有课程,先导入
        if os.path.exists(settings.COURSE_FILE):
            course_dict = pickle.load(open(settings.COURSE_FILE, 'rb'))
            self.school_course.update(course_dict)
        course_obj = Course(self,course_name,course_cost,course_cycle)
        self.school_course[course_name] = course_obj
        pickle.dump(self.school_course,open(settings.COURSE_FILE,'wb'),0)

    def show_course(self):
        try:
            course_dict = pickle.load(open(settings.COURSE_FILE,'rb'))
        except FileNotFoundError:
            print("还没有课程")
        else:
            for key in course_dict:
                course_obj = course_dict[key]
                if self.location == course_obj.school_obj.location:
                    print(course_obj.school_obj.location,course_obj.course_name,course_obj.course_cost,course_obj.course_cycle)


    #创建班级
    def create_class(self,class_name,course_obj):
        if os.path.exists(settings.CLASSES_FILE):
            class_obj_dict = pickle.load(open(settings.CLASSES_FILE,'rb'))
            self.school_class.update(class_obj_dict)
        class_obj = Classes(class_name,course_obj)
        self.school_class[class_name] = class_obj
        pickle.dump(self.school_class,open(settings.CLASSES_FILE,'wb'))

    def show_class(self):
        try:
            class_obj_dict = pickle.load(open(settings.CLASSES_FILE, 'rb'))
        except FileNotFoundError:
            print("还没有班级")
        else:
            for key in class_obj_dict:
                class_obj = class_obj_dict[key]
                if self.location == class_obj.class_course.school_obj.location:
                    print(class_obj.class_name, class_obj.class_course.course_name)



    #创建老师
    def create_teacher(self,teacher_name,teacher_salay,class_name,class_obj):
        if os.path.exists(settings.TEACHER_FILE):
            teacher_obj_dict = pickle.load(open(settings.TEACHER_FILE,'rb'))
            self.school_teacher.update(teacher_obj_dict)
        teacher_obj = Teacher(teacher_name,teacher_salay)
        self.school_teacher[teacher_name] = teacher_obj
        teacher_obj.teacher_add_classes(class_name,class_obj)
        pickle.dump(self.school_teacher, open(settings.TEACHER_FILE, 'wb'))

    # 更新老师信息
    def update_teacher(self,teacher_name,class_name,class_obj):
        teacher_obj_dict = pickle.load(open(settings.TEACHER_FILE, 'rb'))
        self.school_teacher.update(teacher_obj_dict)
        teacher_obj =  self.school_teacher[teacher_name]
        teacher_obj.teacher_add_classes(class_name,class_obj)
        pickle.dump(self.school_teacher, open(settings.TEACHER_FILE, 'wb'))

    # 显示老师信息
    def show_teacher(self):
        try:
            teacher_obj_dict = pickle.load(open(settings.TEACHER_FILE, 'rb'))
        except FileNotFoundError:
            print("还没有讲师")
        else:
            for key in teacher_obj_dict:
                teacher_obj = teacher_obj_dict[key]
                class_list = []
                for i in teacher_obj.teacher_classes:
                    if self.location == teacher_obj.teacher_classes[i].class_course.school_obj.location:
                        class_list.append(i)
                        print(teacher_obj.teacher_name, teacher_obj.teacher_salary, class_list)


    # 创建学生,添加到班级中
    def create_student(self,stu_name,stu_age,class_name):
        stu_obj = Student(stu_name, stu_age)

        class_obj_dict = pickle.load(open(settings.CLASSES_FILE,'rb'))
        self.school_class.update(class_obj_dict)
        class_obj = class_obj_dict[class_name]


        class_obj.class_student[stu_name] = stu_obj
        self.school_class[class_name] = class_obj


        pickle.dump(self.school_class, open(settings.CLASSES_FILE, 'wb'))


    def show_stu_in_class(self):
        class_obj_dict = pickle.load(open(settings.CLASSES_FILE, 'rb'))
        for key in class_obj_dict:
            class_obj = class_obj_dict[key]
            class_list = []
            for i in class_obj.class_student:
                if self.location == class_obj.class_course.school_obj.location:
                    class_list.append(i)
                print(class_obj.class_name,class_list)


    def show_teacher_classinfo(self,teacher_name):
        # teacher_obj_dict拿到的是学生未创建的老的班级信息

        teacher_obj_dict = pickle.load(open(settings.TEACHER_FILE, 'rb'))
        teacher_obj = teacher_obj_dict[teacher_name]
        class_obj_dict = pickle.load(open(settings.CLASSES_FILE, 'rb'))
        for key in class_obj_dict:
            class_obj = class_obj_dict[key]
            student_list = []
            for num in class_obj.class_student:
                if self.location == class_obj.class_course.school_obj.location:
                    student_list.append(num)
                    print(teacher_obj.teacher_name, class_obj.class_name, class_obj.class_course.course_name, student_list)


class Course:
    def __init__(self, school_obj,course_name, course_cost, course_cycle):
        self.course_name = course_name
        self.course_cost = course_cost
        self.course_cycle = course_cycle
        self.school_obj = school_obj


class Teacher:

    def __init__(self,teacher_name,teacher_salary):
        self.teacher_salary = teacher_salary
        self.teacher_name = teacher_name
        self.teacher_classes = {}

    def teacher_add_classes(self,class_name,class_obj):
        self.teacher_classes[class_name] = class_obj

class Classes:

    def __init__(self,class_name,course_obj):
        self.class_name = class_name
        self.class_course = course_obj
        self.class_student = {}


class Student:

    def __init__(self,stu_name,stu_age):
        self.stu_name = stu_name
        self.stu_age = stu_age
        self.stu_class = {}
modules.py
import os

# 程序基本目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__ )))
# admin 目录
BASE_ADMIN_DIR = os.path.join(BASE_DIR,'db','admin')

# school 目录
BASE_SCHOOL_DIR = os.path.join(BASE_DIR,'db','school')
SCHOOL_FILE = os.path.join(BASE_SCHOOL_DIR,'school_list')

# classes目录
BASE_CLASSES_DIR = os.path.join(BASE_DIR,'db','classes')
CLASSES_FILE = os.path.join(BASE_CLASSES_DIR,'classes_list')

#学员目录
BASE_STD_DIR = os.path.join(BASE_DIR,'db','students')

# 讲师目录
BASE_TEAH_DIR = os.path.join(BASE_DIR,'db','teacher')

TEACHER_FILE = os.path.join(BASE_TEAH_DIR,'teacher_list')


# 课程目录
BASE_COURSE_DIR = os.path.join(BASE_DIR,'db','course')

COURSE_FILE = os.path.join(BASE_COURSE_DIR,'course_list')
settings.py

 

posted @ 2018-07-23 12:17  slitobo  阅读(113)  评论(0)    收藏  举报