面向对象练习 选课系统

面向对象练习:选课系统

需求

- 管理员视图
    - 1.创建学校
    - 2.创建课程
    - 3.创建教师账号
    - 4.登陆注册

- 学员视图
    - 1.注册
    - 2.登录功能
    - 3.选择校区
    - 4.选择课程(先选择校区,再选择校区中的某一门课程)
        - 学生选择课程,课程也选择学生
    - 5.查看分数

- 讲师视图
    - 1.登录
    - 2.查看教授课程
    - 3.选择教授课程
    - 4.查看课程下学生
    - 5.修改学生分数

start.py

import os,sys
from core import src
sys.path.append(os.path.dirname(__file__))
if __name__ == '__main__':
    src.run()

core

src.py

from core import admin,teacher,student

func_dic = {
    '1':['管理员入口',admin.admin_view],
    '2':['教师入口',teacher.teacher_view],
    '3':['学生入口',student.student_view]
}



def run():
    print('欢迎来到新东方烹饪学校')
    while True:
        print('='*30)
        for i in func_dic:
            print(i,func_dic[i][0])
        print('=' * 30)
        cmd = input('请输入选择功能的编号:').strip()
        if cmd not in func_dic:
            print('错误的输入,重试')
            continue
        func_dic[cmd][1]()

admin.py

from interface import admin_interface, common_interface
from lib import common

admin_info = {'user': None}


def register():
    while True:
        account = input('请输入要注册的账号名:').strip()
        pwd = input('请输入密码:')
        re_pwd = input('请再次输入密码:')
        if pwd != re_pwd:
            print('两次密码输入不一致')
            continue
        flag, msg = common_interface.register_interface(account, pwd, 'admin')
        if flag:
            print(msg)
            break
        else:
            print(msg)


def login():
    while True:
        account = input('请输入管理员账号:')
        pwd = input('请输入密码:')
        flag, msg = common_interface.login_interface(account, pwd, 'admin')
        if flag:
            print(msg)
            admin_info['user'] = account
            break
        else:
            print(msg)


@common.login_auth('admin')
def create_school():
    while True:
        school_name = input('请输入要创建的学校名:')
        school_addr = input('请输入要创建学校的地址:')
        flag, msg = admin_interface.create_school_interface(school_name, school_addr, admin_info['user'])
        if flag:
            print(msg)
            break
        else:
            print(msg)


@common.login_auth('admin')
def create_course():
    while True:
        flag,lis = common_interface.get_item_interface('School')
        if not flag:
            print('尚未创建学校,请管理员先创建学校')
            break
        for index,school_name in enumerate(lis):
            print(f'编号 {index} 学校名 {school_name}')
        choice = input('请输入学校编号:')
        if not choice.isdigit():
            print('请输入数字')
            continue
        choice = int(choice)
        if choice in range(len(lis)):
            course_name = input('请输入课程名:').strip()
            period = input('请输入课程周期:').strip()
            flag, msg = admin_interface.create_course_interface(lis[choice],course_name, period, admin_info['user'])
            if flag:
                print(msg)
                break
            else:
                print(msg)
        else:
            print('错误的输入,重试')


@common.login_auth('admin')
def create_teacher():
    while True:
        teacher_account = input('请输入要创建的老师账号名:').strip()
        teacher_pwd = input('请输入老师账号的密码:').strip()
        flag, msg = admin_interface.create_teacher_interface(teacher_account, teacher_pwd, admin_info['user'])
        if flag:
            print(msg)
            break
        else:
            print(msg)


func_dic = {
    '1': ['注册', register],
    '2': ['登陆', login],
    '3': ['创建校区', create_school],
    '4': ['创建课程', create_course],
    '5': ['创建教师账户', create_teacher],
    '6': ['退出当前界面', ]
}


