选课系统
老男孩-----上海校区
接口文件 bin目录下admin_bin 、teacher_bin ‘、student_bin 、common_bin
""" 管理员接口 """ from db import db_hander from db import models #管理员注册接口 def admin_register(username,password): #1,判断用户是否存在 #调用Admin 类中的 select 方法 #由该方法调用db_hander 中的select_data工能获取对象 admin_obj = models.Admin.select(username) #1,1 如果存在不允许注册返回自己的视图层 if admin_obj: return False ,'用户已经存在' #1.2如果不存在则注册,调用类实例化得到对象并保存 admin_obj = models.Admin(username,password) #对象调用save() 会将admin_obj 传给save方法 admin_obj.save() return True ,'注册成功' #管理员登录接口 """ def admin_login(username,password): #判断用户是否存在 admin_obj=models.Admin.select(username) #如果不存在,则返回给视图层 if not admin_obj: return False,'用户名不存在' #如果存在,校验密码 if password == admin_obj.password: return True,'登录成功' else: return False,'密码错误登录失败' """ #创建学校接口 def create_school_info(school_name,addr,admin_info): #1,查看学校是否存在 school_obj=models.School.select(school_name) #2,如果存在,则返回False 告诉用户学校已经存在 if school_obj: return False ,'学校已经存在' #3,如果不存在,则创建学校 admin_obj = models.Admin.select(admin_info) #获取当前登录的管理用户 # 由管理员创建学校,传入学校名字已经学校地址 admin_obj.create_school( school_name,addr ) #4,返回创建爱你学校成功 return True , f'{school_name}学校' #管理员课程创建课程接口 def create_course(school_name,course_name,admin_name): #1,查看课程是否存在 #1.1,先获取学校对象中的课程列表 school_obj = models.School.select(school_name) #1.2 判断当前课程是否存在 if course_name in school_obj.course_list: return False,'课程已经存在' #1.2 如果课程不存在,则创建课程,有管理员来创建 admin_obj = models.Admin.select(admin_name) admin_obj.create_course( school_obj,course_name ) return True ,f'{course_name} 课程创建成功,绑定给{school_name} 校区' #管理员创建讲师类 def create_teacher(teacher_name,admin_name,teacher_pwd='123'): #1,判断老师是否存在 teacher_obj=models.Admin.select(teacher_name) #2,如果存在,则返回不能创建 if teacher_obj: return False,'老师已经存在' #3,如果不存在则创建老师让管理员 admin_obj=models.Admin.select(admin_name) admin_obj=create_teacher( teacher_name,teacher_pwd ) return True,f'{teacher_name} 老师创建成功'
""" 老师接口 """ from db import models #老师查看课程接口 def check_course_teacher(teacher_name): # 获取当前老师对象 teacher_obj = models.Teacher.select(teacher_name) # 判断老师对象中课程列表中是否有值 # course_list = teacher_obj.course_list_from_t course_list= teacher_obj.show_course #如果有 则返回True,无则返回Fasle if not course_list: return False ,'老师没有选择课程' return True ,course_list #老师添加课程接口 def add_course_info(course_name,treacher_name): # 获取当前老师对象 teacher_obj = models.Teacher.select(treacher_name) # 判断当前课程是否在老师课程列表中宏 course_list=teacher_obj.course_list_from_t # 如果不存在则添加该课程到老师课程列表中 if course_name in course_list: return False ,'该课程已经存在' teacher_obj.add_course(course_name) return True ,'添加课程完成' #老师获取课程下学生接口 def get_student_info(course_name,teacher_name): #获取当前老师对象 teacher_obj = models.Teacher.select(teacher_name) # 让老师对象,调用获取课程系所有学生功能 studet_list=teacher_obj.get_student(course_name) # 判断课程下是否有学生 if not studet_list: return False ,'学生没有选择课程' return True ,studet_list #老师修改学生分数接口 def change_score_interface(course_name,student_name,score,teacher_name): #获取老师对象 teacher_obj = models.Teacher.select(teacher_name) #让老师对象调用修改分数方法 teacher_obj.change_score(course_name,student_name,score) return True ,'修改成功'
"""学生接口""" from db import models #创建学生注册接口 def student_register(username,pwd): #判断用户存在 #调用student类中的select 方法 #由该方法调用db_hander 中的select_data 功能获取对象 student_obj=models.Student.select(username) #如果存在不允许注册,返回用户已经存在 if student_obj: return False,'用户已经存在' #如果不存在则允许注册,调用类实例化并保存数据 student_obj=models.Student(username,pwd) student_obj.save() return True,'注册成功' #创建学生登录接口 """ def student_login(username,password): #1,判断用户是否存在 student_obj=models.Student.select(username) #2,如果不存则返回用户返回给视图 if not student_obj: return False ,'用户名不存在' #3,如果存在则校验密码 if password == student_obj.password: return True,"登录成功" else: return False,'密码错误' """ #选择学校接口 def add_school(school_name,student_name): # 当前学生是否存在学校 student_obj = models.Student.select(school_name) if student_obj.school: return False, '当前学生已经选择过学校了' #如果不存在学校,则调用学生对象中选择学校的方法,实现学生添加学校 student_obj.add_school(school_name) return True,'选择学校成功' #/获取学生所在学校所有课程接口 def get_course_list(student_name): #1,获取当前学生对象 student_obj=models.Student.select(student_name) school_name=student_obj.school # 2,判断当前学生是否由学校,如果没有则返回False if not school_name: return False ,'没有学校,请先选择学校' #3,开始获取学校对象中的课程列表 school_obj= models.School.select(school_name) # 3.1 判断当前学校中是否有课程,如果没有,则联系管理员 course_list = school_obj.course_list if not course_list: return False,'没有课程,请先联系管理员创建' #3.2 return True,course_list# #学生选择课程接口 def add_course_info(course_name,student_name): #当前课程是否已经存在于学生课程列表中 student_obj=models.Student.select(student_name) if course_name in student_obj.course_list: return False ,'选择的课程已经存在' #2,调用学生对象中添加课程方法 student_obj.add_course(course_name) return True,f'{student_name} 课程添加成功' #学生查看分数接口 def check_score(student_name): student_obj= models.Student.select(student_name) if student_obj.score: return student_obj.score
""" 公共接口 """ import os from config import settings from db import models #获取所有学校名称接口 def get_all_school(): #获取学校文件夹路径 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(user,pwd,user_type): if user_type == 'admin': obj = models.Admin.select(user) elif user_type == 'student': obj = models.Student.select(user) elif user_type == 'teacher': obj = models.Teacher.select(user) else: return False,"登录的角色不存在" # 判断用户是否存在 if obj: if pwd == obj.pwd: return True,'登录成功' else: return False,'登录失败' else: return False,'用户不存在' #获取学校下所有课程接口 def get_course_in_school(school_name): #获取学校对象, school_obj=models.School.select(school_name) #查学校对象下所有的课程 course_list = school_obj.course_list if not course_list: return False,'该学校没有课程' return True ,course_list
配置文件目录config 下setting.py 文件
import os BASE_PATH = os.path.dirname( os.path.dirname(__file__) ) DB_PATH=os.path.join(BASE_PATH,'db')
主程序目录core 下文件 admin studnet teacher src
""" 管理员视图 """ #注册 admin_info={ 'user':None } from bin import admin_bin from lib import common from bin import common_bin def registered(): while True: username=input("请输入您的用户名").strip() password=input("请输入您的密码").strip() re_password=input("请再次确认您的密码").strip() if password == re_password: flag,msg = admin_bin.admin_register( username,password ) if flag: print(msg) break else: print(msg) else: print('两次密码不一致,请重新输入') #登录 def login(): while True: username=input("请输入您的用户名").strip() password=input("请输入您的密码").strip() #1,调用管理员登录接口 flag,msg=common_bin.login_interface( username,password,user_type='admin' ) if flag: #如果为真True print(msg) admin_info['user']=username # 可变类型不需要global break else: print(msg) #创建学校 @common.auth('admin') def create_school(): while True: school_name=input("请输入学校名称") addr=input("请输入学校地址") flag,msg=admin_bin.create_school_info( school_name,addr,admin_info.get('user') ) if flag: print(msg) break else: print(msg) #创建课程 @common.auth('admin') def create_course(): while True: #1,让管理员先选择学校 #1.1 调用接口获取所有学校 flag,school_list_msg=common_bin.get_all_school() if not flag: print(school_list_msg) break for index,school_name in enumerate(school_list_msg):# 使用枚举方法 print(f'编号{index},学校名{school_name}') choice = input("请输入学校编号").strip() if not choice.isdigit(): print("请输入数字") continue choice=int(choice) if choice not in range(len(school_list_msg)): print("请输入正确的编号") continue #获取用户输入的学校名字 school_name = school_list_msg[choice] #2,选择学校后输入课程名称 course_name = input("请输入创建的课程的名称").strip() #3,调用创建课程接口,让管理员创建课程 flag,msg=admin_bin.create_course( school_name,course_name,admin_info.get('user') ) if flag: print(msg) break else: print(msg) #创建老师 @common.auth('admin') def create_teacher(): while True: teacher_name=input("请输入老师的名字").strip() #调用接口创建老师 flag,msg=admin_bin.create_teacher( teacher_name,admin_info.get('user') ) if flag: print(msg) break else: print(msg) func_dic={ '1':registered, '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.get(choice)()
""" 学生视图 """ #注册 from lib import common from bin import studeny_bin from bin import common_bin student_info={ 'user':None } #注册 def registered(): while True: student_name=input("请输入您的名字") student_pwd=input("请输入您的密码") re_student_pwd=input("请再次确认您的密码") if student_pwd == re_student_pwd: flag,msg=studeny_bin.student_register( student_name,student_pwd ) if flag: print(msg) break else: print(msg) else: print("两次密码不一致,请重新输入") #登录 def login(): while True: username=input("请输入您的账号").strip() password=input("请输入您的密码").strip() #调用登录接口 flag,msg = common_bin.login_interface( username,password,user_type='student' ) if flag: print(msg) #记录登录状态 student_info['user']=username break else: print(msg) #选择学校 # @common.auth('student') def chose_school(): # 获取所有学校让学生选择 while True: flag,school_list=common_bin.get_all_school() if flag: print(school_list) break for index ,school_name in enumerate(school_list): print(f'编号{index}, 学校名称{school_name}') #让学生选择学校 choice = input("请输入学校编号").strip() if not choice.isdigit(): print("输入有误,请输入正确编号") continue choice=int(choice) if choice not in range(len(school_list)): print("输入编号有误") continue school_name = school_list[choice] #3,开始调用学生选择学校接口 flag,msg=studeny_bin.add_school( school_name,student_info.get('user') ) if flag: print(msg) break else: print(msg) #选择课程 # @common.auth('student') def chose_course(): while True: #1,先获取当前学生所在学校的课程列表 flag,course_list= studeny_bin.get_course_list( student_info.get('user') ) if not flag: print(course_list) return #打印课程列表,并让用户选择课程 for index,course_name in enumerate(course_list): print(f'编号{index}, 课程名{course_name}') #让学生输入课程编号 choice = input('请输入选择的学校编号').strip() if not choice.isdigit(): print('输入有误') continue choice=int(choice) if choice not in range(len(course_list)): print('输入编号有误') continue # 获取选择课程的名称 course_name = course_list[choice] # 调用学生选择接口 flag,msg=studeny_bin.add_course_info( course_name,student_info.get('user') ) if flag: print(msg) break else: print(msg) #查看分数 # @common.auth('student') def select_fraction(): score=studeny_bin.check_score( student_info.get('user') ) if not score: print('没有选择课程') print(score) #交学费 # @common.auth('student') def pay_tuition(): pass func_dict={ '1':registered, '2':login, '3':chose_school, '4':chose_course, '5':select_fraction, '6':pay_tuition, } def student_view(): while True: print(""" -1,注册 -2,登录功能 -3,选择校区 -4,选择课程(先选择校区,在选择校区中的一门课程) --学生选择课程,课程选择学生 -5.查看分数 -6.交学费 """) choice = input("请输入您的选择").strip() if choice == 'q': break if choice not in func_dict: print("您输入的有误请重新输入") continue func_dict.get(choice)()
""" 老师视图 """ from bin import common_bin from bin import teacher_bin from lib import common teacher_info = { 'user': None } def login(): """登录""" while True: username = input("请输入您的用户名").strip() password = input("请输入您的密码").strip() flag, msg = common_bin.login_interface( username, password, user_type='teacher' ) if flag: print(msg) teacher_info['user'] = username break else: print(msg) # @common.auth('teacher') #查看教授课程 def select_course(): flag,course_list= teacher_bin.check_course_teacher( teacher_info.get('user') ) if flag: print(course_list) else: print(course_list) # @common.auth('teacher'). """选择教授课程""" def chose_course(): #1 先打印所有学校并选择 while True: flag,school_list=common_bin.get_all_school() if not flag: print(school_list) break for index,school_name in enumerate(school_list): print(f'编号{index}, 学校名字{school_name}') choice = input('请输入学校编号').strip() if not choice.isdigit(): print('输入有误') continue choice=int(choice) if choice not in range(len(school_list)): print('输入编号有误') continue school_name= school_list[choice] # 获取学校名称 #2,从选择的学校中获取所有的课程 flag2,course_list=common_bin.get_course_in_school( school_name ) if not flag2: print(course_list) break for index2,course_name in enumerate(course_list): print(f'编号{index2} 课程名字{course_name}') choice2 = input("请输入编号") if not choice2.isdigit(): print("输入有误") continue choice2= int(choice2) if choice2 not in range(len(course_list)): print('输入有误') continue #获取课程名称 course_name = course_list[choice2] #3 调用选择教授课程接口,将课程添加到老师课程列表中 flag3,msg=teacher_bin.add_course_info( course_name, teacher_info.get('user') ) if flag3: print(msg) break else: print(msg) # @common.auth('teacher') def course_student(): """查看课程下的学生""" while True: #1,获取当前老师所在课程 flag,course_list = teacher_bin.check_course_teacher( teacher_info.get('user') ) if not flag: print(course_list) break #2,获取所有课程,并让老师选择 for index,course_name in enumerate(course_list): print(f'编号{index} 课程名{course_name}') choice = input('请输入编号') if not choice.isdigit(): print('输入有误') continue choice=int(choice) if choice not in range(len(course_list)): print('输入编号有误') continue #获取当前选择的课程名成 course_name = course_list[choice] # 利用当前的课程名称获取所有学生 flag2,student_list = teacher_bin.get_student_info( course_name,teacher_info.get('user') ) if flag2: print(student_list) break else: print(student_list) break # @common.auth('teacher') def modify(): """修改分数""" #1,先获取老师下所有的课程,并选择 #2, 获取选择的课程下所有的学生,并选择要修改的学生 #3, 调用修稿学生分数接口修改分数 while True: #调用获取当前老师下所有的课程接口 flag,course_list = teacher_bin.check_course_teacher( teacher_info.get('user') ) if not flag: print(course_list) break #获取所有课程让老师选择 for index,course_name in enumerate(course_list): print(f'编号{index}, 课程名称{course_name}') choice = input('请输入课程编号') if not choice.isdigit(): print("请输入正确的编号") continue choice = int(choice) if choice not in range(len(course_list)): print("请输入正确的编号") continue #获取当前课程名称 course_name=course_list[choice] #使用课程名称获取所有学生 flag2, student_list = teacher_bin.get_student_info( course_name, teacher_info.get('user') ) if not flag2: print(student_list) break #打印所有学生让老师选择 for index2,student_name in enumerate(student_list): print(f'编号{index2} 学生名称{student_name}') choice2 = input("请输入编号") if not choice2.isdigit(): 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.isdigit(): continue score =int(score) #调用修改学生分数接口修改分数 flag3,msg=teacher_bin.change_score_interface( course_name,student_name,score,teacher_info.get('user') ) if flag3: print(msg) break fun_dic = { } def teacher_view(): while True: print(""" -- 1.登录 --2.查看教授课程 --3.选择教授课程 --4.查看课程下的学生 --5.修改学生分数 """) choice = input("请输入您的选择").strip() if choice == 'q': break if choice not in fun_dic: print("您输入的有误,请重新选择") continue fun_dic.get(choice)()
""" 主视图 """ from core import admin from core import student from core import teacher chose_dic={ '1':admin.admin_view, '2':student.student_view, '3':teacher.teacher_view, } def run(): while True: print(""" 欢迎来到老男孩 1,管理员功能 2,学生功能 3,老师功能 q,退出 """) chose = input("请输入功能编号").strip() if chose == 'q': break if chose not in chose_dic: print("输入有误请重新输入") continue chose_dic.get(chose)()
数据目录 db_hander ,modles 和新增数据文件存在
""" 保存数据,查看数据 """ import os from config import settings import pickle def save_data(obj): #1,获取对象的保存文件夹路径 #2,以类名 当做 文件夹的名字 #obj.__class__: 获取当前对象的类 # obj.__class__.__name__ 获取类名字 class_name = obj.__class__.__name__ user_dir_path= os.path.join( settings.DB_PATH,class_name ) #2,判断文件夹是否存在 if not os.path.exists(user_dir_path): os.mkdir(user_dir_path) #3,拼接当前用户的pickle 文件路径,亿用户名作为文件名 user_path = os.path.join( user_dir_path,obj.username # "username" 类中初始化是也必须是username ) #4,打开文件保存对象, with open(user_path,'wb') as f: pickle.dump(obj,f) def select_data(cls,username): #由cls获取类名 cls_name = cls.__name__ user_dic_patch= os.path.join( settings.DB_PATH,cls_name ) #2,拼接查看用户的pickle 文件路径, user_patch=os.path.join( user_dic_patch,username ) #3,判断用户是否存在,再打开,并返回如果不存在则代表用户不存在 if os.path.exists(user_patch): #5,打开文件 with open(user_patch,'rb') as f: obj= pickle.load(f) return obj
""" 用于存放类 """ # 学校类、学员类、课程类、讲师类、 管理员类 from db import db_hander # 让所有类继承 查看数据、保存数据的方法 class Father: def save(self): #保存对象数据 db_hander.save_data(self) #查看数据 @classmethod #将函数类话 def select(cls,username): obj = db_hander.select_data(cls,username) return obj #管路员类 class Admin(Father): def __init__(self,username,password): self.username=username self.password = password #创建学校 def create_school(self,school_name,addr): #调用方法内部来调用学校实例化的得到对象保存 school_obj=School(school_name,addr) school_obj.save() #创建课程 def create_course(self,school_obj,course_name): #1,调用课程类,实例化创建课程 course_obj=(course_name) course_obj.save() #2,获取当前学校对象,并将课程添加到课程列表中 school_obj.course_list.append(course_name) #创建讲师 def create_teacher(self,teacher_name,teacher_pwd): #1,调用老师类,实例化的到老师对象,并保存 teacher_obj=Teacher(teacher_name,teacher_pwd) teacher_obj.save() #学生类 class Student(Father): def __init__(self,username,pwd): self.username=username self.pwd=pwd self.school = None #一个学生只能有一个校区 self.course_list=[] # 一个学生可以选择多门课程 self.score={} #{"course_name":0} self.pay = {} #{"course_name":0} #学生添加学校方法 def add_school(self,school_name): self.school=school_name self.save() #学生选择课程方法 def add_course(self,course_name): #1学生列表添加课程 self.course_list.append(course_name) #2 给学生选择的课程设置默认分数 self.score[course_name]=0 self.save() #3学生选择的课程对象添加学生 course_obj=Course.select(course_name) course_obj.student_list.append(self.username) course_obj.save() #课程类 class Course(Father): def __init__(self,course_name): self.username=course_name self.student_list=[] #讲师类 class Teacher(Father): def __init__(self,teacher_name,teacher_pwd): self.username=teacher_name self.pwd=teacher_pwd self.course_list_from_t=[] def show_course(self): """查看课程接口""" return self.course_list_from_t def add_course(self,course_name): """老师添加课程""" self.course_list_from_t.append(course_name) self.save() def get_student(self,course_name): course_obj=Course.select(course_name) return course_obj.course_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() #学校类 class School(Father): def __init__(self,name,addr): #必须写self.user=name #因为db_hander 里面的select_data 统一规范 self.username=name self.addr = addr self.course_list=[]#每所学校都应该有相应的课程
公用目录lib 公共方法使用文件 common,py
""" 公共方法 """ from core import admin from core import teacher from core import student #登录认证装饰器,有参装饰器 def auth(role): def login_auth(func): def warpper(*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 warpper return login_auth
启动文件 start.py
""" 程序启动文件 """ import os,sys from core import src sys.path.append(os.path.dirname(__file__)) if __name__ =='__main__': src.run()