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

程序测试样图:

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

原文地址:https://www.cnblogs.com/sean-yao/p/8088186.html