def admin_view():
    print('欢迎使用管理员功能')
    while True:
        for i in func_dic:
            print(i, func_dic[i][0])
        cmd = input('请输入指令编号')
        if cmd not in func_dic:
            print('错误的输入,重试')
            continue
        if cmd == '6':
            return
        func_dic[cmd][1]()

teacher.py

from interface import common_interface, teacher_interface
from lib import common

teacher_info = {'user': None}


def login():
    while True:
        account = input('请输入老师账号:')
        pwd = input('请输入密码:')
        flag, msg = common_interface.login_interface(account, pwd, 'teacher')
        if flag:
            print(msg)
            teacher_info['user'] = account
            break
        else:
            print(msg)


@common.login_auth('teacher')
def choose_course():
    while True:
        flag, lis = common_interface.get_item_interface('School')
        if not flag:
            print('尚未创建学校')
            return
        for index, school_name in enumerate(lis):
            print(f'学校编号 {index} 学校名 {school_name}')
        choice = input('请输入学校编号:')
        if not choice.isdigit():
            print('输入必须是数字')
            continue
        choice = int(choice)
        if choice not in range(len(lis)):
            print('请输入正确的编号')
            continue
        choice_school = lis[choice]
        flag, course_lis = common_interface.get_course_interface(choice_school)
        if flag:
            while True:
                for index, course in enumerate(course_lis):
                    print(f'课程编号{index} 课程名{course_lis}')
                choice = input('请输入要选择的课程编号:')
                if not choice.isdigit():
                    print('输入必须是数字')
                    continue
                choice = int(choice)
                if choice not in range(len(lis)):
                    print('请输入正确的编号')
                    continue
                choice_course = course_lis[choice]
                flag, msg = teacher_interface.choose_course_interface(choice_course, teacher_info['user'])
                if flag:
                    print(msg)
                    return
                else:
                    print(msg)
        else:
            print(course_lis)
            break


@common.login_auth('teacher')
def check_course():
    flag, lis = teacher_interface.check_course_interface(teacher_info['user'])
    if flag:
        for i in lis:
            print(i)
    else:
        print(lis)


@common.login_auth('teacher')
def check_student():
    while True:
        flag, course_lis = teacher_interface.check_course_interface(teacher_info['user'])
        if not flag:
            print(course_lis)
            return
        for index, course_name in enumerate(course_lis):
            print(f'编号{index} 课程名{course_name}')
        choice_course = input('请输入课程编号:')
        if not choice_course.isdigit():
            print('请输入正确的数字')
            continue
        choice_course = int(choice_course)
        if choice_course not in range(len(course_lis)):
            print('输入的编号不存在,重试')
            continue
        choice_course = course_lis[choice_course]
        flag, student_lis = teacher_interface.check_student_interface(choice_course)
        if flag:
            for i in student_lis:
                print(i)
            return
        else:
            print(student_lis)
            return

@common.login_auth('teacher')
def mark_score():
    while True:
        flag,course_lis = teacher_interface.check_course_interface(teacher_info['user'])
        if not flag:
            print(course_lis)
            break
        for index,course_name in enumerate(course_lis):
            print(f'编号: {index}   课程名: {course_name}')
        choice = input('请输入课程编号:').strip()
        if not choice.isdigit():
            print('输入有误')
            continue
        choice = int(choice)
        if choice not in range(len(course_lis)):
            print('输入编号有误!')
            continue
        choice_course = course_lis[choice]
        flag,student_lis = teacher_interface.check_student_interface(choice_course)
        if not flag:
            print(student_lis)
            break
        for index2, student_name in enumerate(student_lis):
            print(f'编号:{index2}   学生名: {student_name}')
        choice2 = input('请输入学生编号: ').strip()
        if not choice2.isdigit():
            print('输入有误')
            continue
        choice2 = int(choice2)
        if choice not in range(len(student_lis)):
            print('输入编号有误!')
            continue
        student_name = student_lis[choice2]
        score = input('请输入需要修改的成绩:').strip()
        if not score.isdigit():
            continue
        score = int(score)
        flag3, msg = teacher_interface.mark_score_interface(
            choice_course, student_name,
            score, teacher_info.get('user')
        )
        if flag3:
            print(msg)
            break

