zhangmingda

sqlalchemy-orm学生签到 成绩记录查询系统

#!/usr/bin/env python
# Author:zhangmingda
\'\'\'\'\'\'
from sqlalchemy import create_engine,ForeignKey,DATE,Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship,sessionmaker
engine = create_engine("mysql+pymysql://zhangmingda:Wyf@1314@120.92.133.227/stu_record_project?charset=utf8",encoding=\'utf8\',echo=False)
\'\'\'说明:engine 如果想写入中文,在库名后面加入?charset=utf8 encoding=utf-8 不起作用\'\'\'
\'\'\'生成基类\'\'\'
Base = declarative_base()
#\'\'\'此表只存老师id和class id的对应关系\'\'\'
teacher_m2m_classes = Table(
    \'teacher_m2m_classes\', Base.metadata,
    Column(\'teacher_id\', Integer, ForeignKey(\'teachers.id\')),
    Column(\'class_id\', Integer, ForeignKey(\'classes.id\'))
)
#\'\'\'此表表示课节和班级的对应关系:一节课可能多个班级同时上\'\'\'
lessons_m2m_classes = Table(
    \'lessons_m2m_classes\',Base.metadata,
    Column(\'lesson_id\',Integer,ForeignKey(\'lessons.id\')),
    Column(\'class_id\',Integer,ForeignKey(\'classes.id\'))
)
#\'\'\'此表表示学生和班级的对应关系:一个班级多个学生,一个学生也可能报多个班\'\'\'
students_m2m_classes = Table(
    \'students_m2m_classes\', Base.metadata,
    Column(\'student_id\', Integer, ForeignKey(\'students.id\')),
    Column(\'class_id\', Integer, ForeignKey(\'classes.id\'))
)

class Teacher(Base):
    \'\'\'老师表\'\'\'
    __tablename__ = \'teachers\'
    __table_args__ = {\'mysql_charset\': \'utf8\'}
    id = Column(Integer,primary_key=True)
    name = Column(String(64),nullable=False,unique=True)
    classes = relationship(\'Class\',secondary=teacher_m2m_classes,backref=\'teachers\')
    def __repr__(self):
        return "讲师:%s"% self.name

class Student(Base):
    \'\'\'学生表\'\'\'
    __tablename__ = \'students\'
    __table_args__ = {\'mysql_charset\': \'utf8\'}
    id = Column(Integer,primary_key=True)
    name = Column(String(64),nullable=False)
    QQ = Column(String(64),nullable=False,unique=True)
    def __repr__(self):
        return "学生:%s"% self.name

class Class(Base):
    \'\'\'班级表\'\'\'
    __tablename__ = \'classes\'
    __table_args__ = {\'mysql_charset\': \'utf8\'}
    id = Column(Integer, primary_key=True)
    name = Column(String(64), nullable=False, unique=True)
    students = relationship(\'Student\',secondary=students_m2m_classes,backref=\'classes\')
    def __repr__(self):
        return  self.name

class  Lesson(Base):
    \'\'\'课节表\'\'\'
    __tablename__ = \'lessons\'
    __table_args__ = {\'mysql_charset\': \'utf8\'}
    id = Column(Integer,primary_key=True)
    name = Column(String(64), nullable=False, unique=True)
    lesson_class = relationship(\'Class\',secondary=lessons_m2m_classes,backref=\'lessons\')
    def __repr__(self):
        return self.name #\'课节;%s\'%
class Stu_record(Base):
    \'\'\'上课记录表\'\'\'
    __tablename__ = \'stu_record\'
    __table_args__ = {\'mysql_charset\': \'utf8\'}
    id = Column(Integer,primary_key=True)
    lesson_id = Column(Integer,ForeignKey(\'lessons.id\'))
    stu_id = Column(Integer,ForeignKey(\'students.id\'))
    status = Column(String(64),nullable=True)
    homework = Column(String(64),nullable=True)
    score = Column(Integer,nullable=True)
    lessons_name = relationship(\'Lesson\',backref=\'lessons_record\')
    student = relationship(\'Student\',backref=\'lessons_record\')
    def __repr__(self):
        return \'%s 课节 学员:%s   状态:%s  成绩 :%s \'%(self.lessons_name,self.student,self.status,self.score)

if __name__ == \'__main__\':
    Base.metadata.create_all(engine)
table_class
#!/usr/bin/env python
# Author:zhangmingda
import teacher_active,student_active,tables_class
from sqlalchemy.orm import sessionmaker

SessionClass = sessionmaker(bind=tables_class.engine)
session = SessionClass()

# teacher = teacher_active.Teacher_view(session)
# teacher.handle()



student = student_active.Student_view(session)
student.handle()
main
#!/usr/bin/env python
# Author:zhangmingda
import tables_class

class Teacher_view(object):
    def __init__(self,session):
        self.session = session
        self.login_status = False
        self.teacher_obj = None
        # self
    def auth(self):
        \'\'\'简易登录认证\'\'\'
        while True:
            teacher_name = input(\'\033[34;1m请输入讲师名字:\033[0m\').strip()
            teacher_obj = self.session.query(tables_class.Teacher).filter_by(name=teacher_name).first()
            if teacher_obj:
                self.teacher_obj = teacher_obj
                self.login_status = True
                break
            else:
                continue
    def handle(self):
        while not self.login_status:
            self.auth()
        else:
            while self.login_status:
                print(\'\033[32;1m欢迎进入讲师操作界面,请输入要操作的代号:\033[0m\')
                menu = {
                    1:"创建班级",
                    2:"创建课节",
                    3:"向班级添加学员",
                    4:"修改学员上课记录",
                    5:"修改学员成绩",
                    6:"退出系统",
                }
                menu_dict = {
                    "1": self.create_class,
                    "2": self.create_lesson,
                    "3": self.add_student,
                    "4": self.modify_record,
                    "5": self.modify_score,
                    "6": \'exit\'
                }
                for i in menu:
                    print(i,menu[i])
                chose = input(\'请选择>>>\').strip()
                if  chose in menu_dict and chose != "6" :
                    menu_dict[chose]()
                elif chose == \'6\':break
                else:
                    print(\'\033[31;1m您输入的代号不存在,请重新输入。\033[0m\')

    def create_class(self):
        class_name = input(\'\033[32;0m要创建班级名称:\033[0m\').strip()
        class_exist = self.session.query(tables_class.Class).filter_by(name=class_name).first()
        if class_exist:
            print(\'\033[31;1m班级名称已存在:%s\033[0m\'% class_exist)
        else:
            class_obj = tables_class.Class(name=class_name)
            self.teacher_obj.classes.append(class_obj)
            self.session.add_all([class_obj])
            self.session.commit()
            print(\'\033[32;1m班级:%s创建成功\033[0m\'%class_obj)
    def create_lesson(self):
        classes = self.teacher_obj.classes
        if not classes:
            print(\'\033[31;1m您不教任何一个班级,无法创建课程\033[0m\')
        else :
            print(\'\033[32;1m您所教班级有\033[0m\')
            for i in classes:
                print(i)
            while True:
                input_class = input(\'\033[32;1m 请输入要创建课程的班级名称>>>\033[0m\').strip()
                class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
                if not class_obj:
                    print(\'\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m\')
                else:
                    class_lessons = class_obj.lessons
                    print(\'\033[33;1m班级:%s当前已关联课程:%s\'%(class_obj,class_lessons))
                    lesson_name = input(\'\033[32;1m 输入要创建的课程名称>>> \033[0m\')
                    lesson_obj_exist = self.session.query(tables_class.Lesson).filter_by(name=lesson_name).first()
                    #课程已存在,并且已经关联该班级
                    if lesson_obj_exist  in list(class_lessons):
                        print(\'\033[31;1m %s 下课程:%s已存在,请重新添加\033[0m\'%(class_obj,lesson_obj_exist))
                     #\'\'\'课程已存在,但未关联该班级\'\'\'
                    elif lesson_obj_exist and lesson_obj_exist not in list(class_lessons): #课程表中有,但未关联班级
                        \'\'\'list()将sqlalchemy的对象list转为普通list,用来做in的判断\'\'\'
                        print(\'\033[31;1m 课程名:%s库中已存在\033[0m,\033[32;1m直接加入到课程%s\033[0m\'%(lesson_name,class_obj))
                        class_obj.lessons.append(lesson_obj_exist) #将已有课程关联班级
                        self.session.commit()
                        # print(\'类型:\',type(lesson_obj_exist),\'测试\',type(list(class_lessons)))
                        break
                    #课程不存在
                    else:
                        lesson_obj = tables_class.Lesson(name=lesson_name) #创建课程对象
                        lesson_obj.lesson_class.append(class_obj) #将课程同班级关联
                        self.session.add_all([lesson_obj]) #加入session
                        self.session.commit() #提交保存到数据库
                        break

    def add_student(self):
        classes = self.teacher_obj.classes
        if not classes:
            print(\'\033[31;1m您不教任何一个班级,无法添加学生\033[0m\')
        else :
            print(\'\033[32;1m您所教班级有\033[0m\')
            for i in classes:
                print(i)
            while True:
                input_class = input(\'\033[32;1m 请输入要添加学员的班级名称>>>\033[0m\').strip()
                class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
                if not class_obj:
                    print(\'\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m\')
                else:
                    print(\'%s 班 已有学员 %s\'%(class_obj,class_obj.students))
                    input_stu = input(\'\033[32;1m 请输入要添加的学员QQ号码:\033[0m\').strip()
                    stu_obj = self.session.query(tables_class.Student).filter_by(QQ=input_stu).first()
                    if stu_obj and stu_obj  in list(class_obj.students):
                        print(\'\033[31;1m %s 已存在 %s 班\'%(stu_obj,class_obj))
                    elif not stu_obj:
                        print("\033[31;1m %s 不存在\033[0m"% stu_obj)
                    else:
                        class_obj.students.append(stu_obj)
                        self.session.commit()
                        print("\033[32;1m %s 添加到 %s 成功!\033[0m"%(stu_obj,class_obj))
                        break
                pass
    def modify_record(self):
        classes = self.teacher_obj.classes
        if not classes:
            print(\'\033[31;1m您不教任何一个班级,无法添加上课记录\033[0m\')
        else:
            print(\'\033[32;1m您所教班级有\033[0m\')
            for i in classes:
                print(i.id,i)
            while True:
                input_class_id = input(\'\033[32;1m 请选择班级名称代号>>>\033[0m\').strip()
                class_obj = self.session.query(tables_class.Class).filter_by(id=input_class_id).first()
                if not class_obj:
                    print(\'\033[31;1m 输入的班级代号不存在,请重新输入。\033[0m\')
                    # continue
                else:
                    while True:
                        print(\'%s 班 已有课程 %s\' % (class_obj, class_obj.lessons))
                        chose_lesson = input(\'\033[32;1m 请选择课程\033[0m\')
                        lesson_obj = self.session.query(tables_class.Lesson).filter_by(name=chose_lesson).first()
                        if lesson_obj in list(class_obj.lessons):
                            print(\'\033[32;1m %s 学生有:%s\033[0m\'%(class_obj,class_obj.students))
                            for stu in list(class_obj.students):
                                status = input(\'%s %s %s QQ:%s 打卡状态》:\'%(class_obj,lesson_obj,stu,stu.QQ)).strip()
                                if not status:
                                    print(\'跳过 :%s\'% stu)
                                    continue
                                else:
                                    record_obj = self.session.query(tables_class.Stu_record).filter_by(lesson_id=lesson_obj.id,
                                                                                                       stu_id=stu.id).first()
                                    if record_obj:
                                        record_obj.status = status
                                        self.session.commit()
                                        print(\'\033[33;1m 已有该学生记录,修改签到状态提交成功!\033[0m\')
                                        # break
                                    else:
                                        record_obj = tables_class.Stu_record(lesson_id=lesson_obj.id, stu_id=stu.id,
                                                                             status=status)
                                        self.session.add_all([record_obj])  # 加入session
                                        self.session.commit()  # 提交保存到数据库
                                        print(\'\033[33;1m 新建签到状态提交成功!!\033[0m\')
                            print(\'\033[32;1m 所有学生签到状态修改完成\033[0m\');break
                        else:
                            print(\'\033[31; 您选择的课程不存在该班级中\033[0m\')

                    break

        pass
    def modify_score(self):
        classes = self.teacher_obj.classes
        if not classes:
            print(\'\033[31;1m您不教任何一个班级,无法添加上课记录\033[0m\')
        else:
            print(\'\033[32;1m您所教班级有\033[0m\')
            for i in classes:
                print(i.id, i)
            while True:
                input_class_id = input(\'\033[32;1m 请选择班级名称代号,修改成绩>>>\033[0m\').strip()
                class_obj = self.session.query(tables_class.Class).filter_by(id=input_class_id).first()
                if not class_obj:
                    print(\'\033[31;1m 输入的班级代号不存在,请重新输入。\033[0m\')
                    # continue
                else:
                    while True:
                        print(\'%s 班 已有课程 %s\' % (class_obj, class_obj.lessons))
                        chose_lesson = input(\'\033[32;1m 请选择课程\033[0m\')
                        lesson_obj = self.session.query(tables_class.Lesson).filter_by(name=chose_lesson).first()
                        if lesson_obj in list(class_obj.lessons):
                            print(\'\033[32;1m %s 学生有:%s\033[0m\' % (class_obj, class_obj.students))
                            for stu in list(class_obj.students):
                                score = input(\'%s %s %s QQ:%s 输入成绩:\' % (class_obj, lesson_obj, stu, stu.QQ)).strip()
                                if not score:
                                    print(\'跳过 :%s\' % stu)
                                    continue
                                else:
                                    record_obj = self.session.query(tables_class.Stu_record).filter_by(
                                        lesson_id=lesson_obj.id,
                                        stu_id=stu.id).first()
                                    if record_obj:
                                        record_obj.score = score
                                        self.session.commit()
                                        print(\'\033[33;1m 已有该学生记录,修改学生成绩提交成功!\033[0m\')
                                        # break
                                    else:
                                        record_obj = tables_class.Stu_record(lesson_id=lesson_obj.id, stu_id=stu.id,
                                                                             score=score)
                                        self.session.add_all([record_obj])  # 加入session
                                        self.session.commit()  # 提交保存到数据库
                                        print(\'\033[33;1m 新建学生成绩提交成功!!\033[0m\')
                            print(\'\033[32;1m 所有学生成绩提交完成\033[0m\');break
                        else:
                            print(\'\033[31; 您选择的课程不存在该班级中\033[0m\')

                    break
        pass
teacher_active
#!/usr/bin/env python
# Author:zhangmingda
import tables_class

class Student_view(object):
    def __init__(self,session):
        self.session = session
        self.login_status = False
        self.student_obj = None
    def sign_up(self):
        name = input(\'\033[32;0m创建您的用户名:\033[0m \').strip()
        QQ = input(\'\033[32;0m输入您的QQ号码:\033[0m \')
        stu_obj = tables_class.Student(name=name,QQ=QQ)
        stu_exist = self.session.query(tables_class.Student).filter_by(QQ=QQ).first()
        if stu_exist:
            print(\'\033[31;1m%s 已存在  QQ:%s\033[0m\'%(stu_exist,stu_exist.QQ))
        else:
            print(\'库里没这QQ号的个人,开始创建\')
            self.session.add(stu_obj)
            self.session.commit()
            print(\'\033[32;1m %s 创建成功\033[0m\'% stu_obj)

    def auth(func):
        \'\'\'简易登录认证装饰器\'\'\'
        def wapper(*args,**kwargs):
            self = args[0] #将实例自己本身获取到
            while not self.login_status:
                student_name = input(\'\033[34;1m请输入学生名字:\033[0m\').strip()
                QQ = input(\'\033[34;1m请输入QQ号码:\033[0m\').strip()
                student_obj = self.session.query(tables_class.Student).filter_by(name=student_name,QQ=QQ).first()
                if student_obj:
                    self.student_obj = student_obj
                    self.login_status = True
                    func(self)
                    break
                else:
                    print(\'\033[31;1m 用户不存在\033[0m\')
            else:
                func(self)
        return wapper

    @auth
    def hand_in_homework(self):

        classes = self.student_obj.classes
        if not classes:
            print(\'\033[31;1m您未加入任何班级,无法交作业\033[0m\')
        else :
            print(\'\033[32;1m您已报培训班\033[0m\')
            for i in classes:
                print(i)
            while True:
                input_class = input(\'\033[32;1m 请输入要交作业的班级名称>>>\033[0m\').strip()
                class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
                if not class_obj:
                    print(\'\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m\')
                else:
                    class_lessons = class_obj.lessons
                    print(\'\033[33;1m班级:%s当前已关联课程:%s\'%(class_obj,class_lessons))
                    lesson_name = input(\'\033[32;1m 输入要交作业的课程名称>>> \033[0m\')
                    lesson_obj_exist = self.session.query(tables_class.Lesson).filter_by(name=lesson_name).first()
                    #课程已存在,并且已经关联该班级
                    if lesson_obj_exist  in list(class_lessons):
                        lesson_id = lesson_obj_exist.id
                        stu_id = self.student_obj.id
                        homework = \'Already Submit\'
                        record_obj = self.session.query(tables_class.Stu_record).filter_by(lesson_id=lesson_id,stu_id=stu_id).first()
                        if record_obj:
                            record_obj.homework = homework
                            self.session.commit()
                            print(\'\033[33;1m 作业提交成功!\033[0m\')
                            break
                        else:
                            record_obj = tables_class.Stu_record(lesson_id=lesson_id,stu_id=stu_id,homework=homework)
                            self.session.add_all([record_obj]) #加入session
                            self.session.commit() #提交保存到数据库
                            print(\'\033[33;1m 作业提交成功!\033[0m\')
                            break

    @auth
    def show_score(self):
        classes = self.student_obj.classes
        if not classes:
            print(\'\033[31;1m您未加入任何班级,无法查看成绩\033[0m\')
        else:
            print(\'\033[32;1m您已报培训班\033[0m\')
            for i in classes:
                print(i)
            while True:
                input_class = input(\'\033[32;1m 请输入要查看成绩的班级名称>>>\033[0m\').strip()
                class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
                if not class_obj:
                    print(\'\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m\')
                else:
                    class_lessons = class_obj.lessons
                    print(\'\033[33;1m班级:%s当前已关联课程:%s\' % (class_obj, class_lessons))
                    lesson_name = input(\'\033[32;1m 输入要查看成绩的课程名称,查看全部输入:all>>> \033[0m\')
                    lesson_obj_exist = self.session.query(tables_class.Lesson).filter_by(name=lesson_name).first()
                    # 课程已存在,并且已经关联该班级
                    if lesson_obj_exist in list(class_lessons):
                        lesson_id = lesson_obj_exist.id
                        stu_id = self.student_obj.id
                        stu_record_obj = self.session.query(tables_class.Stu_record).filter_by(lesson_id=lesson_id,stu_id=stu_id).first()
                        # print(\'\033[32;1m%s %s 成绩:%s\033[0m\'% (self.student_obj,lesson_obj_exist,stu_record_obj.score))
                        print(stu_record_obj)
                        break
                    elif lesson_name == \'all\':
                        print(\'\033[32;1m 您 %s 全部课程成绩如下 \033[0m\'% class_obj)
                        stu_record_obj_all = self.session.query(tables_class.Stu_record).filter_by(stu_id=self.student_obj.id).all()
                        for stu_record_obj in stu_record_obj_all:
                            if stu_record_obj.lessons_name in list(class_lessons):
                                print(stu_record_obj)
                        break
                    else:
                        print(\'\033[31 您输入的课程不存在\033[0m\')
    @auth
    def show_ranking(self):
        classes = self.student_obj.classes
        if not classes:
            print(\'\033[31;1m您未加入任何班级,无法查看成绩排名\033[0m\')
        else:
            print(\'\033[32;1m您已报培训班\033[0m\')
            for i in classes:
                print(i)
            while True:
                input_class = input(\'\033[32;1m 请输入要查看成绩的班级名称>>>\033[0m\').strip()
                class_obj = self.session.query(tables_class.Class).filter_by(name=input_class).first()
                if not class_obj:
                    print(\'\033[31;1m 输入的班级名称不存在,请重新输入。\033[0m\')
                else:
                    class_lessons = class_obj.lessons
                    print(\'\033[33;1m班级:%s当前已关联课程:%s\' % (class_obj, class_lessons))
                    lesson_name = input(\'\033[32;1m 输入要查看成绩的课程名称>>> \033[0m\')
                    lesson_obj_exist = self.session.query(tables_class.Lesson).filter_by(name=lesson_name).first()
                    if lesson_obj_exist in list(class_lessons):
                        students_score = self.session.query(tables_class.Stu_record).filter_by(lesson_id=lesson_obj_exist.id).order_by(tables_class.Stu_record.score.desc()).all()
                        students_score_list = list(students_score)
                        for ranking,score_obj in enumerate(students_score_list,1):
                            if score_obj.stu_id == self.student_obj.id:
                                print(\'\033[32;1m 您在 %s %s 中排第%s名\033[0m\'%(class_obj,lesson_obj_exist,ranking))
                        break
                    else:
                        print(\'\033[31 您输入的课程不存在\033[0m\')

    def handle(self):
        while True:
            print(\'\033[32;1m欢迎进入学生操作界面,请输入要操作的代号:\033[0m\')
            menu = {
                1:"注册",
                2:"交作业",
                3:"查看成绩",
                4:"查看排名",
                5:"退出系统"
            }
            menu_dict = {
                "1": self.sign_up,
                "2": self.hand_in_homework,
                "3": self.show_score,
                "4": self.show_ranking,
                "5": \'exit\'
            }
            for i in menu:
                print(i,menu[i])
            chose = input(\'请选择>>>\').strip()
            if  chose in menu_dict and chose != "5" :
                menu_dict[chose]()
            elif chose == \'5\':break
            else:
                print(\'\033[31;1m您输入的代号不存在,请重新输入。\033[0m\')
        pass
student_active

 

 
 
 

分类:

技术点:

相关文章: