• python作业学员管理系统(第十二周)


    作业需求:

    用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下

    讲师视图

      管理班级,可创建班级,根据学员qq号把学员加入班级

      可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上课纪录, 即每节课都有整班学员上, 为了纪录每位学员的学习成绩,需在创建每节上课纪录是,同时 为这个班的每位学员创建一条上课纪录

      为学员批改成绩, 一条一条的手动修改成绩

    学员视图

    提交作业

    查看作业成绩

    一个学员可以同时属于多个班级,就像报了Linux的同时也可以报名Python一样, 所以提交作业时需先选择班级,再选择具体上课的节数

    附加:学员可以查看自己的班级成绩排名

    数据库关联示意图:

    思路解析:

    按照数据库关联,操作班级教室分数和上课记录

    讲师视图
    1.管理班级,可创建班级
      操作class表,输入classname后显示现在有几个课程几个课程表,然后让讲师创建TeacheCourse关联后才能创建班级
    2. 根据学员qq号把学员加入班级
      操作StudentTeachClass表,把qq号加入班级ID,然后显示,课程,课程表,班级,学员,
    3. 可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上课纪录,即每节课都有整班学员上,为了纪录每位学员的学习成绩,需在创建每节上课纪录,同时为这个班的每位学员创建一条上课纪录
      进入后显示班级,根据进入时候的班级讲师ID,操作teacherclass,操作teacher_course,找到对应的学生查看对应的班级的童鞋,操作RecordStudent
    4. 为学员批改成绩, 一条一条的手动修改成绩
      1. 进入后显示班级,根据进入时候的班级讲师ID,操作teacherclass,操作teacher_course,
      2. 查看StudentHomework,查看学生的作业
      3. 为学员一条一条修改成绩和创建上课记录,操作RecordScore
    学员视图
    1. 提交作业
      显示课程,班级,上课节数,提交作业,做成绑定
    2. 查看作业成绩
      查看RecordScore
    3. 一个学员可以同时属于多个班级,就像报了Linux的同时也可以报名Python一样, 所以提交作业时需先选择班级,再选择具体上课的节数
    4. 附加:学员可以查看自己的班级成绩排名
      操作recordscore
      排名,读取出所有的成绩和姓名,然后进行排序

    Readme:

    作者:yaobin
    
    版本: 学员管理系统 示例版本 v0.1
    
    开发环境: python3.6
    
    程序介绍:
    
    讲师视图
    
      管理班级,可创建班级,根据学员qq号把学员加入班级
      可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上课纪录, 即每节课都有整班学员上,
        为了纪录每位学员的学习成绩,需在创建每节上课纪录是,同时为这个班的每位学员创建一条上课纪录
      为学员批改成绩, 一条一条的手动修改成绩
    
    学员视图
    
        提交作业
        查看作业成绩
        一个学员可以同时属于多个班级,就像报了Linux的同时也可以报名Python一样, 所以提交作业时需先选择班级,再选择具体上课的节数
        附加:学员可以查看自己的班级成绩排名
    
    文件目录结构
    
    ├── bin
    │   ├── __init__.py
    │   └── tiny.py  # 主程序
    ├── conf
    │   ├── action_registers.py  # 程序命令交互
    │   ├── __init__.py
    │   └── settings.py  # 配置文件
    ├── log
    │   └── __init__.py
    ├── modules
    │   ├── actions.py  # 欢迎页和程序命令交互
    │   ├── db_conn.py  # mysql连接交互
    │   ├── utils.py  # yaml配置交互
    │   └── views.py  # 创建表,表数据创建,查看数据库数据交互
    │   └── db_insert.py  # 插入数据范例
    ├── Server.zip
    └── share
        └── examples
            ├── new_bindhosts.yml  # 主机绑定关系配置文件
            ├── new_groups.yml  # 组创建,组关系绑定配置文件
            ├── new_hosts.yml  # 主机配置文件
            ├── new_remoteusers.yml  # 主机用户名密码配置文件
            └── new_user.yml  # 堡垒机用户配置文件
    View Code

    使用方法:

    python3 bin/manage.py syncdb
    python3 modules/db_insert.py
    python3 bin/manage.py teacher
    python3 bin/manage.py student

    核心代码:

    view.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Time:2017/12/15 21:34
    __Author__ = 'Sean Yao'
    import sqlalchemy.exc
    from modules import models
    from conf import settings
    from modules.utils import print_err, yaml_parser
    from modules.db_conn import engine, session
    import codecs
    
    def syncdb(argvs):
        '''
        创建表结构方法
        :param argvs:
        :return:
        '''
        print("Syncing DB....")
        engine = models.create_engine(settings.ConnParams, echo=True)
        models.Base.metadata.create_all(engine)  # 创建所有表结构
    
    def auth_teacher():
        '''
        用户验证
        do the user login authentication
        :return:
        '''
        count = 0
        while count < 3:
            username = input("33[32;1mUsername:33[0m").strip()
            if len(username) == 0:
                continue
            password = input("33[32;1mPassword:33[0m").strip()
            if len(password) == 0:
                continue
            user_obj = session.query(models.Teacher).filter(models.Teacher.username == username,
                                                            models.Teacher.password == password).first()
            if user_obj:
                return user_obj
            else:
                print("wrong username or password, you have %s more chances." % (3-count-1))
                count += 1
        else:
            print_err("too many attempts.")
    
    def auth_student():
        '''
        用户验证
        do the user login authentication
        :return:
        '''
        count = 0
        while count < 3:
            username = input("33[32;1mUsername:33[0m").strip()
            if len(username) == 0:
                continue
            password = input("33[32;1mPassword:33[0m").strip()
            if len(password) == 0:
                continue
            user_obj = session.query(models.Student).filter(models.Student.username == username,
                                                            models.Student.password == password).first()
            if user_obj:
                return user_obj
            else:
                print("wrong username or password, you have %s more chances." % (3-count-1))
                count += 1
        else:
            print_err("too many attempts.")
    
    def list1(dict: dict):
        ''' 将字典转化为列表 '''
        keys = dict.keys()
        vals = dict.values()
        list = [(key, val) for key, val in zip(keys, vals)]
        return list
    
    def welcome_msg(user):
        '''
        :param user:
        :return:
        '''
        WELCOME_MSG = '''33[32;1m
        ------------- Welcome [%s] login  -------------
        33[0m''' % user.username
        print(WELCOME_MSG)
    
    def show_class(user):
        '''
        show教室
        :param user:
        :return:
        '''
        print('%s 请参照现有课程教室管理' % user.username)
        data = session.query(models.ClassRoom).filter_by().all()
        print('所有班级')
        for index, x in enumerate(data):
            print(index, x.classname)
    
    def show_course(user):
        '''
        展示课程,课程安排,教室
        :param user:
        :return:
        '''
        print('你可以创建班级关系或给学生分配班级')
        teacher_class_obj = session.query(models.TeacherClass).filter_by(teacher_id=user.id).all()
        for i in teacher_class_obj:
            course_teacher_obj = session.query(models.TeacheCourse).filter_by(bind_teacher_class_id=i.id).all()
            for x in course_teacher_obj:
                time_course_obj = session.query(models.CourseClassRecord).filter_by(id=x.bind_course_time_id).first()
                print('课堂ID: %s 课程:%s 课程安排:%s 教室:%s' % (x.id, time_course_obj.course.coursename,
                                                        time_course_obj.course_time.course_time_name,
                                                        i.class_room.classname))
    
    def show_student_class(user):
        print('%s 你所在的班级' % user.username)
        student_class_obj = session.query(models.StudentTeachClass).filter_by(student_qq=user.qq_number).all()
        for i in student_class_obj:
            class_teacher_obj = session.query(models.TeacherClass).filter_by(
                id=i.teacher_course.bind_teacher_class_id).first()
            course_obj = session.query(models.CourseClassRecord).filter_by(
                id=i.teacher_course.bind_course_time_id).first()
            studentname_obj = session.query(models.Student).filter_by(
                qq_number=i.student.qq_number).first()
            print('绑定id:%s 课程:%s 课程时间:%s 讲师:%s 教室:%s 学生名:%s 学生qq %s' % (
                i.id, course_obj.course.coursename, course_obj.course_time.course_time_name,
                class_teacher_obj.teacher.username, class_teacher_obj.class_room.classname,
                studentname_obj.username, studentname_obj.qq_number))
    
    def view_student():
        '''
        查看学生
        '''
        student_obj = session.query(models.Student).filter_by().all()
        for i in student_obj:
            # 学生姓名QQ
            print('现有学生:%s 学生QQ:%s' % (i.username, i.qq_number))
        print("----------- END -----------")
    
    def view_student_class(user):
        '''
        查看该教室的学生,通过学生和老师id反查
        :param user:
        :return:
        '''
        teacher_class_obj = session.query(models.TeacherClass).filter_by(teacher_id=user.id).all()
        for i in teacher_class_obj:
            teachecourse_obj = session.query(
                models.TeacheCourse).filter_by(bind_teacher_class_id=i.id).all()
            for y in teachecourse_obj:
                student_teachclass_obj = session.query(models.StudentTeachClass).filter_by(teacher_course_id=y.id).all()
                for x in student_teachclass_obj:
                    class_teacher_obj = session.query(models.TeacherClass).filter_by(
                        id=x.teacher_course.bind_teacher_class_id).first()
                    course_obj = session.query(models.CourseClassRecord).filter_by(
                        id=x.teacher_course.bind_course_time_id).first()
                    studentname_obj = session.query(models.Student).filter_by(
                        qq_number=x.student.qq_number).first()
                    print('绑定id:%s 课程:%s 课程时间:%s 讲师:%s 教室:%s 学生名:%s 学生qq %s' % (
                        x.id, course_obj.course.coursename, course_obj.course_time.course_time_name,
                        class_teacher_obj.teacher.username, class_teacher_obj.class_room.classname,
                        studentname_obj.username, studentname_obj.qq_number))
    
    def view_record(user):
        '''
        查看上课记录
        :param user:
        :return:
        '''
        record_student = session.query(models.RecordStudent).filter_by().all()
        for i in record_student:
            student_teachclass_obj = session.query(models.StudentTeachClass). 
                filter_by(id=i.student_teach_class_id).first()
            class_teacher_obj = session.query(models.TeacherClass).filter_by(
                id=student_teachclass_obj.teacher_course.bind_teacher_class_id).first()
            course_obj = session.query(models.CourseClassRecord).filter_by(
                id=student_teachclass_obj.teacher_course.bind_course_time_id).first()
            studentname_obj = session.query(models.Student).filter_by(
                qq_number=student_teachclass_obj.student.qq_number).first()
            if class_teacher_obj.teacher.username == user.username:
                print('绑定id:%s 课程:%s 课程时间:%s 讲师:%s 教室:%s 学生名:%s 学生qq %s 上课记录:%s' % (
                    student_teachclass_obj.id, course_obj.course.coursename, course_obj.course_time.course_time_name,
                    class_teacher_obj.teacher.username, class_teacher_obj.class_room.classname,
                    studentname_obj.username, studentname_obj.qq_number, i.record.record))
    
    def view_homework(user):
        '''
        查看作业
        :param user:
        :return:
        '''
        record_student = session.query(models.RecordStudent).filter_by().all()
        for i in record_student:
            student_teachclass_obj = session.query(models.StudentTeachClass). 
                filter_by(id=i.student_teach_class_id).first()
            class_teacher_obj = session.query(models.TeacherClass).filter_by(
                id=student_teachclass_obj.teacher_course.bind_teacher_class_id).first()
            course_obj = session.query(models.CourseClassRecord).filter_by(
                id=student_teachclass_obj.teacher_course.bind_course_time_id).first()
            studentname_obj = session.query(models.Student).filter_by(
                qq_number=student_teachclass_obj.student.qq_number).first()
            studenthomework_obj = session.query(models.StudentHomework).filter_by(
                student_teach_class_id=i.student_teach_class_id).first()
            if studenthomework_obj:
                if class_teacher_obj.teacher.username == user.username:
                    print('绑定ID %s 课程:%s 课程时间:%s 讲师:%s 教室:%s 学生名:%s 学生qq %s 上课记录:%s 作业:%s' % (
                        student_teachclass_obj.id, course_obj.course.coursename, course_obj.course_time.course_time_name,
                        class_teacher_obj.teacher.username, class_teacher_obj.class_room.classname,
                        studentname_obj.username, studentname_obj.qq_number, i.record.record,
                        studenthomework_obj.homework.home_work))
    
    def view_score(user):
        '''
        查看分数
        :param user:
        :return:
        '''
        record_student = session.query(models.RecordStudent).filter_by().all()
        for i in record_student:
            student_teachclass_obj = session.query(models.StudentTeachClass). 
                filter_by(id=i.student_teach_class_id).first()
            class_teacher_obj = session.query(models.TeacherClass).filter_by(
                id=student_teachclass_obj.teacher_course.bind_teacher_class_id).first()
            course_obj = session.query(models.CourseClassRecord).filter_by(
                id=student_teachclass_obj.teacher_course.bind_course_time_id).first()
            studentname_obj = session.query(models.Student).filter_by(
                qq_number=student_teachclass_obj.student.qq_number).first()
            studenthomework_obj = session.query(models.StudentHomework).filter_by(
                student_teach_class_id=i.student_teach_class_id).first()
            score_obj = session.query(models.RecordScore).filter_by(student_teach_class_id=i.student_teach_class_id).first()
            if studenthomework_obj:
                if score_obj:
                    if class_teacher_obj.teacher.username == user.username:
                        if score_obj.student_teacher_class.student.qq_number == studentname_obj.qq_number:
                            print('绑定ID %s 课程:%s 课程时间:%s 讲师:%s 教室:%s 学生名:%s 学生qq %s 上课记录:%s 作业:%s 分数:%s'
                                  % (student_teachclass_obj.id, course_obj.course.coursename,
                                     course_obj.course_time.course_time_name, class_teacher_obj.teacher.username,
                                     class_teacher_obj.class_room.classname, studentname_obj.username,
                                     studentname_obj.qq_number, i.record.record, studenthomework_obj.homework.home_work,
                                     score_obj.score.score))
    
    def teacher(argvs):
        '''
        讲师视图
        :param argvs:
        :return:
        '''
        user = auth_teacher()
        if user:
            welcome_msg(user)
            exit_flag = False
            while not exit_flag:
                show_class(user)
                show_course(user)
                msg = '''
                1) 创建班级
                2)添加学员到班级
                3)上课记录
                4)批改成绩
                5)添加学员
                '''
                print(msg)
                while not exit_flag:
                    user_option = input("[ (q)quit, select num to manage]:").strip()
                    if len(user_option) == 0:
                        continue
                    if user_option == 'q':
                        exit_flag = True
                    if user_option == '1':
                        course_name = input('请输入班级上的课程>>>>: ')
                        if len(course_name) == 0:
                            print('sorry...班级不能为空')
                            break
                        else:
                            course_time = input('请输入课程时间安排>>>>:')
                            if len(course_time) == 0:
                                print('sorry...课程时间不能为空')
                                break
                            else:
                                class_name = input('请输入班级名称>>>:')
                                if len(class_name) == 0:
                                    print('sorry...班级名称不能为空')
                                    break
                        # 课程名
                        course_name_obj = session.query(models.Course).filter_by(coursename=course_name).first()
                        # 课程安排
                        course_time_obj = session.query(models.CourseTime).filter_by(course_time_name=course_time).first()
                        # 教室名
                        class_name_obj = session.query(models.ClassRoom).filter_by(classname=class_name).first()
                        # 添加课程
                        if course_name_obj:
                            pass
                        else:
                            course_name_db_obj = models.Course(coursename=course_name)
                            session.add(course_name_db_obj)
                            session.commit()
                        # 添加课程安排
                        if course_time_obj:
                            pass
                        else:
                            course_time_db_obj = models.CourseTime(course_time_name=course_time)
                            session.add(course_time_db_obj)
                            session.commit()
                        if class_name_obj:
                            pass
                        else:
                            class_name_db_obj = models.ClassRoom(classname=class_name)
                            session.add(class_name_db_obj)
                            session.commit()
    
                        course_name = session.query(models.Course).filter_by(coursename=course_name).first()
                        course_time = session.query(models.CourseTime).filter_by(course_time_name=course_time).first()
                        class_name = session.query(models.ClassRoom).filter_by(classname=class_name).first()
    
                        # 创建课程课程时间关联
                        course_class_record_id_obj = session.query(models.CourseClassRecord).filter_by(
                            course_id=course_name.id).filter_by(course_time_id=course_time.id).all()
                        if course_class_record_id_obj:
                            pass
                        else:
                            course_class_record_id_obj = models.CourseClassRecord(course_id=course_name.id,
                                                                                  course_time_id=course_time.id)
                            session.add(course_class_record_id_obj)
                            session.commit()
    
                        # 添加讲师教室关联
                        teacher_class_id_obj = session.query(models.TeacherClass).filter_by(
                             teacher_id=user.id).filter_by(class_room_id=class_name.id).all()
                        if teacher_class_id_obj:
                            pass
                        else:
                            teacher_class_id_obj = models.TeacherClass(teacher_id=user.id, class_room_id=class_name.id)
                            session.add(teacher_class_id_obj)
                            session.commit()
    
                        # 查老师的对象
                        db_teacher_obj = session.query(models.Teacher).filter_by(id=user.id).first()
                        # 查课程对象
                        db_course_name_obj = session.query(models.Course).filter_by(
                            coursename=course_name.coursename).first()
                        # 查课程安排对象
                        db_course_time_obj = session.query(models.CourseTime). 
                            filter_by(course_time_name=course_time.course_time_name).first()
                        # 查教室对象
                        db_class_obj = session.query(models.ClassRoom).filter_by(classname=class_name.classname).first()
    
                        # 教室讲师关联对象
                        db_teacher_class_obj = session.query(models.TeacherClass).filter_by(
                            class_room_id=db_class_obj.id).filter_by(teacher_id=user.id).first()
                        # 课程课程安排关联对象
                        db_course_class_obj = session.query(models.CourseClassRecord).filter_by(
                            course_id=db_course_name_obj.id).filter_by(course_time_id=db_course_time_obj.id).first()
    
                        if db_teacher_class_obj and db_course_class_obj:
                            teacher_class = session.query(models.TeacheCourse).filter_by(
                                bind_teacher_class_id=db_teacher_class_obj.id).filter_by(
                                bind_course_time_id=db_course_class_obj.id).all()
                            if teacher_class:
                                print('班级已经关联了')
                            else:
                                teachecourse = models.TeacheCourse(bind_teacher_class_id=db_teacher_class_obj.id,
                                                                   bind_course_time_id=db_course_class_obj.id)
                                session.add(teachecourse)
                                session.commit()
                                print('班级创建完毕')
                                show_course(user)
    
                    elif user_option == '2':
                        view_student()
                        view_student_class(user)
                        show_course(user)
                        add_choice = input('[ (y)是,(n)否, select num to manage]:').strip()
                        if add_choice == 'n':
                            break
                        elif add_choice == 'y':
                            teacher_input_qq = input('请输入学员QQ号>>>: ')
                            teacher_input_courseid = input('请输入课堂ID>>>:')
                            try:
                                qq = int(teacher_input_qq)
                                courseid = int(teacher_input_courseid)
                            except ValueError:
                                print('qq或课堂ID必须是数字')
                                break
                            student_teachclass_check_obj = session.query(
                                models.StudentTeachClass).filter_by(
                                teacher_course_id=teacher_input_courseid).filter_by(student_qq=teacher_input_qq).all()
                            if student_teachclass_check_obj:
                                print('学生已经在班级里了....')
                            else:
                                student_obj = session.query(models.Student).filter_by(qq_number=qq).all()
                                if student_obj:
                                    for i in student_obj:
                                        if teacher_input_qq == str(i.qq_number):
                                            student_class_obj = models.StudentTeachClass(
                                                teacher_course_id=courseid, student_qq=qq)
                                            session.add(student_class_obj)
                                            session.commit()
                                            view_student_class(user)
                                else:
                                    print('没有这个学生')
                        else:
                            print('no this option')
    
                    elif user_option == '3':
                        print('
    %s 管理的班级学员
    ' % user.username)
                        view_student_class(user)
                        print('
    %s 管理的班级的上课记录
    ' % user.username)
                        view_record(user)
                        record_choice = input('[ (y)是,(n)否, select num to manage]:').strip()
                        if record_choice == 'n':
                            break
                        elif record_choice == 'y':
                            record_id_input = input('请输入绑定id添加学员上课记录:')
                            # 插入绑定关系
                            record_input = input('[ 请输入学员上课记录(y)yes,(no)否]')
                            try:
                                courseid = int(record_id_input)
                            except ValueError:
                                print('绑定ID必须是数字')
                                break
                            if record_input == 'yes' or 'no':
                                record_in_obj = session.query(
                                    models.RecordStudent).filter_by(student_teach_class_id=record_id_input).all()
                                if record_in_obj:
                                    print('记录已经添加...')
                                else:
                                    record_in_obj = session.query(models.Record).filter_by(record=record_input).first()
                                    student_teachclass_id_obj = models.RecordStudent(
                                        student_teach_class_id=record_id_input, record_id=record_in_obj.id)
                                    session.add(student_teachclass_id_obj)
                                    session.commit()
                                    view_record(user)
                        else:
                            print('no this option')
    
                    elif user_option == '4':
                        print('
    %s 管理的班级的上课记录
    ' % user.username)
                        view_record(user)
                        print('
    已交作业的童鞋
    ')
                        view_homework(user)
                        print('
    已批改的成绩
    ')
                        view_score(user)
                        choice_score_input = input('[ 批改成绩是否继续(y)是,(n)否, select num to manage]:').strip()
                        if choice_score_input == 'n':
                            break
                        elif choice_score_input == 'y':
                            while not exit_flag:
                                record_id_input = input('请输入显示的绑定id添加学员成绩:')
                                score_input = input('请输入分数..')
                                # 插入绑定关系
                                home_work_check = session.query(
                                    models.StudentHomework).filter_by(student_teach_class_id=int(record_id_input)).all()
                                if home_work_check:
                                    score = int(score_input)
                                    if score > 100 or score < 0:
                                        print('请输入100以内的整数')
                                    else:
                                        score_obj = session.query(models.Score).filter_by(score=score).all()
                                        if score_obj:
                                            for i in score_obj:
                                                score_db_id_obj = session.query(
                                                    models.Score).filter_by(score=i.score).first()
                                                record_score_obj = session.query(models.RecordScore).filter_by(
                                                    student_teach_class_id=record_id_input).first()
                                                if record_score_obj:
                                                    print('该学员已经有成绩了...')
                                                    break
                                                else:
                                                    add_score_obj = models.RecordScore(
                                                        student_teach_class_id=record_id_input, score_id=score_db_id_obj.id)
                                                    session.add(add_score_obj)
                                                    session.commit()
                                                    print('添加成绩完成')
                                                    view_score(user)
                                        else:
                                            score_db_obj = models.Score(score=score)
                                            session.add(score_db_obj)
                                            session.commit()
                                            score_db_id_obj = session.query(models.Score).filter_by(score=score).first()
                                            record_score_obj = session.query(models.RecordScore).filter_by(
                                                student_teach_class_id=record_id_input).first()
                                            if record_score_obj:
                                                print('该学员已经有成绩了...')
                                                break
                                            else:
                                                add_score_obj = models.RecordScore(
                                                    student_teach_class_id=record_id_input, score_id=score_db_id_obj.id)
                                                session.add(add_score_obj)
                                                session.commit()
                                                print('添加成绩完成')
                                                view_score(user)
                                else:
                                    print('学生还没有交作业,请先联系学生交作业')
                                    break
                        else:
                            print('no this option')
                            pass
                    elif user_option == '5':
                        print('添加学员后请注意给学生分配教室并添加上课记录,课后请提示学生交作业')
                        student_add_input = input('[ 批改成绩是否继续(y)是,(n)否, select num to manage]:').strip()
                        student_name_input = input('请输入学生账号:')
                        student_password_input = input('请输入学生密码:')
                        student_qq_input = input('请输入学生qq号码:')
                        try:
                            qq = int(student_qq_input)
                        except ValueError:
                            print('qq必须是数字')
                            break
                        # 联合查询
                        student_check = session.query(
                            models.Student).filter_by(qq_number=qq).filter_by(username=student_name_input).all()
                        if student_check:
                            print('学生已经存在')
                        else:
                            # 联合查询不能避免qq号或用户名重复...数据库中做了qq号和用户名唯一
                            try:
                                student_obj = models.Student(
                                    qq_number=qq, username=student_name_input, password=student_password_input)
                                session.add(student_obj)
                                session.commit()
                                print('添加学生完成,请给学生分配教室并添加上课记录,课后请提示学生交作业')
                            except sqlalchemy.exc.IntegrityError:
                                print('学生已经存在')
                    elif user_option == 'q':
                        exit_flag = True
                    else:
                        print("no this option..")
    
    def student(argvs):
        '''
        学生视图
        :param argvs:
        :return:
        '''
        user = auth_student()
        if user:
            print('student')
            welcome_msg(user)
            exit_flag = False
            show_student_class(user)
            msg = '''
            1)选择课程班级
            2) 提交作业
            3)查看作业成绩
            4)查看所属班级成绩排名
            '''
            print(msg)
            while not exit_flag:
                user_option = input("[ (q)quit, select num to manage]:").strip()
                if len(user_option) == 0:
                    continue
                if user_option == 'q':
                    exit_flag = True
                if user_option == '1':
                    print('请联系您的讲师帮您安排课程和教室')
                elif user_option == '2':
                    home_work_add_choice = input('[ (y)是,(n)否, select num to manage]:').strip()
                    if home_work_add_choice == 'n':
                        break
                    elif home_work_add_choice == 'y':
                        home_work_course_time_input = input('请输入上课节数/课程时间>>>:')
                        home_work_classroom_input = input('请输入所在班级/教室>>>: ')
                        home_work_classid_input = input('请输入对应教室的绑定ID>>>:')
                        student_class_obj = session.query(models.StudentTeachClass).filter_by(
                            id=int(home_work_classid_input)).all()
                        if student_class_obj:
                            for i in student_class_obj:
                                course_obj = session.query(models.CourseClassRecord).filter_by(
                                    id=i.teacher_course.bind_course_time_id).first()
                                # 检查作业
                                student_home_work_id_check = session.query(
                                    models.HomeWork).filter_by(home_work=user.username+'_'+course_obj.course_time.
                                                               course_time_name+'_'+'home_work').all()
                                if student_home_work_id_check:
                                    print('已经交作业了,不需要重复提交')
                                else:
                                    home_add = input('[ (y)是,(n)否, to add home_work]:').strip()
                                    if home_add == 'n':
                                        break
                                    if home_add == 'y':
                                        homework = 
                                            models.HomeWork(
                                                home_work=user.username+'_' + course_obj.course_time.course_time_name + '_' +
                                                          'home_work')
                                        session.add(homework)
                                        session.commit()
                                        home_work_id = session.query(models.HomeWork).filter_by(
                                                home_work=user.username+'_' + course_obj.course_time.course_time_name+'_' +
                                                          'home_work').first()
                                        record_home_work = models.StudentHomework(
                                            student_teach_class_id=i.id, homework_id=home_work_id.id)
                                        session.add(record_home_work)
                                        session.commit()
                                        print('作业添加完成,请提醒老师添加上课记录和批改成绩...')
                                        break
                        else:
                            print('没有这个班级...')
    
                elif user_option == '3':
                    print('如果没有成绩的请先交作业然后找讲师批改成绩')
                    student_record_id = input('请输入您的绑定ID,查看作业信息;')
                    record_student = session.query(models.RecordStudent).filter_by().all()
                    for i in record_student:
                        student_teachclass_obj = session.query(models.StudentTeachClass). 
                            filter_by(id=student_record_id).first()
                        class_teacher_obj = session.query(models.TeacherClass).filter_by(
                            id=student_teachclass_obj.teacher_course.bind_teacher_class_id).first()
                        course_obj = session.query(models.CourseClassRecord).filter_by(
                            id=student_teachclass_obj.teacher_course.bind_course_time_id).first()
                        studentname_obj = session.query(models.Student).filter_by(
                            qq_number=user.qq_number).first()
                        studenthomework_obj = session.query(models.StudentHomework).filter_by(
                            student_teach_class_id=student_record_id).first()
                        score_obj = session.query(models.RecordScore).filter_by(
                            student_teach_class_id=i.student_teach_class_id).first()
                        if studenthomework_obj:
                            if user.username == studentname_obj.username:
                                if score_obj:
                                    if score_obj.student_teacher_class.student.qq_number == studentname_obj.qq_number:
                                        print('绑定ID %s 课程:%s 课程时间:%s 讲师:%s 教室:%s 学生名:%s 学生qq %s 上课记录:%s 作业:%s 分数:%s'
                                              % (student_teachclass_obj.id, course_obj.course.coursename,
                                                 course_obj.course_time.course_time_name,
                                                 class_teacher_obj.teacher.username,
                                                 class_teacher_obj.class_room.classname, studentname_obj.username,
                                                 studentname_obj.qq_number, i.record.record,
                                                 studenthomework_obj.homework.home_work,
                                                 score_obj.score.score))
    
                elif user_option == '4':
                    print('查看班级排名.请按照所在班级的绑定ID查询排名')
                    home_work_course_time_input = input('请输入上课节数/课程时间>>>:')
                    home_work_classroom_input = input('请输入所在班级/教室>>>: ')
                    record_student = session.query(models.RecordStudent).filter_by().all()
                    tmp_dict = {}
                    for i in record_student:
                        student_teachclass_obj = session.query(models.StudentTeachClass). 
                            filter_by(id=i.student_teach_class_id).first()
                        class_teacher_obj = session.query(models.TeacherClass).filter_by(
                            id=student_teachclass_obj.teacher_course.bind_teacher_class_id).first()
                        course_obj = session.query(models.CourseClassRecord).filter_by(
                            id=student_teachclass_obj.teacher_course.bind_course_time_id).first()
                        studentname_obj = session.query(models.Student).filter_by(
                            qq_number=student_teachclass_obj.student.qq_number).first()
                        studenthomework_obj = session.query(models.StudentHomework).filter_by(
                            student_teach_class_id=i.student_teach_class_id).first()
                        score_obj = session.query(models.RecordScore).filter_by(
                            student_teach_class_id=i.student_teach_class_id).first()
                        if home_work_course_time_input == course_obj.course_time.course_time_name 
                                and home_work_classroom_input == class_teacher_obj.class_room.classname:
                            if studenthomework_obj:
                                if score_obj:
                                    if score_obj.student_teacher_class.student.qq_number == studentname_obj.qq_number:
                                        if score_obj.score.score in tmp_dict.keys():
                                            tmp_dict[score_obj.score.score].append(studentname_obj.username)
                                        else:
                                            tmp_dict[score_obj.score.score] = [studentname_obj.username]
                    # 分数排序,按道理应该是用group_by 这里偷个懒
                    tmp_list = []
                    for key in tmp_dict.keys():
                        tmp_list.append(key)
                    tmp_list.sort(reverse=True)
                    for key in tmp_list:
                        for name in tmp_dict[key]:
                            print(name, key)
    
                elif user_option == 'q':
                    exit_flag = True
                else:
                    print('no this option')
    View Code

    models.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Time:2017/12/19 20:36
    __Author__ = 'Sean Yao'
    import datetime
    from sqlalchemy import Table, Column, Integer, String, DATE, ForeignKey, Enum, UniqueConstraint, DateTime, Text
    from sqlalchemy.orm import relationship
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy_utils import ChoiceType, PasswordType
    from sqlalchemy import create_engine
    
    Base = declarative_base()
    
    class TeacheCourse(Base):
        '''
        课程/课程表/讲师/教室/关联
        '''
        __tablename__ = 'teacher_course'
        __table_args__ = (UniqueConstraint('bind_teacher_class_id', 'bind_course_time_id', name='_class_uc'),)
        id = Column(Integer, primary_key=True)
        bind_teacher_class_id = Column('bind_teacher_class_id', Integer, ForeignKey('bind_teacher_class.id'))
        bind_course_time_id = Column('bind_course_time_id', Integer, ForeignKey('bind_course_time.id'))
    
        teacher_class = relationship('TeacherClass', backref='teacher_course')
        course_class_record = relationship('CourseClassRecord', backref='teacher_course')
    
        def __repr__(self):
            return self.id, self.teacher_class.id, self.bind_course_time_id
    
    
    class RecordScore(Base):
        '''
        打分/关联 老师视图操作
       1  66
       2  88
        '''
        __tablename__ = 'record_score'
        __table_args__ = (UniqueConstraint('student_teach_class_id', 'score_id', name='_record_score_uc'),)
    
        id = Column(Integer, primary_key=True)
        student_teach_class_id = Column(
            'student_teach_class_id', Integer, ForeignKey('student_teach_class.id'), unique=True)
        score_id = Column('score_id', Integer, ForeignKey('score.id'))
    
        score = relationship('Score', backref='record_score')
        student_teacher_class = relationship('StudentTeachClass', backref='record_score')
    
        def __repr__(self):
            return self.id, self.student_teacher_class.teacher_course.id, self.student_teacher_class.student.qq_number, 
                   self.score.score
    
    class RecordStudent(Base):
        '''
        上课记录/关联 老师视图操作
       1  yes
       2  no
        '''
        __tablename__ = 'record_student'
        __table_args__ = (UniqueConstraint('student_teach_class_id', 'record_id', name='_record_class_uc'),)
    
        id = Column(Integer, primary_key=True)
        student_teach_class_id = Column(
            'student_teach_class_id', Integer, ForeignKey('student_teach_class.id'), unique=True)
        record_id = Column('record_id', Integer, ForeignKey('record.id'))
    
        record = relationship('Record', backref='record_student')
        student_teacher_class = relationship('StudentTeachClass', backref='record_student')
    
        def __repr__(self):
            return self.id, self.student_teacher_class.teacher_course.id, self.student_teacher_class.student.qq_number, 
                   self.record.record
    
    class StudentHomework(Base):
        '''
        课程/课程表/讲师/教室/学生/作业/关联 学生视图操作
        449010391 1
        '''
        __tablename__ = 'student_homework'
        __table_args__ = (UniqueConstraint('student_teach_class_id', 'homework_id', name='_record_homework_uc'),)
    
        id = Column(Integer, primary_key=True)
        student_teach_class_id = Column(
            'student_teach_class_id', Integer, ForeignKey('student_teach_class.id'), unique=True)
        homework_id = Column('homework_id', Integer, ForeignKey('homework.id'))
    
        homework = relationship('HomeWork', backref='student_homework')
        student_teacher_class = relationship('StudentTeachClass', backref='student_homework')
    
        def __repr__(self):
            return self.id, self.student_teacher_class.teacher_course.id, self.student_teacher_class.student.qq_number, 
                   self.homework.home_work
    
    class StudentTeachClass(Base):
        '''
        课程/课程表/讲师/教室/学生/关联
        python/python1/alex/python_1  449010391
                      1               449010391
        '''
        __tablename__ = 'student_teach_class'
        __table_args__ = (UniqueConstraint('student_qq', 'teacher_course_id', name='_record_uc'),)
    
        id = Column(Integer, primary_key=True)
        teacher_course_id = Column('teacher_course_id', Integer, ForeignKey('teacher_course.id'))
        student_qq = Column('student_qq', Integer, ForeignKey('student.qq_number'))
    
        teacher_course = relationship("TeacheCourse", backref='student_teach_class')
        student = relationship('Student', backref='student_teach_class')
    
        def __repr__(self):
            # qq号,讲师/教室/课程/课程表
            return self.id, self.student.qq_number, self.teacher_course.bind_teacher_class_id, 
                   self.teacher_course.bind_course_time_id
    
    class Course(Base):
        '''
        课程表
        课程唯一
        '''
        __tablename__ = 'course'
        id = Column(Integer, primary_key=True)
        coursename = Column(String(64), unique=True, nullable=False)
    
        def __repr__(self):
            return self.id, self.coursename
    
    class CourseTime(Base):
        '''
        课程时间表
        课程时间唯一
        '''
        __tablename__ = 'course_time'
        id = Column(Integer, primary_key=True)
        course_time_name = Column(String(64), unique=True, nullable=False)
    
        def __repr__(self):
            return self.id, self.course_time_name
    
    class Teacher(Base):
        '''
        teacher 表
        老师名字唯一
        '''
        __tablename__ = 'teacher'
        id = Column(Integer, primary_key=True)
        username = Column(String(64), unique=True, nullable=False)
        password = Column(String(128), nullable=False)
    
        def __repr__(self):
            return self.id, self.username, self.password,
    
    class ClassRoom(Base):
        '''
        班级表
        班级唯一
        '''
        __tablename__ = 'class_room'
        id = Column(Integer, primary_key=True)
        classname = Column(String(64), unique=True, nullable=False)
    
        def __repr__(self):
            return self.id, self.classname
    
    class Student(Base):
        '''
        student表
        用户名/qq号/唯一
        '''
        __tablename__ = 'student'
        id = Column(Integer, primary_key=True)
        qq_number = Column(Integer, unique=True, nullable=False)
        username = Column(String(64), unique=True, nullable=False)
        password = Column(String(128), nullable=False)
    
        def __repr__(self):
            return self.id, self.qq_number, self.username, self.password
    
    class Score(Base):
        '''
        成绩表
        成绩不唯一可能不同的童鞋得到的分数一样
        '''
        __tablename__ = 'score'
        id = Column(Integer, primary_key=True)
        score = Column(Integer, unique=True, nullable=False)
    
        def __repr__(self):
            return self.id, self.score
    
    class HomeWork(Base):
        '''
        作业表
        作业唯一对应不同的童鞋和课程
        '''
        __tablename__ = 'homework'
        id = Column(Integer, unique=True, primary_key=True)
        home_work = Column(String(128))
    
        def __repr__(self):
            return self.id, self.home_work
    
    class Record(Base):
        '''
        上课记录
        唯一只有yes/no
        '''
        __tablename__ = 'record'
        id = Column(Integer, primary_key=True)
        action_choices = [
            (u'yes', u'Yes'),
            (u'no', u'No'),
        ]
        record = Column(ChoiceType(action_choices), unique=True)
    
        def __repr__(self):
            return self.id, self.record
    
    class CourseClassRecord(Base):
        '''
        课程/课程时间/关联
        课程:pyrhon  课程时间:python_day1
        课程:linux 课程时间:linux_day1
        课程:linux 课程时间:linux_day2
        课程和课程时间联合唯一
        '''
        __tablename__ = "bind_course_time"
        # 联合唯一
        __table_args__ = (UniqueConstraint('course_id', 'course_time_id', name='_course_uc'),)
        id = Column(Integer, primary_key=True)
        course_id = Column(Integer, ForeignKey('course.id'))
        course_time_id = Column(Integer, ForeignKey('course_time.id'))
        course = relationship('Course', backref='bind_course_time')
        course_time = relationship('CourseTime', backref='bind_course_time')
    
        def __repr__(self):
            return self.id, self.course.coursename, self.course_time.course_time_name
    
    class TeacherClass(Base):
        '''
        老师/班级/关联
        老师和班级联合唯一
        老师:alex  班级:python_S14
        老师:alex  班级:python_S15
        '''
        __tablename__ = "bind_teacher_class"
        __table_args__ = (UniqueConstraint('teacher_id', 'class_room_id', name='_class_uc'),)
    
        id = Column(Integer, primary_key=True)
        teacher_id = Column(Integer, ForeignKey('teacher.id'))
        class_room_id = Column(Integer, ForeignKey('class_room.id'))
        teacher = relationship('Teacher', backref='bind_teacher_class')
        class_room = relationship('ClassRoom', backref='bind_teacher_class')
    
        def __repr__(self):
            return self.id, self.teacher.username, self.class_room.classname
    View Code

    程序测试样图:

    添加多个学生后,给学生绑定了课堂,并登陆学生交了作业,讲师批改作业后学生可以查看分数排名

  • 相关阅读:
    IntelliJ Idea和IntelliJ webstrm 常用快捷键
    mybatis基础学习2---(resultType和resultMap的用法和区别)和setting的用法
    使用观察者模式观察线程的生命周期
    观察者设计模式介绍
    java的内存模型及缓存问题
    一个解释volatile关键字作用的最好的例子
    多线程的waitset详细介绍
    浅谈单例模式
    SimpleThreadPool给线程池增加自动扩充线程数量,以及闲时自动回收的功能
    SimpleThreadPool给线程池增加拒绝策略和停止方法
  • 原文地址:https://www.cnblogs.com/sean-yao/p/8088186.html
Copyright © 2020-2023  润新知