func_dic = {
    '1': ['登陆', login],
    '2': ['查看进行中课程', check_course],
    '3': ['选课', choose_course],
    '4': ['查看课程中学生', check_student],
    '5': ['为学生评分', mark_score],
    '6': ['退出教师界面', ]
}


def teacher_view():
    while True:
        print('欢迎老师'.center(30, '='))
        for i in func_dic:
            print(i, func_dic[i][0])
        cmd = input('请输入功能编号:').strip()
        if cmd not in func_dic:
            print('错误的输入,请重试')
            continue
        if cmd == '6':
            return
        func_dic[cmd][1]()

student.py

from interface import common_interface, student_interface
from lib import common

student_info = {'user': None}


def register():
    while True:
        account = input('请输入要注册的账号名:').strip()
        pwd = input('请输入密码:')
        re_pwd = input('请再次输入密码:')
        if pwd != re_pwd:
            print('两次密码输入不一致')
            continue
        flag, msg = common_interface.register_interface(account, pwd, 'student')
        if flag:
            print(msg)
            break
        else:
            print(msg)


def login():
    while True:
        account = input('请输入学生账号:')
        pwd = input('请输入密码:')
        flag, msg = common_interface.login_interface(account, pwd, 'student')
        if flag:
            print(msg)
            student_info['user'] = account
            break
        else:
            print(msg)


@common.login_auth('student')
def choose_course():
    while True:
        flag, course_lis = student_interface.get_course_list_interface(
            student_info.get('user')
        )
        if not flag:
            print(course_lis)
            break
        for index, school_name in enumerate(course_lis):
            print(f'编号: {index}   学校名: {school_name}')
        choice = input('请输入选择的学校编号: ').strip()
        if not choice.isdigit():
            print('请输入数字')
            continue
        choice = int(choice)
        if choice not in range(len(course_lis)):
            print('输入编号有误')
            continue
        course_name = course_lis[choice]
        flag, msg = student_interface.add_course_interface(
            course_name, student_info.get('user')
        )
        if flag:
            print(msg)
            break
        else:
            print(msg)


@common.login_auth('student')
def check_score():
    score_dict = student_interface.check_score_interface(
        student_info.get('user')
    )
    if not score_dict:
        print('没有选择课程!')
    print(score_dict)


@common.login_auth('student')
def choose_school():
    while True:
        flag, school_lis = common_interface.get_item_interface('School')
        if not flag:
            print(school_lis)
            break
        for index, school_name in enumerate(school_lis):
            print(f'编号: {index}   学校名: {school_name}')
        choice = input('请输入选择的学校编号: ').strip()
        if not choice.isdigit():
            print('输入有误')
            continue
        choice = int(choice)
        if choice not in range(len(school_lis)):
            print('输入编号有误!')
            continue
        school_name = school_lis[choice]
        flag, msg = student_interface.add_school_interface(
            school_name, student_info.get('user'))
        if flag:
            print(msg)
            break
        else:
            print(msg)
            break


func_dic = {
    '1': ['注册', register],
    '2': ['登陆', login],
    '3': ['选择校区', choose_school],
    '4': ['选择课程', choose_course],
    '5': ['查看分数', check_score],
    '6': ['退出学生界面', ]
}


def student_view():
    while True:
        print('欢迎同学'.center(30, '='))
        for i in func_dic:
            print(i, func_dic[i][0])
        cmd = input('请输入功能编号:').strip()
        if cmd not in func_dic:
            print('错误的输入,请重试')
            continue
        if cmd == '6':
            return
        func_dic[cmd][1]()

db

db_handler.py

import os,pickle
from conf import settings

