Day32.学生选择课程
1.学生选择课程_整体代码及执行流程
2.学生选择课程_学生视图中choice_course选课功能
'''学生视图''' from lib import common from interface import student_interface from lib import common_interface
# todo 全局记录用户登陆状态
student_info = {'user': None}
# todo 学生选择课程 @common.auth('student') def choice_course(): print('学生选择课程') while True: # todo 1. 先获取`当前学生`所在学校的课程列表 flag, course_list = student_interface.get_course_list_interface( student_info.get('user')) if not flag: print(course_list) break # todo 2. 打印课程列表,并让用户选择课程 for index, course_name in enumerate(course_list): print('编号:{}, 课程名:{}'.format(index, course_name)) # todo 2. 让学生输入课程编号 choice = input('请输入选择的课程编号:').strip() if not choice.isdigit(): print('输入有误') continue else: choice = int(choice) if choice not in range(len(course_list)): print('输入编号有误!') continue # todo 3. 获取选择的课程名称 course_name = course_list[choice] # todo 4. 学生选择课程接口 flag, msg = student_interface.add_course_interface( course_name, student_info.get('user')) if flag: print(msg) break else: print(msg)
3.学生选择课程_学生接口层中查询学校课程接口_get_course_list_interface和学生选择课程接口_add_course_interface
'''学生接口层''' from db import models # todo 全局记录用户登陆状态 student_info = {'user': None} # todo 获取学生所在学校所有课程接口 def get_course_list_interface(student_name): # todo 1. 获取当前学生对象 student_obj = models.Student.select(student_name) school_name = student_obj.school # todo 2. 判断当前学生是否有学校,若没有则返回False if not student_obj.school: return False, '没有学校,请先选择学校' # todo 3. 开始获取学校的对象中的课程列表 school_obj = models.School.select(school_name) # todo 3.1 判断当前学校中是否有课程,若没有,则联系管理员 course_list = school_obj.course_list if not school_obj.course_list: return False, '没有课程,请先联系管理员创建' # todo 3.2 若有,则返回课程列表 return True, course_list # todo 学生选择课程接口 def add_course_interface(course_name, student_name): # todo 1. 先判断当前课程是否已经存在学生课程列表中 student_obj = models.Student.select(student_name) if course_name in student_obj.course_list: return False, '该课程已选择!' else: # todo 2. 调用学生对象中添加课程的方法 student_obj.add_course(course_name) return True, '{} -- 课程添加成功'.format(course_name)
4.学生选择课程_类层中学校类,学生类和父类
'''用于存放类的 学校类、学员类、课程类、讲师类、管理员类 ''' from db import db_handler # todo 提供select和save方法写入父类, 让所有子类都继承 class Base: # todo 定义一个数据查找方法 ----> 登录、查看数据 @classmethod def select(cls, username): # 接收到类Admin和username # todo obj: 对象 OR None obj = db_handler.select_data( cls, username) return obj # todo 定义一个数据保存方法 ----> 注册、保存、更新数据 def save(self): # todo 调用db_handler中的save方法,并且需要对其中的方法做传值,即添加self # todo 让db_handler中的save_data进行保存对象数据 db_handler.save_data(self) # todo 学校类 class School(Base): def __init__(self, name, addr): # todo 必须写:self.user, 因为db_handler里面的select_data统一规范 self.user = name self.addr = addr # todo 课程列表:每所学校都应该有相应的课程 self.course_list = [] # todo 学生类 class Student(Base): def __init__(self, user, pwd): self.user = user self.pwd = pwd # todo 每个学生只能有一个校区 self.school = None # todo 一个学生可以选择多门课程 self.course_list = [] # todo 学生课程分数 self.score = {} # todo {"course_name": 0} # todo 学生选择学校 def add_school(self, school_name): self.school = school_name self.save() # todo 学生添加课程方法 def add_course(self, course_name): # todo 1. 学生课程列表添加课程 self.course_list.append(course_name) # todo 2. 给学生选择的课程设置默认分数 self.score[course_name] = 0 self.save() # todo 3. 学生选择的课程对象,添加学生 course_obj = Course.select(course_name) course_obj.student_list.append(self.user) course_obj.save() return True, '{} -- 课程添加成功'
5.学生选择课程_用户保存对象与获取对象db_handler.py
''' 用于保存对象与获取对象 ''' import os from conf import settings import pickle # todo 保存数据 def save_data(obj): # todo 1. 获取对象的保存文件夹路径 # todo 以类名 当作 文件夹的名字 # todo obj.__class__:获取当前对象的类,即models.py中调用该方法的类 # todo obj.__class__.__name__:获取当前类的名字,即models.py中调用该方法的类名 class_name = obj.__class__.__name__ user_dir_path = os.path.join( settings.DB_PATH, class_name ) # todo 2.判断文件夹是否存在,不存在则创建文件夹 if not os.path.exists(user_dir_path): os.mkdir(user_dir_path) # todo 3.拼接当前用户的pickle文件路径,以用户作为文件名 user_path = os.path.join( user_dir_path, obj.user # 当前用户名字 ) # todo 4.打开文件,保存对象,通过pickle with open(user_path, 'wb') as f: pickle.dump(obj, f) # todo 查看数据 def select_data(cls, username): # 拿到models.py中刚传过来的类名(即文件夹名称)和username, # todo 有cls获取类名 class_name = cls.__name__ user_dir_path = os.path.join( settings.DB_PATH, class_name ) # todo 2.判断文件夹是否存在,不存在则创建文件夹 if not os.path.exists(user_dir_path): os.mkdir(user_dir_path) # todo 3.拼接当前用户的pickle文件路径,以用户作为文件名 user_path = os.path.join( user_dir_path, username # 当前用户名字 ) # todo 4.判断文件如果存在,再打开,并返回,若不存在,则代表用户不存在 if os.path.exists(user_path): # todo 5.打开文件,获取对象 with open(user_path, 'rb') as f: obj = pickle.load(f) return obj else: return None
6.学生选择课程_运行结果