一、作业需求
readme
作业要求:选课系统
角色:学校、学生、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 管理员创建学校 ,老师,课程
4. 课程包含课程名称(周期,价格等属性)
5. 学校包含学校名称,地址等属性
6. 创建老师角色要关联学校
7. 学生注册登录后,可以选择学校,选择课程,查看成绩
8. 老师登录后,可以查看教授课程,选择想要教授的课程,查看课程下的学生,修改学生成绩等
最终分为以下视图和功能:
1 学生视图
1、注册
2、登录
3、选择校区
4、选择课程
5、查看成绩
2 老师视图
1、登录
2、查看教授课程
3、选择教授课程
4、查看课程下学生
5、修改学生成绩
3 管理视图,创建讲师, 创建班级,创建课程
1、注册
2、登录
3、创建学校
4、创建老师
5、创建课程
上面的操作产生的数据都通过pickle序列化保存到文件里
总共分三个视图:
管理员视图:
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启动文件
二、项目根目录文件一览
start
import os
import sys
from core import src
base_path = os.path.dirname(__file__)
sys.path.append(base_path)
if __name__ == '__main__':
src.run()
conf
settings
import os
base_path = os.path.dirname(os.path.dirname(__file__))
db_path = os.path.join(base_path, 'db')
core
src
from core.student import student_view
from core.teacher import teacher_view
from core.admin import admin_view
dic = {'1': student_view,
'2': teacher_view,
'3': admin_view}
def run():
while True:
print('''
'1': student_view
'2': teacher_view
'3': admin_view
'0': exit''')
choice = input('请输入功能编号:').strip()
if choice == '0':
print('已退出')
break
if choice not in dic:
print('请输入正确功能编号')
continue
dic[choice]()
admin
from lib.common import login_info
from interface import admin_interface, common_interface
admin_info = {'user': None}
def admin_login():
print('管理员登入')
name = input('请输入账号:').strip()
pwd = input('请输入密码:').strip()
flag, msg = common_interface.login_interface(name, pwd, 'admin')
if flag:
print(msg)
admin_info['user'] = name
else:
print(msg)
def admin_register():
print('管理员注册')
name = input('请输入账号:').strip()
pwd = input('请输入密码:').strip()
flag, msg = admin_interface.register_interface(name, pwd)
if flag:
print(msg)
else:
print(msg)
@login_info(user='admin')
def create_school():
print('创建学校')
school_name = input('请输入校名:').strip()
school_addr = input('请输入地址:').strip()
flag, msg = admin_interface.create_school_interface(school_name, school_addr)
if flag:
print(msg)
else:
print(msg)
@login_info(user='admin')
def create_teacher():
print('创建老师账号')
name = input('设置用户名:').strip()
pwd = input('设置密码:').strip()
flag, msg = admin_interface.create_teacher_interface(name, pwd)
if flag:
print(msg)
else:
print(msg)
@login_info(user='admin')
def create_course():
print('创建课程')
school_list = admin_interface.check_all_school()
for i, school in enumerate(school_list):
print(f'{i} {school}')
choice = input('请输学校编号:').strip()
if choice.isdigit():
if 0 <= int(choice) < len(school_list):
course_name = input('输入课程名称:').strip()
school_name = school_list[int(choice)]
flag, msg = admin_interface.create_course_interface(school_name,course_name)
if flag:
print(msg)
else:
print(msg)
else:
print('请输入正确功能编号')
else:
print('请输入数字')
dic = {
'1': admin_login,
'2': admin_register,
'3': create_school,
'4': create_teacher,
'5': create_course,
}
def admin_view():
while True:
print('''
'1': admin_login
'2': admin_register
'3': create_school
'4': create_teacher
'5': create_course
'0': exit
''')
choice = input('请输入功能编号:').strip()
if choice == '0':
print('已退出')
break
if choice not in dic:
print('请输入正确功能编号')
continue
dic[choice]()
teacher
from lib.common import login_info
from interface import common_interface, teacher_interface
teacher_info = {'user': None}
def teacher_login():
name = input('请输入姓名:').strip()
pwd = input('请输入密码:').strip()
flag, msg = common_interface.login_interface(name, pwd, 'teacher')
if flag:
print(msg)
teacher_info['user'] = name
else:
print(msg)
@login_info(user='teacher')
def check_course():
print('查看教授的课程')
course_list = teacher_interface.get_course_list_interface(teacher_info['user'])
if course_list:
for i, course in enumerate(course_list):
print(f'{i} {course}')
else:
print('您还没有选课')
@login_info(user='teacher')
def choose_course():
course_list = teacher_interface.get_all_course()
if course_list:
for i, course in enumerate(course_list):
print(f'{i} {course}')
choice = input('请输入课程编号:').strip()
if choice.isdigit():
if 0 <= int(choice) < len(course_list):
msg = teacher_interface.choose_course_interface(teacher_info['user'], course_list[int(choice)])
print(msg)
else:
print('请输入正确编号')
else:
print('请输入数字类型')
else:
print('暂无可挑选课程,请联系管理员')
@login_info(user='teacher')
def check_student():
print('查看课程下学生')
course_list = teacher_interface.get_course_list_interface(teacher_info['user'])
if course_list:
for i, course in enumerate(course_list):
print(f'{i} {course}')
choice = input('请输入课程编号:').strip()
if choice.isdigit():
if 0 <= int(choice) < len(course_list):
student_list = teacher_interface.check_students_course(course_list[int(choice)])
if student_list:
for i, student in enumerate(student_list):
print(f'{i} {student}')
else:
print('该课程下没有学生')
else:
print('请输入正确编号')
else:
print('请输入数字类型')
else:
print('您还没有选课')
@login_info(user='teacher')
def modify_score():
print('为学生评分')
course_list = teacher_interface.get_course_list_interface(teacher_info['user'])
if course_list:
for i, course in enumerate(course_list):
print(f'{i} {course}')
choice = input('请输入课程编号:').strip()
if choice.isdigit():
if 0 <= int(choice) < len(course_list):
student_list = teacher_interface.check_students_course(course_list[int(choice)])
if student_list:
for i, student in enumerate(student_list):
print(f'{i} {student}')
choice1 = input('请输入学生编号:').strip()
if choice1.isdigit():
if 0 <= int(choice1) < len(student_list):
score = input('请打分(后期可有修改):').strip()
msg = teacher_interface.change_score_interface(
student_list[int(choice1)], score, course_list[int(choice)])
print(msg)
else:
print('请输正确编号')
else:
print('请输入数字类型')
else:
print('该课程下没有学生')
else:
print('请输入正确编号')
else:
print('请输入数字类型')
dic = {
'1': teacher_login,
'2': check_course,
'3': choose_course,
'4': check_student,
'5': modify_score,
}
def teacher_view():
while True:
print('''
'1': teacher_login
'2': check_course
'3': choose_course
'4': check_student
'5': modify_score
'0': exit
''')
choice = input('请输入功能编号:').strip()
if choice == '0':
print('已退出')
break
if choice not in dic:
print('请输入正确功能编号')
continue
dic[choice]()
student
from interface import student_interface, common_interface, admin_interface
from lib.common import login_info
student_info = {'user': None}
def student_login():
print('学生登入')
name = input('请输入账号:').strip()
pwd = input('请输入密码:').strip()
flag, msg = common_interface.login_interface(name, pwd, 'student')
if flag:
print(msg)
student_info['user'] = name
else:
print(msg)
def student_register():
print('学生注册')
name = input('请输入账号:').strip()
pwd = input('请输入密码:').strip()
flag, msg = student_interface.register_interface(name, pwd)
if flag:
print(msg)
else:
print(msg)
@login_info(user='student')
def choose_school():
print('选择学校')
school_list = admin_interface.check_all_school()
for i, school in enumerate(school_list):
print(f'{i} {school}')
choice = input('请输入学校编号:').strip()
if choice.isdigit():
if 0 <= int(choice) < len(school_list):
flag, msg = student_interface.choose_school_interface(student_info['user'],school_list[int(choice)])
if flag:
print(msg)
else:
print(msg)
else:
print('请输入正确编号')
else:
print('请输入数字类型')
@login_info(user='student')
def choose_course():
print('选择课程')
flag, course_list = student_interface.get_choose_course_interface(student_info['user'])
if flag:
if course_list:
for i, course in enumerate(course_list):
print(f'{i} {course}')
choice = input('请输入课程编号:').strip()
if choice.isdigit():
if 0 <= int(choice) < len(course_list):
msg = student_interface.choose_course_interface(student_info['user'],course_list[int(choice)])
print(msg)
else:
print('请输入正确编号')
else:
print('请输入数字类型')
else:
print('课程暂未上传,请联系管理员')
else:
print(course_list)
@login_info(user='student')
def check_score():
print('查看分数')
course_list = student_interface.get_by_course_interface(student_info['user'])
if course_list:
for i, course in enumerate(course_list):
print(f'{i} {course}')
choice = input('请输出课程编号:').strip()
if choice.isdigit():
if 0 <= int(choice) < len(course_list):
score = student_interface.check_score_interface(student_info['user'], course_list[int(choice)])
if score:
print(f'当前科目分数为{score}')
else:
print('分数未出')
else:
print('请输入正确编号')
else:
print('请输入数字')
else:
print('您还没选择课程')
dic = {
'1': student_login,
'2': student_register,
'3': choose_school,
'4': choose_course,
'5': check_score,
'0': exit
}
def student_view():
while True:
print('''
'1': student_login
'2': student_register
'3': choose_school
'4': choose_course
'5': check_auth
'0': exit
''')
choice = input('请输入功能编号:').strip()
if choice == '0':
print('已退出')
break
if choice not in dic:
print('请输入正确功能编号')
continue
dic[choice]()
db
db_handler
import pickle
import os
from conf import settings
def save(obj):
name = obj.__class__.__name__.lower()
path = os.path.join(settings.db_path, name)
if not os.path.isdir(path):
os.mkdir(path)
obj_path = os.path.join(path, obj.name)
with open(obj_path, 'wb') as f:
pickle.dump(obj, f)
f.flush()
def select(name, type_str):
path = os.path.join(settings.db_path, type_str)
if not os.path.exists(path):
os.mkdir(path)
obj_path = os.path.join(path, name)
if os.path.exists(obj_path):
with open(obj_path, 'rb') as f:
obj = pickle.load(f)
return obj
models
from db import db_handler
class Baseclass:
def save(self):
db_handler.save(self)
@classmethod
def get_obj_name(cls, name):
type_str = cls.__name__.lower()
return db_handler.select(name, type_str)
class Student(Baseclass):
def __init__(self, name, pwd):
self.name = name
self.pwd = pwd
self.school = None
self.course_list = []
self.score = {}
def choose_school(self, school_name):
self.school = school_name
class Admin(Baseclass):
def __init__(self, name, pwd):
self.name = name
self.pwd = pwd
class Teacher(Baseclass):
def __init__(self, name, pwd):
self.name = name
self.pwd = pwd
self.course_list = []
class School(Baseclass):
def __init__(self, school_name, school_addr):
self.name = school_name
self.addr = school_addr
self.course_list = []
def add_course(self, course):
self.course_list.append(course)
class Course(Baseclass):
def __init__(self, name):
self.name = name
self.student_list = []
interface
admin_interface
from db import models
import os
from conf import settings
from lib import common
def register_interface(name, pwd):
obj = models.Admin.get_obj_name(name)
if obj:
return False, '用户已存在'
obj = models.Admin(name, pwd)
obj.save()
return True, '注册成功'
def create_school_interface(name, addr):
obj = models.School.get_obj_name(name)
if obj:
return False, '用户已存在'
obj = models.School(name, addr)
obj.save()
return True, '创建成功'
def create_teacher_interface(name, pwd):
obj = models.Teacher.get_obj_name(name)
if obj:
return False, '当前账户已存在'
obj = models.Teacher(name, pwd)
obj.save()
return True, '成功创建账户'
def check_all_school():
path = os.path.join(settings.db_path, 'school')
return common.get_all_filename(path)
def create_course_interface(s_name, c_name):
obj = models.Course.get_obj_name(c_name)
if obj:
return False, '已存在该课程'
obj = models.Course(c_name)
obj.save()
school_obj = models.School.get_obj_name(s_name)
school_obj.add_course(c_name)
school_obj.save()
return True, '创建课程成功'
teacher_interface
from db import models
from conf import settings
from lib import common
import os
def get_all_course():
path = os.path.join(settings.db_path, 'course')
return common.get_all_filename(path)
def choose_course_interface(name, c_name):
obj = models.Teacher.get_obj_name(name)
obj.course_list.append(c_name)
obj.save()
return '选课成功'
def get_course_list_interface(name):
obj = models.Teacher.get_obj_name(name)
if obj.course_list:
return obj.course_list
def check_students_course(c_name):
obj = models.Course.get_obj_name(c_name)
if obj.student_list:
return obj.student_list
def change_score_interface(s_name, score, c_name):
s_obj = models.Student.get_obj_name(s_name)
s_obj.score[c_name] = score
s_obj.save()
student_interface
from db import models
def register_interface(name, pwd):
obj = models.Student.get_obj_name(name)
if obj:
return False, '当前用户已存在'
obj = models.Student(name, pwd)
obj.save()
return True, '注册成功'
def choose_school_interface(name, s_name):
obj = models.Student.get_obj_name(name)
if obj.school:
return False, '您已选择学校'
obj.choose_school(s_name)
obj.save()
return True, '成功入校'
def get_choose_course_interface(name):
obj = models.Student.get_obj_name(name)
if obj.school:
school_obj = models.School.get_obj_name(obj.school)
return True, school_obj.course_list
else:
return False, '请先入校'
def choose_course_interface(name, c_name):
student_obj = models.Student.get_obj_name(name)
if c_name in student_obj.course_list:
return '已在该课程下'
student_obj.course_list.append(c_name)
student_obj.save()
course_obj = models.Course.get_obj_name(c_name)
course_obj.student_list.append(name)
course_obj.save()
return '选课成功'
def get_by_course_interface(name):
obj = models.Student.get_obj_name(name)
return obj.course_list
def check_score_interface(s_name, c_name):
s_obj = models.Student.get_obj_name(s_name)
if s_obj.score:
for i in s_obj.score:
if i == c_name:
return s_obj.score[i]
common_interface
from db import models
def login_interface(name, pwd, type_str):
if type_str == 'student':
obj = models.Student.get_obj_name(name)
elif type_str == 'teacher':
obj = models.Teacher.get_obj_name(name)
else:
obj = models.Admin.get_obj_name(name)
if obj:
if pwd == obj.pwd:
return True, '登入成功'
else:
return False, '密码错误'
else:
return False, '用户不存在'
lib
common
import os
def login_info(user):
def wrapper(func):
def inner(*args, **kwargs):
from core import student, teacher, admin
if user == 'student':
if student.student_info['user']:
return func(*args, **kwargs)
else:
print('请先登入')
student.student_login()
if user == 'teacher':
if teacher.teacher_info['user']:
return func(*args, **kwargs)
else:
print('请先登入')
teacher.teacher_login()
if user == 'admin':
if admin.admin_info['user']:
return func(*args, **kwargs)
else:
print('请先登入')
admin.admin_login()
return inner
return wrapper
def get_all_filename(path):
return os.listdir(path)