面向对象练习:选课系统
需求
- 管理员视图
- 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')