作业要求:选课系统
角色:学校、学生、课程、讲师 ----四个类定义
要求:
1. 创建北京、上海 2 所学校
-----创建学校功能,School学校类产生学校对象
1)学校包含学校名称,地址等属性
----------学校类属性-对象自定义属性
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
-----课程类产生课程对象,三个课程对象
2) 课程包含课程名称(周期,价格等属性)
----------课程类属性-对象自定义属性
管理员视图:3. 管理员创建学校,老师,课程
-----管理员功能,控制对象产生
学生视图:4. 可以注册,学生注册登录后,可以选择学校,选择课程,查看成绩
----------学生对象绑定学校和课程
老师视图:5. 老师登录后,可以查看教授课程,选择想要教授的课程,查看课程下的学生,修改学生成绩等
----------老师对象绑定学校和课程,修改学生成绩功能
上面的操作产生的数据都通过pickle序列化保存到文件里,可以帮我们保存对象。
1.需求分析
管理视图,创建讲师, 创建班级,创建课程
1、注册
2、登录
3、创建学校
4、创建老师
5、创建课程(先选择学校)
学生视图
1、注册
2、登录
3、选择校区
4、选择课程
学生选择课程,课程选择学生,双向选择。
5、查看成绩
老师视图
1、登录
2、查看教授课程
3、选择教授课程
4、查看课程下学生
5、修改学生成绩
2.程序的架构设计
-三层架构
-用户视图层(web框架:MVC,MVVT)
用于与用户进行交互
小的逻辑判断,比如注册功能中两次密码是否一致的校验
core
-src.py 主视图
-admin视图
-student视图
-teacher视图
-逻辑接口层
核心业务逻辑处理
interface
-admin.py
-student.py
-teacher.py
-做数据处理,比如数据的增、删、查、改
db
-db_handler.py
-models.py(存放所有类)
3.分任务开发
4.测试
5.线上
总共分三个视图:
管理员视图:
def admin_register():
pass
def admin_login():
pass
def creat_school():
pass
def creat_teacher():
pass
def creat_course():
pass
老师视图:
def teacher_login():
pass
def check_course():
pass
def choose_course():
pass
def check_student():
pass
def modify_score():
pass
学生视图:
def student_register():
pass
def student_login():
pass
def choose_school():
pass
def choose_course():
pass
def check_score():
pass
conf放置配置信息setting
core:放置用户层视图
db:数据操作层py文件和以文件形式保存的数据
interface:放置接口相关信息,有管理员接口,老师接口,学校接口,学生接口和公共接口
lib:放置公共方法
用户功能层:src下:
src:主视图,
admin:管理员视图,
student:学生视图
teacher:老师视图
接口层:interface下:
admin_interface管理员的接口
common_interface公共的接口
school_interface学校的接口
student_interface学生的接口
teacher_interface老师的接口
数据层:db目录下:
db_handler,文件操作相关的方法
models:各种类及类方法的定义
其它目录:admin,course,school,student,teacher是自动生成的目录,用来存放数据信息
start.py启动文件
1.start.py
import os
import sys
sys.path.append(os.path.dirname(__file__))
from core import src
if __name__ == '__main__':
src.run()
2.src.py
'''
这是用户视图层主视图
'''
from core import admin, student, teacher
func_dic = {
'1': admin.admin_view,
'2': student.student_view,
'3': teacher.teacher_view,
}
def run():
while True:
print('''
=======欢迎来到选课系统=======
1.管理员功能
2.学生功能
3.老师功能
============end============''')
choice = input('请输入功能编号:').strip()
if choice not in func_dic:
print('输入有误,请重新输入:')
continue
func_dic[choice]()
3.admin.py
'''
管理员视图
'''
from interface import admin_interface
from interface import common_interface
from lib import common
admin_info = {
'user': None
}
def register():
while True:
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
repassword = input('请确认密码:').strip()
if password == repassword:
flag, msg = admin_interface.admin_register_interface(username, password)
if flag:
print(msg)
break
else:
print(msg)
else:
print('两次密码不一致,请重新输入!')
def login():
while True:
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
flag, msg = common_interface.login_interface(
username, password,user_type='admin')
if flag:
print(msg)
admin_info['user'] = username
break
else:
print(msg)
@common.auth('admin')
def create_school():
while True:
school_name = input('请输入学校名称:').strip()
school_addr = input('请输入学校地址:').strip()
flag, msg = admin_interface.create_school_interface(
school_name, school_addr, admin_info['user'])
if flag:
print(msg)
break
else:
print(msg)
@common.auth('admin')
def create_course():
while True:
flag, school_list_or_msg = common_interface.get_all_school_interface()
if not flag:
print(school_list_or_msg)
break
for index, school_name in enumerate(school_list_or_msg):
print(f'编号:{index} 学校名:{school_name}')
choice = input('请输入学校编号:').strip()
if not choice.isdecimal():
print('请输入数字')
continue
choice = int(choice)
if choice not in range(len(school_list_or_msg)):
print('请输入正确编号!')
school_name = school_list_or_msg[choice]
course_name = input('请输入需要创建的课程名称:').strip()
flag, msg = admin_interface.create_course_interface(school_name, course_name, admin_info['user'])
if flag:
print(msg)
break
else:
print(msg)
@common.auth('admin')
def create_teacher():
while True:
teacher_name = input('请输入老师的名字:').strip()
flag, msg = admin_interface.create_teacher_interface(
teacher_name, 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,
}
def admin_view():
while True:
print('''
1、注册
2、登录
3、创建学校
4、创建课程
5、创建老师
''')
choice = input('请输入功能编号:').strip()
if choice == 'q':
break
if choice not in func_dic:
print('输入有误,请重新输入:')
continue
func_dic[choice]()
4.admin_interface.py
'''
管理员注册接口
'''
from db import model
def admin_register_interface(username, password):
admin_obj = model.Admin.select(username)
if admin_obj:
return False, '用户已存在!'
else:
admin_obj = model.Admin(username, password)
admin_obj.save()
return True, '用户注册成功!'
#修改为通用接口
# def admin_login_interface(username, password):
# admin_obj = model.Admin.select(username)
# if not admin_obj:
# return False, '用户不存在!'
# if password == admin_obj.password:
# return True, '登录成功!'
# else:
# return False, '密码错误!'
def create_school_interface(school_name, school_addr, admin_info):
school_obj = model.School.select(school_name)
admin_obj = model.Admin.select(admin_info)
if school_obj:
return False, '学校已存在!'
else:
school_obj = admin_obj.create_school(school_name, school_addr)
school_obj.save()
return True, f'{school_name}学校建立成功!'
def create_course_interface(school_name, course_name, admin_name):
school_obj = model.School.select(school_name)
if course_name in school_obj.course_list:
return False, '当前课程已存在!'
admin_obj = model.Admin.select(admin_name)
admin_obj.create_course(school_obj, course_name)
return True, f'{course_name}课程创建成功,绑定给{school_name}校区'
def create_teacher_interface(teacher_name, admin_name, teacher_pwd=123):
teacher_obj = model.Teacher.select(teacher_name)
if teacher_obj:
return False, '老师已存在!'
admin_obj = model.Admin.select(admin_name)
admin_obj.create_teacher(teacher_name, teacher_pwd)
return True, f'{teacher_name}老师创建成功!'
5.model.py
'''
用于存放类 学校类、学员类、课程类、讲师类、管理员类
'''
from db import db_handler
class Base:
@classmethod
def select(cls, username):
obj = db_handler.select_data(cls, username)
return obj
def save(self):
db_handler.save_data(self)
class Admin(Base):
def __init__(self, username, password):
self.user = username
self.password = password
def create_school(self, school_name, school_addr):
school_obj = School(school_name, school_addr)
return school_obj
def create_course(self, school_obj, course_name):
course_obj = Course(course_name)
course_obj.save()
school_obj.course_list.append(course_name)
school_obj.save()
def create_teacher(self, 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.user = school_name
self.addr = school_addr
self.course_list = []
class Student(Base):
def __init__(self, username, password):
self.user = username
self.password = password
self.school = None
self.course_list = []
self.score_dict = {}
def add_school(self, school_name):
self.school = school_name
self.save()
def add_course(self, course_name):
self.course_list.append(course_name)
self.score_dict[course_name] = 0
self.save()
course_obj = Course.select(course_name)
course_obj.student_list.append(self.user)
course_obj.save()
class Course(Base):
def __init__(self, course_name):
self.user = course_name
self.student_list = []
class Teacher(Base):
def __init__(self, teacher_name, teacher_pwd):
self.user = teacher_name
self.password = teacher_pwd
self.course_list = []
def show_course(self):
return self.course_list
def add_course(self, course_name):
self.course_list.append(course_name)
self.save()
def get_student(self, course_name):
course_obj = Course.select(course_name)
return course_obj.student_list
def change_score(self,course_name,student_name,score):
student_obj = Student.select(student_name)
student_obj.score_dict[course_name]=score
student_obj.save()
6.db_handler.py
import pickle
import os
from conf import settings
def save_data(obj):
class_name = obj.__class__.__name__
user_dir_path = os.path.join(
settings.db_path, class_name
)
if not os.path.exists(user_dir_path):
os.mkdir(user_dir_path)
user_path = os.path.join(user_dir_path, obj.user)
with open(user_path, mode='wb')as f:
pickle.dump(obj, f)
def select_data(cls, username):
class_name = cls.__name__
user_dir_path = os.path.join(
settings.db_path, class_name
)
if not os.path.exists(user_dir_path):
os.mkdir(user_dir_path)
user_path = os.path.join(user_dir_path, username)
if os.path.exists(user_path):
with open(user_path, mode='rb')as f:
obj = pickle.load(f)
return obj
return None
7.settings
import os
import sys
base_path = os.path.dirname(os.path.dirname(__file__))
db_path = os.path.join(base_path, 'db')
8.common
'''
公共方法
'''
# 登录认证装饰器
def auth(role):
'''
:param role: 角色:管理员、老师,学生
:return:
'''
from core import admin, teacher, student
def login_auth(func):
def wrapper(*args, **kwargs):
if role == 'admin':
if admin.admin_info['user']:
res = func(*args, **kwargs)
return res
else:
admin.login()
elif role == 'student':
if student.student_info['user']:
res = func(*args, **kwargs)
return res
else:
student.login()
elif role == 'teacher':
if teacher.teacher_info['user']:
res = func(*args, **kwargs)
return res
else:
teacher.login()
else:
print('当前视图没有权限!')
return wrapper
return login_auth
9.student
'''
学生视图
'''
from lib import common
from interface import student_interface
from interface import common_interface
student_info = {
'user': None
}
def register():
while True:
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
repassword = input('请确认密码:').strip()
if password == repassword:
flag, msg = student_interface.student_register_interface(username, password)
if flag:
print(msg)
break
else:
print(msg)
else:
print('两次密码不一致,请重新输入!')
def login():
while True:
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
flag, msg = common_interface.login_interface(
username, password, user_type='student')
if flag:
print(msg)
student_info['user'] = username
break
else:
print(msg)
break
@common.auth('student')
def choice_school():
while True:
flag, school_list_or_msg = common_interface.get_all_school_interface()
if not flag:
print(school_list_or_msg)
break
for index, school_name in enumerate(school_list_or_msg):
print(f'编号:{index} 学校名:{school_name}')
choice = input('请输入学校编号:').strip()
if not choice.isdecimal():
print('请输入数字')
continue
choice = int(choice)
if choice not in range(len(school_list_or_msg)):
print('请输入正确编号!')
continue
school_name = school_list_or_msg[choice]
flag, msg = student_interface.add_school_interface(
school_name, student_info['user'])
if flag:
print(msg)
break
else:
print(msg)
break
@common.auth('student')
def choice_course():
while True:
flag, course_list = student_interface.get_course_list_interface(student_info['user'])
if not flag:
print(course_list)
break
for index, school_name in enumerate(course_list):
print(f'编号:{index} 课程名:{school_name}')
choice = input('请输入课程编号:').strip()
if not choice.isdecimal():
print('请输入数字')
continue
choice = int(choice)
if choice not in range(len(course_list)):
print('请输入正确编号!')
continue
course_name = course_list[choice]
flag, msg = student_interface.add_course_interface(
course_name, student_info['user'])
if flag:
print(msg)
break
else:
print(msg)
break
@common.auth('student')
def check_score():
score_dict= student_interface.check_score_interface(
student_info['user'])
if not score_dict:
print('没有选择课程!')
print(score_dict)
func_dic = {
'1': register,
'2': login,
'3': choice_school,
'4': choice_course,
'5': check_score,
}
def student_view():
while True:
print('''
1、注册
2、登录
3、选择校区
4、选择课程
5、查看成绩
''')
choice = input('请输入功能编号:').strip()
if choice == 'q':
break
if choice not in func_dic:
print('输入有误,请重新输入:')
continue
func_dic[choice]()
10.student_interface
'''
学生接口层
'''
from db import model
def student_register_interface(username, password):
student_obj = model.Student.select(username)
if student_obj:
return False, '学生用户已存在!'
else:
student_obj = model.Student(username, password)
student_obj.save()
return True, '用户注册成功!'
# 修改为通用接口
# def student_login_interface(username, password):
# student_obj = model.Student.select(username)
# if not student_obj:
# return False, '用户不存在!'
# if password == student_obj.password:
# return True, '登录成功!'
# else:
# return False, '密码错误!'
def add_school_interface(school_name, student_name):
student_obj = model.Student.select(student_name)
if student_obj.school:
return False, '当前学生已经选择过学校!!'
else:
student_obj.add_school(school_name)
return True, '选择学校成功!'
def get_course_list_interface(student_name):
student_obj = model.Student.select(student_name)
school_name = student_obj.school
if student_obj.school:
school_obj = model.School.select(school_name)
if school_obj.course_list:
return True, school_obj.course_list
else:
return False, '没有课程,请先联系管理员创建'
else:
return False, '没有学校,请先选择学校!'
def add_course_interface(course_name, student_name):
student_obj = model.Student.select(student_name)
if course_name in student_obj.course_list:
return False, '当前学生已经选择过该课程!!'
else:
student_obj.add_course(course_name)
return True, f'课程{course_name}添加成功!'
def check_score_interface(student_name):
student_obj = model.Student.select(student_name)
if student_obj.score_dict:
return student_obj.score_dict
11.teacher
'''
老师视图
'''
from lib import common
from interface import common_interface
from interface import teacher_interface
teacher_info = {
'user': None
}
def login():
while True:
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
flag, msg = common_interface.login_interface(
username, password, user_type='teacher')
if flag:
print(msg)
teacher_info['user'] = username
break
else:
print(msg)
@common.auth('teacher')
def check_course():
flag, course_list = teacher_interface.check_course_interface(
teacher_info['user'])
if flag:
print(course_list)
else:
print(course_list)
@common.auth('teacher')
def choose_course():
while True:
flag, school_list_or_msg = common_interface.get_all_school_interface()
if not flag:
print(school_list_or_msg)
break
for index, school_name in enumerate(school_list_or_msg):
print(f'编号:{index} 学校名:{school_name}')
choice = input('请输入学校编号:').strip()
if not choice.isdecimal():
print('请输入数字')
continue
choice = int(choice)
if choice not in range(len(school_list_or_msg)):
print('请输入正确编号!')
continue
school_name = school_list_or_msg[choice]
flag2, course_list = common_interface.get_course_in_school_interface(school_name)
if not flag2:
print(course_list)
break
for index2, course_name in enumerate(course_list):
print(f'编号:{index2} 课程名:{course_name}')
choice2 = input('请输入课程编号:').strip()
if not choice2.isdecimal():
print('请输入数字')
continue
choice2 = int(choice2)
if choice2 not in range(len(course_list)):
print('请输入正确编号!')
continue
course_name = course_list[choice2]
flag3, msg = teacher_interface.add_course_interface(course_name, teacher_info['user'])
if flag3:
print(msg)
break
else:
print(msg)
@common.auth('teacher')
def check_student():
while True:
flag, course_list = teacher_interface.check_course_interface(
teacher_info['user'])
if not flag:
print(course_list)
break
for index, course_name in enumerate(course_list):
print(f'编号:{index} 课程名:{course_name}')
choice = input('请输入课程编号:').strip()
if not choice.isdecimal():
print('请输入数字')
continue
choice = int(choice)
if choice not in range(len(course_list)):
print('请输入正确编号!')
continue
course_name = course_list[choice]
flag2, student_list = teacher_interface.get_student_interface(course_name, teacher_info['user'])
if flag2:
print(student_list)
break
else:
print(student_list)
break
@common.auth('teacher')
def change_score():
while True:
flag, course_list = teacher_interface.check_course_interface(
teacher_info['user'])
if not flag:
print(course_list)
break
for index, course_name in enumerate(course_list):
print(f'编号:{index} 课程名:{course_name}')
choice = input('请输入课程编号:').strip()
if not choice.isdecimal():
print('请输入数字')
continue
choice = int(choice)
if choice not in range(len(course_list)):
print('请输入正确编号!')
continue
course_name = course_list[choice]
flag2, student_list = teacher_interface.get_student_interface(course_name, teacher_info['user'])
if not flag2:
print(student_list)
break
for index2, student_list in enumerate(student_list):
print(f'编号{index2} 学生名:{student_list}')
choice2 = input('请输入学生编号:').strip()
if not choice2.isdecimal():
print('请输入数字')
continue
choice2 = int(choice2)
if choice2 not in range(len(student_list)):
print('请输入正确编号!')
continue
student_name = student_list[choice2]
score = input('请输入需要修改的成绩:').strip()
if not score.isdecimal():
continue
score = int(score)
flag3, msg = teacher_interface.change_score_interface(
course_name, student_name, score, teacher_info['user'])
if flag3:
print(msg)
break
func_dic = {
'1': login,
'2': check_course,
'3': choose_course,
'4': check_student,
'5': change_score,
}
def teacher_view():
while True:
print('''
1、登录
2、查看教授课程
3、选择教授课程
4、查看课程学生
5、修改学生成绩
''')
choice = input('请输入功能编号:').strip()
if choice == 'q':
break
if choice not in func_dic:
print('输入有误,请重新输入:')
continue
func_dic[choice]()
12.teacher_interface
'''
老师接口层
'''
from db import model
def check_course_interface(teacher_name):
teacher_obj = model.Teacher.select(teacher_name)
# course_list = teacher_obj.course_list
course_list = teacher_obj.show_course()
if not course_list:
return False, '老师没有选择课程'
return True, course_list
def add_course_interface(course_name, teacher_name):
teacher_obj = model.Teacher.select(teacher_name)
course_list = teacher_obj.course_list
if course_name in course_list:
return False, '该课程已存在!'
teacher_obj.add_course(course_name)
return True, '添加课程成功!'
def get_student_interface(course_name, teacher_name):
teacher_obj = model.Teacher.select(teacher_name)
student_list = teacher_obj.get_student(course_name)
if not student_list:
return False,'学生没有选择该课程!'
return True,student_list
def change_score_interface(
course_name,student_name,score,teacher_name):
teacher_obj = model.Teacher.select(teacher_name)
teacher_obj.change_score(course_name,student_name,score)
return True,'修改分数成功!'
13.common_interface
'''
公共接口
'''
import os
from conf import settings
from db import model
def get_all_school_interface():
school_dir = os.path.join(settings.db_path, 'School')
if not os.path.exists(school_dir):
return False, '没有学校,请先联系管理员!'
school_list = os.listdir(school_dir)
return True, school_list
def login_interface(username, password, user_type):
if user_type == 'admin':
obj = model.Admin.select(username)
elif user_type == 'student':
obj = model.Student.select(username)
elif user_type == 'teacher':
obj = model.Teacher.select(username)
else:
return False, '登录角色不对,请输入正确的角色'
if obj:
if password == obj.password:
return True, '登录成功!'
else:
return False, '密码错误!'
else:
return False, '用户不存在!'
def get_course_in_school_interface(school_name):
school_obj = model.School.select(school_name)
course_list = school_obj.course_list
if not course_list:
return False, '该学校没有课程!'
return True, course_list