def save(obj):
    class_name = obj.__class__.__name__
    dir_path = os.path.join(settings.DB_PATH,class_name)
    if not os.path.exists(dir_path):
        os.mkdir(dir_path)
    obj_path = os.path.join(dir_path,obj.name)
    with open(obj_path,'wb') as f:
        pickle.dump(obj,f)

def select(cls,name):
    class_name = cls.__name__
    obj_path = os.path.join(settings.DB_PATH,class_name,name)
    if os.path.exists(obj_path):
        with open(obj_path,'rb')as f:
            obj = pickle.load(f)
        return obj

moudles.py

from db import db_handler


class Base:
    def save(self):
        db_handler.save(self)

    @classmethod
    def select(cls, name):
        obj = db_handler.select(cls, name)
        return obj


class Admin(Base):
    def __init__(self, account, pwd):
        self.name = account
        self.password = pwd

    def create_school(self, school_name, school_addr):
        school_obj = School(school_name, school_addr)
        school_obj.save()

    def create_course(self, school_name, course_name, course_period):
        course_obj = Course(course_name, course_period)
        course_obj.save()
        school_obj = School.select(school_name)
        school_obj.school_course.append(course_name)
        school_obj.save()

    def create_teacher(selfs, teacher_name, teacher_pwd):
        teacher_obj = Teacher(teacher_name, teacher_pwd)
        teacher_obj.save()


class School(Base):
    def __init__(self, school_name, school_addr):
        self.name = school_name
        self.addr = school_addr
        self.school_course = []


class Course(Base):
    def __init__(self, course_name, course_period):
        self.name = course_name
        self.period = course_period
        self.student_lis = []


class Teacher(Base):
    def __init__(self, teacher_name, pwd):
        self.name = teacher_name
        self.password = pwd
        self.teacher_course = []

    def teacher_add_course(self, course):
        self.teacher_course.append(course)
        self.save()

    def teacher_mark_score(self, course_name, student_name, score):
        student_obj = Student.select(student_name)
        student_obj.score[course_name] = score
        student_obj.save()


class Student(Base):
    def __init__(self, student_name, pwd):
        self.name = student_name
        self.password = pwd
        self.school = None
        self.score = {}
        self.student_course = []

    def student_add_course(self, course_name):
        self.student_course.append(course_name)
        self.score[course_name] = 0
        self.save()
        course_obj = Course.select(course_name)
        course_obj.student_lis.append(self.name)
        course_obj.save()

    def student_choose_school(self, school_name):
        self.school = school_name
        self.save()

interface

admin_interface.py

from db import moudles

def create_school_interface(school_name,school_addr,admin):
    school = moudles.School.select(school_name)
    if school:
        return False,'学校已被创建'
    admin_obj = moudles.Admin.select(admin)
    admin_obj.create_school(school_name,school_addr)
    return True,'创建成功'

def create_course_interface(school_name,course_name,period,admin):
    course = moudles.Course.select(course_name)
    if course:
        return False,'课程已经创建'
    admin_obj = moudles.Admin.select(admin)
    admin_obj.create_course(school_name,course_name,period)
    return True,'创建成功'

def create_teacher_interface(teacher_name, teacher_pwd, admin):
    teacher = moudles.Teacher.select(teacher_name)
    if teacher:
        return False, f'[{teacher_name}]账户名已经被使用,请重新输入'
    admin_obj = moudles.Admin.select(admin)
    admin_obj.create_teacher(teacher_name, teacher_pwd)
    return True, f'[{teacher_name}]老师账户创建成功'

student_interface.py

from db import moudles


def add_school_interface(school_name, student_name):
    student_obj = moudles.Student.select(student_name)
    if student_obj.school:
        return False, '当前学生已经选择过学校了!'
    student_obj.student_choose_school(school_name)
    return True, '选择学校成功!'


