学员管理系统
需求:
用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下
讲师视图
管理班级,可创建班级,根据学员qq号把学员加入班级
可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上课纪录, 即每节课都有整班学员上,
为了纪录每位学员的学习成绩,需在创建每节上课纪录是,同时为这个班的每位学员创建一条上课纪录
为学员批改成绩, 一条一条的手动修改成绩
学员视图
提交作业
查看作业成绩
一个学员可以同时属于多个班级,就像报了Linux的同时也可以报名Python一样,
所以提交作业时需先选择班级,再选择具体上课的节数
附加:学员可以查看自己的班级成绩排名
分析:
利用sqlalchemy模块进行MySQL的数据构建,数据库构建情况(见数据关系表图)
老师表和班级表多对多,班级表和学生表多对多,班级表和课程表是外键关联,学生表和班级课程表是外键关联
首先,初始化数据是班级“P1”,课程“python”,老师“alex”;
进入系统后,采用反射的方式获取到输入的命令,然后执行操作。
学生的作业上传是上传(修改)学生的随机成绩,并未具体上传文件。
测试环境:在ubuntu16.04下 安装有mysql5.7.21 使用python3.5
文件目录结构
流程图和数据结构
代码:
1 import os,sys 2 3 4 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 5 sys.path.append(BASE_DIR) 6 7 8 9 10 from conf import setting 11 from modules import models 12 from modules import action 13 14 if __name__=="__main__": 15 obj = action.Action() 16 obj.func()
1 from sqlalchemy import create_engine 2 3 engine=create_engine("mysql+pymysql://root:alex1234@192.168.189.129/schooldb?charset=utf8")
1 from sqlalchemy.orm import sessionmaker 2 from conf import setting 3 from conf.setting import engine 4 from .models import Teacher,Class 5 from .teacher import Teacher_Center 6 from .student import Student_Center 7 8 9 class Action(object): 10 11 def __init__(self): 12 Session = sessionmaker(bind=engine) 13 self.session = Session() 14 self.initialize_database() 15 16 def func(self): 17 while True: 18 print("欢迎进入学员管理系统\n" 19 "1.教师视图\n" 20 "2.学生视图\n" 21 "3.退出\n") 22 user_choice = input("输入你的角色:") 23 if user_choice == "1": 24 Teacher_Center(self.session) 25 elif user_choice == "2": 26 Student_Center(self.session) 27 elif user_choice =="3": 28 break 29 else: 30 print("请输入正确编号") 31 32 def initialize_database(self):#初始化 33 rest = self.session.query(Teacher).filter(Teacher.tid>0).all() 34 if not rest: 35 class1 = Class(cname="P1",course="Python") 36 teacher1 = Teacher(tname="Alex") 37 teacher1.classes = [class1] 38 39 self.session.add_all([class1,teacher1]) 40 self.session.commit()
1 from sqlalchemy import Integer, ForeignKey, String, Column,Table 2 from sqlalchemy.ext.declarative import declarative_base 3 from sqlalchemy.orm import relationship 4 from conf.setting import engine 5 6 7 Base=declarative_base() #创建数据表结构 8 9 #教师与班级的关联表 10 teacher_m2m_class = Table("teacher_m2m_class",Base.metadata, 11 Column("teacher_id",Integer,ForeignKey("teacher.tid")), 12 Column("class_id",Integer,ForeignKey("class.cid")), 13 ) 14 15 #班级与学生关联表 16 class_m2m_student = Table("class_m2m_student",Base.metadata, 17 Column("class_id",Integer,ForeignKey("class.cid")), 18 Column("student_id",Integer,ForeignKey("student.sid")), 19 ) 20 class Class_lesson(Base): 21 """班级与课程关联""" 22 __tablename__="class_lesson" 23 id= Column(Integer,primary_key=True) 24 class_id = Column(Integer,ForeignKey("class.cid")) 25 lesson_id = Column(Integer,ForeignKey("lesson.lid")) 26 27 classes= relationship("Class",backref="class_lesson") 28 lessons= relationship("Lesson",backref="class_lesson") 29 30 def __repr__(self): 31 return "%s %s"%(self.classes,self.lessons) 32 33 class Record(Base): 34 """class_lesson表和学生表关联""" 35 __tablename__ = "record" 36 id = Column(Integer, primary_key=True) 37 class_lesson_id = Column(Integer, ForeignKey("class_lesson.id")) 38 sid = Column(Integer,ForeignKey("student.sid")) 39 status= Column(String(32),nullable=False) 40 score = Column(Integer,nullable=True) 41 42 class_lessons = relationship("Class_lesson",backref="record") 43 students = relationship("Student",backref="record") 44 45 def __repr__(self): 46 return "%s,%s,状态:【%s】,成绩:【%s】"%(self.class_lessons,self.students,self.status,self.score) 47 48 49 class Teacher(Base): 50 """教师表""" 51 __tablename__="teacher" 52 tid= Column(Integer,primary_key=True) 53 tname= Column(String(32),nullable=False,unique=True) 54 55 classes= relationship("Class",secondary=teacher_m2m_class,backref="teacher") 56 57 def __repr__(self): 58 return "教师:【%s】"%self.tname 59 60 class Class(Base): 61 """班级表""" 62 __tablename__="class" 63 cid=Column(Integer,primary_key=True) 64 cname=Column(String(32),nullable=False,unique=True) 65 course = Column(String(32),nullable=False) 66 67 students=relationship("Student",secondary=class_m2m_student,backref="classes") 68 69 def __repr__(self): 70 return "班级:【%s】"%self.cname 71 72 class Lesson(Base): 73 """课程表""" 74 __tablename__="lesson" 75 lid=Column(Integer,primary_key=True) 76 lname=Column(String(32),nullable=False,unique=True) 77 78 def __repr__(self): 79 return "课程:【%s】"%self.lname 80 81 class Student(Base): 82 """学生表""" 83 __tablename__="student" 84 sid=Column(Integer,primary_key=True) 85 sname=Column(String(32),nullable=False,unique=True) 86 qq=Column(Integer(),nullable=False) 87 88 def __repr__(self): 89 return "学生:【%s】"%self.sname 90 91 92 93 Base.metadata.create_all(engine)
1 from .models import Teacher,Class,Student,Lesson,Class_lesson,Record 2 import random 3 from modules import action 4 5 6 7 class Student_Center(object): 8 """学生视图""" 9 def __init__(self,session): 10 self.session = session 11 self.authentication() 12 self.handler() 13 14 def handler(self): 15 while True: 16 print("欢迎【%s】进入学员管理系统\n" 17 "up_homework 上传作业\n" 18 "show_homework 查看作业成绩\n" 19 "show_rank 查看班级排名\n" 20 "quit 退出\n" % self.student_obj.sname) 21 user_choice = input("请输入需要操作的命令:") 22 if hasattr(self,user_choice): 23 getattr(self,user_choice)() 24 25 def authentication(self): 26 """认证学生""" 27 while True: 28 student_name = input("请输入学生姓名:").strip() 29 self.student_obj = self.session.query(Student).filter_by(sname=student_name).first() 30 if not self.student_obj: 31 print("输入错误:请输入有效学生姓名") 32 continue 33 else: 34 break 35 36 def up_homework(self): 37 """作业上传""" 38 class_name =input("请输入班级名称:") 39 for class_obj in self.student_obj.classes: 40 # print(class_obj.cname) 41 if class_name == class_obj.cname: 42 lesson_name = input("请输入添加的上课记录的名称:") 43 lesson_obj = self.session.query(Lesson).filter_by(lname=lesson_name).first() 44 if lesson_obj: 45 class_lesson_obj = self.session.query(Class_lesson).\ 46 filter(Class_lesson.class_id==class_obj.cid).\ 47 filter(Class_lesson.lesson_id==lesson_obj.lid).first() 48 print(class_lesson_obj) 49 if class_lesson_obj: 50 record_obj= self.session.query(Record).\ 51 filter(Record.class_lesson_id==class_lesson_obj.id).\ 52 filter(Record.sid==self.student_obj.sid).first() 53 print(record_obj) 54 if record_obj: 55 score =random.randint(0,100) 56 record_obj.score = score 57 self.session.commit() 58 print("上传成功") 59 else: 60 print("系统错误:当前上课记录已经创建") 61 else: 62 print("系统错误,lesson未创建") 63 64 def show_homework(self): 65 """查看作业成绩""" 66 class_name = input("请输入要添加上课记录的班级名:") 67 class_obj = self.session.query(Class).filter_by(cname=class_name).first() 68 if class_obj: 69 lesson_name = input("请输入添加的上课记录的名称:") 70 lesson_obj = self.session.query(Lesson).filter_by(lname=lesson_name).first() 71 if lesson_obj: 72 self.record_obj=self.session.query(Record).filter_by(sid=self.student_obj.sid).first() 73 print(self.record_obj.score) 74 else: 75 print("输入的上课记录不存在") 76 else: 77 print("输入的班级名不存在") 78 79 def show_rank(self): 80 """查看班级课程的排名""" 81 class_name = input("请输入要添加上课记录的班级名:") 82 class_obj = self.session.query(Class).filter_by(cname=class_name).first() 83 if class_obj: 84 lesson_name = input("请输入添加的上课记录的名称:") 85 lesson_obj = self.session.query(Lesson).filter_by(lname=lesson_name).first() 86 if lesson_obj: 87 self.class_lesson_obj = self.session.query(Class_lesson).filter_by(lesson_id=lesson_obj.lid).first() 88 print(self.class_lesson_obj) 89 self.record_obj = self.session.query(Record).filter_by(class_lesson_id=self.class_lesson_obj.id).all() 90 self.record_obj2 = self.session.query(Record).filter_by(sid=self.student_obj.sid).first() 91 # print(self.record_obj,self.record_obj2) 92 self.score_obj=self.session.query(Record).order_by(Record.score.desc()) 93 # print(self.score_obj.limit(100).all()) 94 95 obj=self.score_obj.limit(100).all().index(self.record_obj2) 96 print("你的成绩排名在全班是第%s名"%(obj+1)) 97 98 def quit(self): 99 obj = action.Action() 100 obj.func()
1 from .models import Teacher,Class,Student,Lesson,Class_lesson,Record 2 from modules import action 3 4 5 class Teacher_Center(object): 6 """教师视图""" 7 def __init__(self,session): 8 self.session =session 9 self.authentication() 10 self.handler() 11 12 def handler(self): 13 while True: 14 print("欢迎【%s】进入教师管理系统\n" 15 "add_class 创建班级\n" 16 "add_student 添加学生\n" 17 "add_lesson 添加课程\n" 18 "add_record 创建上课记录\n" 19 "show_class 显示管理的班级\n" 20 "modify_score 修改学生成绩\n" 21 "quit 退出\n"%self.teacher_obj.tname) 22 user_func =input("请输入要操作的命令:") 23 if hasattr(self,user_func): 24 getattr(self,user_func)() 25 26 def authentication(self):#认证 27 while True: 28 teacher_name = input("请输入教师名称:").strip() 29 self.teacher_obj =self.session.query(Teacher).filter_by(tname=teacher_name).first() 30 if not self.teacher_obj: 31 print("输入错误:请输入正确的教师名") 32 continue 33 else: 34 break 35 36 def add_class(self): 37 """创建班级""" 38 class_name = input("请输入创建班级的名称:") 39 course=input("请输入创建班级的类型:") 40 class_obj = self.session.query(Class).filter_by(cname=class_name).first() 41 if not class_obj: 42 class_new =Class(cname=class_name,course=course) 43 self.teacher_obj.classes.append(class_new) 44 self.session.add(class_new) 45 self.session.commit() 46 print("班级创建成功") 47 else: 48 print("系统错误:班级已经存在") 49 50 def add_student(self): 51 """添加学生""" 52 class_name = input("请输入要添加学生的班级名:") 53 class_obj = self.session.query(Class).filter_by(cname=class_name).first() 54 if class_obj and class_obj.teacher[0] == self.teacher_obj: 55 stu_name = input("请输入学生姓名:") 56 QQ = input("请输入学生的QQ号:") 57 student_obj =self.session.query(Student).filter_by(sname =stu_name).first() 58 if not student_obj: 59 student_new =Student(sname=stu_name,qq=QQ) 60 class_obj.students.append(student_new) 61 self.session.add(student_new) 62 self.session.commit() 63 print("学员添加成功") 64 else: 65 print("系统错误:学员不存在") 66 else: 67 print("输入错误:班级不存在") 68 69 def add_lesson(self): 70 """添加课程""" 71 class_name = input("请输入要添加lesson的班级名:") 72 class_obj = self.session.query(Class).filter_by(cname=class_name).first() 73 if class_obj and class_obj.teacher[0] == self.teacher_obj: 74 lesson_name =input("请输入添加的lesson名称:") 75 lesson_obj = self.session.query(Lesson).filter_by(lname=lesson_name).first() 76 if not lesson_obj: 77 print("Lesson不存在") 78 lesson_obj = Lesson(lname=lesson_name) 79 self.session.add(lesson_obj) 80 self.session.commit() 81 82 rest = self.session.query(Class_lesson).\ 83 filter(Class_lesson.class_id==class_obj.cid).\ 84 filter(Class_lesson.lesson_id==lesson_obj.lid).first() 85 if not rest: 86 print("class:%s----lesson:%s"%(class_obj.cid,lesson_obj.lid)) 87 class_lesson_new = Class_lesson(class_id=class_obj.cid,lesson_id=lesson_obj.lid) 88 self.session.add(class_lesson_new) 89 self.session.commit() 90 else: 91 print("输入错误:班级不存在") 92 93 def add_record(self): 94 """创建上课记录""" 95 class_name = input("请输入要添加上课记录的班级名:") 96 class_obj = self.session.query(Class).filter_by(cname=class_name).first() 97 if class_obj and class_obj.teacher[0] == self.teacher_obj: 98 lesson_name = input("请输入添加的上课记录的名称:") 99 lesson_obj = self.session.query(Lesson).filter_by(lname=lesson_name).first() 100 101 if lesson_obj: 102 class_lesson_obj= self.session.query(Class_lesson).\ 103 filter(Class_lesson.class_id == class_obj.cid). \ 104 filter(Class_lesson.lesson_id == lesson_obj.lid).first() 105 106 if class_lesson_obj: 107 record_obj=self.session.query(Record).filter_by(class_lesson_id=class_lesson_obj.id).first() 108 print(record_obj) 109 if not record_obj: 110 for student_obj in class_obj.students: 111 status = input("学生%s的上课情况(YES or NO)"%student_obj.sname) 112 record_new = Record(class_lesson_id =class_lesson_obj.id,sid=student_obj.sid,status=status) 113 self.session.add(record_new) 114 self.session.commit() 115 else: 116 print("输入错误:上课记录已存在") 117 else: 118 print("输入错误:当前班级的课程未创建") 119 else: 120 print("输入错误:当前课程未创建") 121 else: 122 print("输入错误:班级不存在") 123 124 def show_class(self): 125 """查看管理的班级""" 126 print(self.teacher_obj) 127 for class_obj in self.teacher_obj.classes: 128 print("教师:【%s】 班级:【%s】 类型:【%s】"% 129 (class_obj.teacher[0].tname,class_obj.cname,class_obj.course)) 130 131 def modify_score(self): 132 """修改学生成绩""" 133 class_name = input("请输入要添加上课记录的班级名:") 134 class_obj = self.session.query(Class).filter_by(cname=class_name).first() 135 if class_obj and class_obj.teacher[0] == self.teacher_obj: 136 lesson_name = input("请输入添加的上课记录的名称:") 137 lesson_obj = self.session.query(Lesson).filter_by(lname=lesson_name).first() 138 if lesson_obj: 139 class_lesson_obj = self.session.query(Class_lesson). \ 140 filter(Class_lesson.class_id == class_obj.cid). \ 141 filter(Class_lesson.lesson_id == lesson_obj.lid).first() 142 if class_lesson_obj: 143 while True: 144 record_objs = self.session.query(Record).filter(Record.class_lesson_id==class_lesson_obj.id).all() 145 for obj in record_objs: 146 print(obj) 147 student_name = input("输入需要修改成绩的学生名:[Q 退出]") 148 if student_name=="q" or student_name=="Q":break 149 student_obj=self.session.query(Student).filter_by(sname=student_name).first() 150 if student_obj: 151 record_obj = self.session.query(Record).\ 152 filter(Record.class_lesson_id==class_lesson_obj.id).\ 153 filter(Record.sid==student_obj.sid).first() 154 if record_obj: 155 score=input("输入修改后的成绩:") 156 record_obj.score=score 157 self.session.commit() 158 else: 159 print("输入错误:上课记录已存在") 160 else: 161 print("输入错误:当前班级的课程未创建") 162 else: 163 print("输入错误:当前课程未创建") 164 else: 165 print("输入错误:班级不存在") 166 167 def quit(self): 168 obj = action.Action() 169 obj.func()