def get_course_list_interface(student_name):
    student_obj = moudles.Student.select(student_name)
    school_name = student_obj.school
    if not school_name:
        return False, '没有学校,请先选择学校'
    school_obj = moudles.School.select(school_name)
    course_lis = school_obj.school_course
    if not course_lis:
        return False, '没有课程,请先联系管理员创建'
    return True, course_lis


def add_course_interface(course_name, student_name):
    student_obj = moudles.Student.select(student_name)
    if course_name in student_obj.student_course:
        return False, '该课程已经选择过了'
    student_obj.student_add_course(course_name)
    return True, f'[{course_name}] 课程添加成功!'


def check_score_interface(student_name):
    student_obj = moudles.Student.select(student_name)
    if student_obj.score:
        return student_obj.score

teacher_interface.py

from db import moudles


def choose_course_interface(course_name, teacher):
    teacher_obj = moudles.Teacher.select(teacher)
    if course_name in teacher_obj.teacher_course:
        return False, '课程已存在,请勿重复选择'
    teacher_obj.teacher_add_course(course_name)
    return True, '选择成功'


def check_course_interface(teacher):
    teacher_obj = moudles.Teacher.select(teacher)
    teacher_course = teacher_obj.teacher_course
    if teacher_course:
        return True, teacher_course
    else:
        return False, '当前没有教授的课程'


def check_student_interface(course):
    course_obj = moudles.Course.select(course)
    course_student = course_obj.student_lis
    if course_student:
        return True, course_student
    else:
        return False, '当前课程下没有学生'

def mark_score_interface(course_name,student_name,score,teacher):
    teacher_obj = moudles.Teacher.select(teacher)
    teacher_obj.teacher_mark_score(course_name, student_name, score)
    return True,'打分成功'

common_interface.py

import os
from db import db_handler, moudles
from conf import settings


def login_interface(account, pwd, account_type):
    obj = None
    if account_type == 'admin':
        obj = moudles.Admin.select(account)
    elif account_type == 'student':
        obj = moudles.Student.select(account)
    elif account_type == 'teacher':
        obj = moudles.Teacher.select(account)
    if not obj:
        return False,'用户不存在'
    if obj.password == pwd:
        return True, '登陆成功'
    else:
        return False, '密码错误,请重试'


def register_interface(account, pwd, account_type):
    if account_type == 'admin':
        obj = moudles.Admin.select(account)
        if obj:
            return False, '账号已被注册'
        obj = moudles.Admin(account, pwd)
        obj.save()
        return True, '注册成功'

    if account_type == 'student':
        obj = moudles.Student.select(account)
        if obj:
            return False, '账号已被注册'
        obj = moudles.Student(account, pwd)
        obj.save()
        return True, '注册成功'


def get_item_interface(dirname):
    dir_path = os.path.join(settings.DB_PATH, dirname)
    if not os.path.exists(dir_path):
        return False, '该目录不存在'
    iten_lis = os.listdir(dir_path)
    return True, iten_lis


def get_course_interface(school_name):
    school_obj = moudles.School.select(school_name)
    course_lis = school_obj.school_course
    if course_lis:
        return True,course_lis
    return False,'学校还未创建课程'

lib

common.py

def login_auth(account_type):
    from core import admin, teacher, student
    def outter(func):
        def inner(*args, **kwargs):
            if account_type == 'admin':
                if not admin.admin_info['user']:
                    print('使用管理员功能之前,请先登陆')
                    admin.login()
            elif account_type == 'teacher':
                if not teacher.teacher_info['user']:
                    print('使用教师功能之前,请先登陆')
                    teacher.login()
            elif account_type == 'student':
                if not student.student_info['user']:
                    print('使用学生功能之前,请先登陆')
                    student.login()
            res = func(*args, **kwargs)
            return res

        return inner

    return outter

conf

settings.py

import os

BASE_PATH = os.path.dirname(os.path.dirname(__file__))

DB_PATH = os.path.join(BASE_PATH,'db')
posted @ 2020-04-19 01:41  黑猫警长紧张  阅读(99)  评论(0)    收藏  举报