• 技术文章 >后端开发 >Python教程

    python第六十八天--第十二周作业

    PHP中文网PHP中文网2017-07-10 18:13:06原创848
    主题:

    需求:

    用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下
    讲师视图
      管理班级,可创建班级,根据学员qq号把学员加入班级
      可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上课纪录, 即每节课都有整班学员上, 为了纪录每位学员的学习成绩,需在创建每节上课纪录是,同时 为这个班的每位学员创建一条上课纪录
      为学员批改成绩, 一条一条的手动修改成绩
    学员视图
    提交作业
    查看作业成绩
    一个学员可以同时属于多个班级,就像报了Linux的同时也可以报名Python一样, 所以提交作业时需先选择班级,再选择具体上课的节数
    附加:学员可以查看自己的班级成绩排名

     

    学员管理系统

    实现功能:
    1、系统初始化
    2、管理员视图
    功能:创建讲师、查看讲师、创建班级、查看班级、关联讲师与班级、创建学员、查看学员、班级关联学员
    3、讲师视图
    功能:管理班级、创建班级(自动与自己关联)、班级增加学员、增加新课节、
    指定班级上课,选择上课课节(自动创建课程记录,同时为这个班的每位学员创建一条上课纪录)
    批改成绩(先选择一个班级、再选择学员)
    4、学员视图
    功能:提交作业
    查看作业成绩
    查看班级中的总成绩排名


    stude_mag_sys/#程序目录
    |- - -__init__.py
    |- - -bin/#启动目录
    | |- - -__init__.py
    | |- - -admin_start.py#管理员视图启动
    | |- - -mag_init.py#系统初始化
    | |- - -student.py#学员视图启动
    | |- - -teach_start.py#讲师视图启动
    |
    |- - -cfg/#配置目录
    | |- - -__init__.py
    | |- - -config.py#配置文件
    |
    |- - -core/#主逻辑目录
    | |- - -__init__.py
    | |- - -admain_class.py#主要逻辑 类
    | |- - -admin_log.py#管理员逻辑 类
    | |- - -student_class.py#学员逻辑 类
    | |- - -teach_class.py#讲师逻辑 类
    |
    |- - -REDMAE

     

     

    先上一个表结构图   

     

     

    流程美图来一张:

     

    stude_mag_sys/#程序目录
    |- - -__init__.py
    |- - -bin/#启动目录
    | |- - -__init__.py
    |      |- - -admin_start.py#管理员视图启动
     1 import os ,sys
     2 from sqlalchemy import create_engine
     3 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
     4 sys.path.append(BASE_DIR)#增加环境变量
     5 from core import admin_class
     6 from core import admin_log
     7 from cfg import config
     8 if __name__ == '__main__':
     9     #                      用户 密码  主机             库
    10     #engine = create_engine(config.HOSTS,)#连接
    11     #admin_class.Base.metadata.create_all(admin_class.engine)#创建表结构
    12     while True:
    13         admin=admin_log.Admin_Mag()
    14         admin.user_log()
    View Code
    |      |- - -mag_init.py#系统初始化
     1 import os ,sys
     2 from sqlalchemy import create_engine
     3 from sqlalchemy.orm import sessionmaker, relationship
     4 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
     5 sys.path.append(BASE_DIR)#增加环境变量
     6 from core import admin_class
     7 from core import admin_log
     8 from cfg import config
     9 if __name__ == '__main__':
    10     #                      用户 密码  主机             库
    11     #engine = create_engine(config.HOSTS,)#连接
    12 
    13     admin_class.Base.metadata.create_all(admin_class.engine)#创建表结构
    14     A1 = admin_class.Admin_user(name=config.USER,pwd=config.PWD)#初始化
    15     Session_class=sessionmaker(bind=admin_class.engine)#创建与数据库的会话 类
    16     Session=Session_class()#生成实例
    17     Session.add(A1)
    18     Session.commit()
    View Code
    |      |- - -student.py#学员视图启动
    1 import os ,sys
    2 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
    3 sys.path.append(BASE_DIR)#增加环境变量
    4 from core.student_class import Stu_Mag
    5 from cfg import config
    6 if __name__ == '__main__':
    7     while True:
    8         stu=Stu_Mag()
    9         stu.user_log()
    View Code
    |      |- - -teach_start.py#讲师视图启动
    1 import os ,sys
    2 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
    3 sys.path.append(BASE_DIR)#增加环境变量
    4 from core.teach_class import Teach_Mag
    5 from cfg import config
    6 if __name__ == '__main__':
    7     while True:
    8         teach=Teach_Mag()
    9         teach.user_log()
    View Code

     

    |- - -cfg/#配置目录
    | |- - -__init__.py
    | |- - -config.py#配置文件
     1 import os ,sys
     2 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
     3 sys.path.append(BASE_DIR)#增加环境变量
     4 
     5 BAES='test_student_mag'#库名
     6 HOSTS="mysql+pymysql://root:root@127.0.0.1:3306/"+BAES+"?charset=utf8"#连接
     7 USER='admin'
     8 PWD='admin'
     9 
    10 ADMIN_OPEN=[
    11     ('创建讲师','add_teach'),
    12     ('查看讲师','teach_l'),
    13     ('创建班级','add_class'),
    14     ('查看班级','class_l'),
    15     ('讲师关联班级','assoc'),
    16     ('创建学员','add_stu'),
    17     ('查看学员','stu_l'),
    18     ('班级关联学员','class_student'),
    19     ('退出','tech_exit'),
    20 ]
    21 
    22 TEACH_OPEN=[
    23     ('查看班级','show_class'),
    24     ( '创建新班级','add_class'),
    25     ('班级增加学员','add_student'),
    26      ('增加新课节','add_lesson'),
    27       ('开始上课','add_cla_day'),
    28        ('批改成绩','set_results'),
    29     ('退出','tech_exit')
    30 ]
    31 STUED_OPEN=[
    32     ('提交作业','up_work'),
    33     ( '查看成绩','set_resu'),
    34     ('查看班级排行','cla_top'),
    35     ('退出','tech_exit')
    36 ]
    View Code
    |- - -core/#主逻辑目录
    | |- - -__init__.py
    | |- - -admain_class.py#主要逻辑 类
     1 #!usr/bin/env python
     2 #-*-coding:utf-8-*-
     3 # Author calmyan 
     4 #python 
     5 #2017/7/7    17:46
     6 #__author__='Administrator'
     7 # 创建表
     8 import os ,sys
     9 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
    10 sys.path.append(BASE_DIR)#增加环境变量
    11 from sqlalchemy.ext.declarative import declarative_base
    12 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,Table,DATE
    13 from sqlalchemy.orm import sessionmaker, relationship
    14 from sqlalchemy import create_engine
    15 from sqlalchemy import func #统计
    16 from  cfg import config
    17 Base = declarative_base()#生成orm 基类
    18 
    19 #创建班级关联学员表,自动维护
    20 class_name_m2m_student = Table('class_name_m2m_student', Base.metadata,
    21                         Column('class_name_id',Integer,ForeignKey('class_name.id')),#关联外键,班级id
    22                         Column('student_id',Integer,ForeignKey('student.id')),#关联外键,学员id
    23                         )
    24 #创建班级关联老师表,自动维护
    25 teacher_name_m2m_class = Table('teacher_name_m2m_class', Base.metadata,
    26                         Column('teacher_id',Integer,ForeignKey('teacher.id')),#关联外键,老师id
    27                         Column('class_name_id',Integer,ForeignKey('class_name.id')),#关联外键,班级id
    28                         )
    29 #班级表
    30 class Class_name(Base):#班级表
    31     __tablename__ = 'class_name'
    32     id = Column(Integer,primary_key=True)
    33     name = Column(String(64),unique=True)
    34     students = relationship('Student',secondary=class_name_m2m_student,backref='class_name')#关联学员,班级
    35     #teachers = relationship('Teacher',secondary=class_name_m2m_teacher,backref='class_name')#关联老师,班级
    36     def __repr__(self):
    37         return self.name
    38 
    39 #老师表
    40 class Teacher(Base):#老师表
    41     __tablename__ = 'teacher'
    42     id = Column(Integer, primary_key=True)
    43     name = Column(String(32))
    44     user = Column(String(32),unique=True)
    45     pwd = Column(String(32))
    46     class_n = relationship('Class_name',secondary=teacher_name_m2m_class,backref='teach_name')#关联老师,班级
    47     def __repr__(self):
    48         return self.name
    49 
    50 #学员表
    51 class Student(Base):#学员表
    52     __tablename__ = 'student'
    53     id = Column(Integer, primary_key=True)
    54     name = Column(String(32))
    55     pwd = Column(String(64))
    56     qq = Column(Integer,nullable=False,unique=True)
    57     def __repr__(self):
    58         return self.id
    59 
    60 #进度  课节表
    61 class Lesson(Base):
    62     __tablename__='lesson'
    63     id = Column(Integer, primary_key=True)
    64     name=Column(String(32),unique=True)#唯一课节名
    65     def __repr__(self):
    66         return self.name
    67 
    68 #课程表
    69 class Class_Day(Base):#课程表
    70     __tablename__='class_day'
    71     id=Column(Integer,primary_key=True)
    72     class_id=Column(Integer,ForeignKey("class_name.id"),nullable=False)#外键 班级
    73     lesson_id= Column(Integer,ForeignKey("lesson.id"),nullable=False)#课程进度
    74     class_n=relationship("Class_name",foreign_keys=[class_id],backref="m_class_day")#自定义关联反查 班级Class_name通过m_class_day 查Class_day
    75     lesson_n=relationship("Lesson",foreign_keys=[lesson_id],backref="m_lesson_day")#自定义关联反查 课节Lesson通过m_lesson_day 查Class_day
    76     def __repr__(self):
    77         return self.id#课程名ID
    78 
    79 class Student_work(Base):#  作业 上 课记录
    80     __tablename__='student_work'
    81     id=Column(Integer,primary_key=True)
    82     students_id=Column(Integer,ForeignKey("student.id"))#外键 学员ID
    83     class_id= Column(Integer,ForeignKey('class_day.id'))#班级课程 日期 ID
    84     status= Column(String(32),nullable=False)#作业提交 状态
    85     results= Column(String(64))#成绩
    86     students_w=relationship("Student",foreign_keys=[students_id],backref="m_study_class")#自定义关联反查 学员类Student通过m_study_class 查student_work
    87     stu_class=relationship("Class_Day",foreign_keys=[class_id],backref="class_stu_work")#自定义关联反查 班级Class_name通过m_class_study 查Student_work
    88 
    89 class Admin_user(Base):
    90     __tablename__='admin_user'
    91     id=Column(Integer,primary_key=True)
    92     name=Column(String(32),nullable=False,unique=True)
    93     pwd=Column(String(64),nullable=False)
    94 
    95 #                      用户 密码  主机             库
    96 engine = create_engine(config.HOSTS,)#连接
    97 Base.metadata.create_all(engine)#创建表结构
    View Code
    |      |- - -admin_log.py#管理员逻辑 类
      1 #!usr/bin/env python
      2 #-*-coding:utf-8-*-
      3 # Author calmyan 
      4 #python 
      5 #2017/7/9    23:12
      6 #__author__='Administrator'
      7 import os ,sys
      8 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
      9 sys.path.append(BASE_DIR)#增加环境变量
     10 from sqlalchemy.orm import sessionmaker, relationship
     11 from core import admin_class
     12 from cfg import config
     13 #管理登陆
     14 class Admin_Mag(object):
     15     def __init__(self):
     16         self.Session_class=sessionmaker(bind=admin_class.engine)#创建与数据库的会话 类
     17         self.Session=self.Session_class()#生成实例
     18     #开始相关操作
     19     def openatin(self):#开始相关操作
     20         while True:
     21             print('\033[35;1m管理员界面\033[0m'.center(60,'='))
     22             for index,i in enumerate(config.ADMIN_OPEN):
     23                 print(index,':',i[0])
     24             id=input('请选择>>:')
     25             if id.isdigit():
     26                 if int(id)>=len(config.ADMIN_OPEN):continue
     27                 s=config.ADMIN_OPEN[int(id)][1]
     28             else:
     29                 continue
     30             if hasattr(self,s):#是反射否存在
     31                 func=getattr(self,s)#调用
     32                 func()#执行
     33 
     34     #关联讲师班级
     35     def assoc(self):
     36         t_id=self.tech_cher()
     37         cla_id=self.class_cher()
     38         #讲师表对象
     39         t=self.Session.query(admin_class.Teacher).filter(admin_class.Teacher.id==t_id).first()
     40         #获取班级对象
     41         c=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()
     42         t.class_n.append(c)
     43         self.Session.commit()
     44         print('讲师:',t.name,'班级:',c.name)
     45         print('关联完成!')
     46 
     47     #讲师表对象
     48     def tech_cher(self):
     49         #t=self.Session.query(admin_class.Teacher).all()#讲师表对象
     50         t=self.teach_l()
     51         #for i in t :
     52             #print('编号',i.id,'>>:',i.name)
     53         t_id=input('请按编号选择讲师>>:').strip()
     54         if  t_id.isdigit() :#判断是否是整数
     55             for i in t:#
     56                 if int(t_id)==i.id:
     57                     return int(t_id)#返回班级ID
     58             else:
     59                 pass
     60         else:
     61             print('选择讲师有误!')
     62             return None
     63     #创建班级
     64     def add_class(self):
     65         print('\033[35;1m创建班级界面\033[0m'.center(60,'='))
     66         self.class_l()
     67         attr=input("输入班级名>>:").strip()
     68         self.class_list=self.Session.query(admin_class.Class_name).all()#获取班级名列表
     69         if attr in self.class_list:#如果存在
     70             return print('班级名重复!')
     71         c=admin_class.Class_name(name=attr)#创建新班级
     72         self.add_all(c)
     73 
     74     #查看讲师
     75     def teach_l(self):
     76         t=self.Session.query(admin_class.Teacher).all()
     77         for i in t:
     78             print('编号:',i.id,'讲师姓名:',i.name,'用户名:',i.user,'密码',i.pwd,' 管理班级:',i.class_n)
     79         return t
     80 
     81 
     82     #查看班级
     83     def class_l(self):
     84         c=self.Session.query(admin_class.Class_name).all()#班级对象
     85         print("全部班级信息".center(50,'-'))
     86         for i in c:
     87             print('编号',i.id,'>>:',i.name)
     88         return c
     89 
     90     #查看班级选择
     91     def class_cher(self):#查看班级
     92         c=self.class_l()
     93         class_id=input('请按编号选择班级>>:').strip()
     94         if  class_id.isdigit() :#判断是否是整数
     95             for i in c:#
     96                 if int(class_id)==i.id:
     97                     return int(class_id)#返回班级ID
     98             else:
     99                 pass
    100         else:
    101             print('选择班级有误!')
    102             return None
    103     #创建讲师
    104     def add_teach(self):#创建讲师
    105         while True:
    106             name =input('输入讲师姓名>>:').strip()
    107             user =input('输入讲师用户名>>:').strip()
    108             pwd =input('输入讲师密码>>:').strip()
    109             t1 = admin_class.Teacher(name=name,user=user,pwd=pwd)
    110             self.add_all(t1)
    111             e=input('是否继续 Y/y 继续! 其他返回').upper().strip()
    112             if e=='Y':continue
    113             break
    114     #学员添加
    115     def add_stu(self):#学员添加
    116         while True:
    117             name =input('输入学员姓名>>:').strip()
    118             pwd =input('输入学员密码>>:').strip()
    119             qq =input('输入学员QQ>>:').strip()
    120             if not qq.isdigit():
    121                 print('QQ必需是数字')
    122                 continue
    123             s=admin_class.Student(name=name,pwd=pwd,qq=int(qq))
    124             self.add_all(s)
    125             e=input('是否继续 Y/y 继续! 其他返回').upper().strip()
    126             if e=='Y':continue
    127             break
    128 
    129     #查看学员
    130     def stu_l(self):
    131         student_l=self.Session.query(admin_class.Student).all()
    132         for i in student_l:
    133             print('ID:',i.id,'学员姓名:',i.name,'QQ:',i.qq,'培训班级:',i.class_name)
    134         return student_l
    135 
    136     #学员选择
    137     def stu_cher(self):
    138         student_l=self.stu_l()
    139         stu_id=input('请按ID选择学员>>:').strip()
    140         if  stu_id.isdigit() :#判断是否是整数
    141             for i in student_l:#
    142                 if int(stu_id)==i.id:
    143                     return int(stu_id)#返回班级ID
    144             else:
    145                 pass
    146         else:
    147             print('选择学员有误!')
    148             return None
    149 
    150     #班级关联学员
    151     def class_student(self):#班级增加学员
    152         print('\033[35;1m班级关联学员界面\033[0m'.center(60,'='))
    153         cla_id=self.class_cher()#调用查看班级
    154         if not cla_id:return None
    155         #获取班级对象
    156         c=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()
    157         if not c:return None
    158         stu_id=self.stu_cher()
    159         #student_qq=input('请输入学生QQ号码>>:').strip()
    160         s_qq=self.Session.query(admin_class.Student).filter(admin_class.Student.id==stu_id).first()#学员qq对象
    161         if s_qq:#如果有这个qq
    162             c.students.append(s_qq)#加入班级
    163             self.Session.commit()
    164             print('加入班级成功!')
    165         else:
    166             return print('对应的学员不存在')
    167 
    168     #增加函数
    169     def add_all(self,lists):#增加函数
    170         self.Session.add_all([lists])
    171         confirm=input('请进行确认: 按\033[31;1mN\033[0m回滚操作,其他键确认!' ).upper().strip()
    172         if confirm=="N":
    173             self.Session.rollback()#
    174             return False
    175         try:
    176             self.Session.commit()
    177             print('操作成功')
    178             return
    179         except Exception as e:
    180             self.Session.rollback()#
    181             print('操作失败!,可能该信息已经存在!')
    182             print(e)
    183             return
    184     #退出
    185     def tech_exit(self):
    186         return  exit()
    187 
    188      #登陆
    189     #登陆
    190     def user_log(self):#登陆
    191         user_n=input('请输入管理员用户名>>:').strip()
    192         aut_obj=self.Session.query(admin_class.Admin_user).filter(admin_class.Admin_user.name==user_n).first()
    193         if aut_obj:
    194             #print(self.aut_obj_1.pwd)#用户对应密码
    195             pwds=input('请输入密码>>:').strip()
    196             if pwds == aut_obj.pwd:
    197 
    198                 self.openatin()
    199             else:
    200                 print('密码有误')
    201                 return
    202         else:
    203             print('输入的用户名不存')
    204             return
    View Code
    |      |- - -student_class.py#学员逻辑 类
      1 #!usr/bin/env python
      2 #-*-coding:utf-8-*-
      3 # Author calmyan 
      4 #python 
      5 #2017/7/8    12:29
      6 #__author__='Administrator'
      7 import os ,sys
      8 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
      9 sys.path.append(BASE_DIR)#增加环境变量
     10 from sqlalchemy.ext.declarative import declarative_base
     11 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
     12 from sqlalchemy.orm import sessionmaker, relationship
     13 from sqlalchemy import create_engine
     14 from sqlalchemy import func #统计
     15 from  core import admin_class
     16 from  cfg import config
     17 #学员类
     18 class Stu_Mag(object):
     19 
     20     def __init__(self):
     21         self.Session_class=sessionmaker(bind=admin_class.engine)#创建与数据库的会话 类
     22         self.Session=self.Session_class()#生成实例
     23         self.stu_name=''#学员姓名
     24 
     25     #开始相关操作
     26     def openatin(self):#开始相关操作
     27         while True:
     28             print('\033[32;1m学员界面\033[0m'.center(60,'='))
     29             print(('\033[36;1m[%s]\033[0m'%self.stu_name).center(60,'='))
     30 
     31             for index,i in enumerate(config.STUED_OPEN):
     32                 print(index,':',i[0])
     33             id=input('请选择>>:')
     34             if id.isdigit():
     35                 if int(id)>=len(config.STUED_OPEN):continue
     36                 s=config.STUED_OPEN[int(id)][1]
     37             else:
     38                 continue
     39             if hasattr(self,s):#是反射否存在
     40                 func=getattr(self,s)#调用
     41                 func()#执行
     42 
     43     #提交作业
     44     def up_work(self):
     45         class_id=self.class_l()
     46         if not class_id:
     47             return None#班级ID
     48         les_id=self.lessn_obj(class_id)#课节表ID\
     49         if not les_id:return None
     50         cl_dayid=self.class_less(class_id,les_id)#课程表ID
     51         if cl_dayid:
     52             stu_id=self.stu_obj.id#学员ID
     53             stu_work=self.Session.query(admin_class.Student_work).filter_by(students_id=stu_id,class_id=cl_dayid.id).first()
     54             if stu_work:
     55                 if stu_work.status=='yes':
     56                     print('\033[31;1m作业已经提交,不能重复提交!\033[0m')
     57                     return None
     58                 #对应的课程表
     59                 les_n=self.Session.query(admin_class.Class_Day).filter_by(class_id=class_id,lesson_id=les_id).first()
     60                 print('姓名:',self.stu_name,'班级:',les_n.class_n,'课节:',les_n.lesson_n,'作业提交状态:',stu_work.status,'成绩:',stu_work.results)
     61                 chend=input('提交作业>>>: Y/y 确认!').upper().strip()
     62                 if chend=='Y':
     63                     self.Session.query(admin_class.Student_work).filter_by(students_id=stu_id,class_id=cl_dayid.id).update({"status":"yes"})
     64                     print('提交完成!')
     65                     self.Session.commit()
     66                     return
     67                 else:
     68                     return None
     69             else:
     70                 print('\033[31;1m您可能没有上本节课!无法提交\033[0m')
     71                 return None
     72         else:
     73             print('\033[31;1m本节课可能没有开始!\033[0m')
     74             return None
     75 
     76 
     77     #获取课程ID
     78     def class_less(self,cla_id,les_id):
     79         cl_dayid=self.Session.query(admin_class.Class_Day).filter(admin_class.Class_Day.class_id==cla_id).\
     80             filter(admin_class.Class_Day.lesson_id==les_id).first()#获取班级课程表id
     81         if cl_dayid:
     82             return cl_dayid
     83         else:
     84             return None
     85 
     86     #获取课程表 选课节
     87     def lessn_obj(self,cla):
     88         les_l=self.Session.query(admin_class.Class_Day).filter_by(class_id=cla).all()
     89         for i in les_l:
     90             print('编号:',i.lesson_id,'课节:',i.lesson_n)
     91         les_id=input('请按编号选择课节 >>:').strip()
     92         if les_id.isdigit():
     93             for i in les_l:
     94                 if int(les_id)==i.lesson_id:
     95                     return int(les_id)#返回课节ID
     96             else:
     97                 print('选择课节有误!')
     98                 return None
     99         else:
    100             print('选择课节有误!')
    101             return None
    102 
    103     #查看班级选择
    104     def class_l(self):#查看班级
    105         for i in self.stu_obj.class_name:
    106             print('编号',i.id,'>>:',i.name)
    107         class_id=input('请按编号选择班级>>:').strip()
    108         if  class_id.isdigit() :#判断是否是整数
    109             for i in self.stu_obj.class_name:#是否在学员的班级中
    110                 if int(class_id)==i.id:
    111                     return int(class_id)#返回班级ID
    112             else:
    113                 print('选择班级有误!')
    114                 return None
    115         else:
    116             print('选择班级有误!')
    117             return None
    118 
    119     #查看课节
    120     def lesson_l(self):
    121         for i in self.les:
    122             print('编号',i.id,'>>:',i)
    123         les_id=input('请按编号选择课节 >>:').strip()
    124         if les_id.isdigit():
    125             for i in self.les:
    126                 if int(les_id)==i.id:
    127                     return int(les_id)#返回课节ID
    128             else:
    129                 pass
    130         else:
    131             print('选择课节有误!')
    132             return None
    133 
    134     #查看成绩
    135     def set_resu(self):
    136         class_id=self.class_l()#班级ID
    137         les_l=self.Session.query(admin_class.Class_Day).filter_by(class_id=class_id).all()#本班所有课节
    138         stu_id=self.stu_obj.id#学员ID
    139         for i in les_l:
    140             stu_work=self.Session.query(admin_class.Student_work).filter_by(students_id=stu_id,class_id=i.id).first()#取对应的课节
    141             if stu_work:
    142                 cla_day=self.Session.query(admin_class.Class_Day).filter_by(id=stu_work.class_id).first()#课程表对象
    143                 if cla_day:
    144                     print('姓名:',self.stu_name,'班级:',cla_day.class_n,'课节:',cla_day.lesson_n,' 作业提交状态:',stu_work.status,'成绩:',stu_work.results)
    145                 else:
    146                     pass
    147             else:
    148                 pass
    149 
    150     #查看排名
    151     def cla_top(self):
    152         class_id=self.class_l()#班级ID
    153         les_l=self.Session.query(admin_class.Class_Day).filter_by(class_id=class_id).all()#取当前班级的所有课节
    154         stu_id_l=self.Session.query(admin_class.Student).all()#取学生id
    155         top_list=[]#分数
    156         for i in stu_id_l:
    157             resut=0
    158             for j in les_l:
    159                 stu_work=self.Session.query(admin_class.Student_work).filter_by(students_id=i.id,class_id=j.id).first()
    160                 if not stu_work:continue
    161                 if stu_work.results:
    162                     resut+=int(stu_work.results)
    163             else:
    164                 top_list.append((resut,i.name))
    165         print(top_list)
    166         self.sort(top_list)
    167         for index,i in enumerate(top_list):
    168             print('名次',index+1,'总分数--姓名:',i)
    169 
    170     #排序
    171     def sort(self,ls):
    172         for i in range(len(ls)-1):
    173             for j in range(len(ls)-i-1):
    174                 if ls[j]<ls[j+1]:
    175                     ls[j],ls[j+1] =ls[j+1],ls[j]
    176         return ls
    177 
    178 
    179 
    180     #退出
    181     def tech_exit(self):
    182         return  exit()
    183 
    184     #登陆
    185     def user_log(self):#登陆
    186             user_n=input('请输入用户名(qq)>>:').strip()
    187             if not user_n.isdigit():return None
    188             aut_obj=self.Session.query(admin_class.Student).filter(admin_class.Student.qq==int(user_n)).first()
    189             if aut_obj:
    190                 #print(self.aut_obj_1.pwd)#用户对应密码
    191                 pwds=input('请输入密码>>:').strip()
    192                 if pwds == aut_obj.pwd:
    193                     self.stu_name=aut_obj.name
    194                     self.qq=aut_obj.qq
    195                     self.stu_obj = self.Session.query(admin_class.Student).filter(admin_class.Student.qq==self.qq).first()#取当前学员对象实例
    196                     self.openatin()
    197                 else:
    198                     print('密码有误')
    199                     return
    200             else:
    201                 print('输入的用户名不存')
    202                 return
    203 
    204 
    205 
    206     #stu.up_work()
    View Code
    |      |- - -teach_class.py#讲师逻辑 类
      1 #!usr/bin/env python
      2 #-*-coding:utf-8-*-
      3 # Author calmyan 
      4 #python 
      5 #2017/7/7    17:48
      6 #__author__='Administrator'
      7 
      8 import os ,sys
      9 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
     10 sys.path.append(BASE_DIR)#增加环境变量
     11 from sqlalchemy.ext.declarative import declarative_base
     12 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
     13 from sqlalchemy.orm import sessionmaker, relationship
     14 from sqlalchemy import create_engine
     15 from sqlalchemy import func #统计
     16 from  core import admin_class
     17 from  cfg import config
     18 
     19 #讲师类
     20 class Teach_Mag(object):
     21 
     22     def __init__(self):
     23         self.Session_class=sessionmaker(bind=admin_class.engine)#创建与数据库的会话 类
     24         self.Session=self.Session_class()#生成实例
     25         self.teach_name=''
     26 
     27     #开始相关操作
     28     def openatin(self):#开始相关操作
     29         while True:
     30             print('\033[35;1m讲师界面\033[0m'.center(60,'='))
     31             for index,i in enumerate(config.TEACH_OPEN):
     32                 print(index,':',i[0])
     33             id=input('请选择>>:')
     34             if id.isdigit():
     35                 if int(id)>=len(config.TEACH_OPEN):continue
     36                 s=config.TEACH_OPEN[int(id)][1]
     37             else:
     38                 continue
     39             if hasattr(self,s):#是反射否存在
     40                 func=getattr(self,s)#调用
     41                 func()#执行
     42 
     43     #查看班级
     44     def show_class(self):#查看班级
     45         print('\033[32;1m查看班级(可管理)\033[0m'.center(60,'='))
     46         #show_class=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.teach_name==self.teach_name)
     47         print('\033[31;1m全部班级\033[0m'.center(45,'-'))#所有班级
     48         for i in self.class_list:
     49             print(i)
     50         print('\033[35;1m可管理班级\033[0m'.center(45,'-'))
     51         cla_id=self.class_l()#调用查看班级
     52         class_obj=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()
     53         if class_obj:#获取班级对象成功 有内容
     54             print(class_obj,class_obj.name,class_obj.id)
     55             self.student_l(class_obj.name)#调用查看学员 得到班级对象
     56             # print('[%s] 班 学员列表'.center(60,'=')%c)
     57             # for i in c.students:
     58             #     print(i.id,'姓名:',i.name,'QQ:',i.qq)
     59             # print('end'.center(60,'='))
     60             return
     61         else:
     62             print('选择有误!')
     63             return
     64 
     65     #查看班级选择
     66     def class_l(self):#查看班级
     67         for i in self.teach_obj.class_n:
     68             print('编号',i.id,'班级:',i.name)
     69         class_id=input('请按编号选择班级>>:').strip()
     70         if  class_id.isdigit() :#判断是否是整数
     71             for i in self.teach_obj.class_n:#是否在讲师的班级中
     72                 if int(class_id)==i.id:
     73                     return int(class_id)#返回班级ID
     74             else:
     75                 print('选择班级有误!')
     76                 return None
     77         else:
     78             print('选择班级有误!')
     79             return None
     80 
     81     #查看班级学员
     82     def student_l(self,class_name):#查看班级学员
     83         stu_l=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.name==str(class_name)).first()#所选班级对象
     84         print('[%s] 班 学员列表'.center(60,'=')%stu_l)
     85         for i in stu_l.students:
     86             print(i.id,'姓名:',i.name,'QQ:',i.qq)
     87         print('end'.center(60,'='))
     88         return stu_l#返回所选班级对象
     89 
     90     #查看课节
     91     def less_cher(self):
     92         les=self.Session.query(admin_class.Lesson).all()#取课节名列表
     93         for i in les:
     94             print('编号',i.id,'课节名>>:',i)
     95         return les
     96     #查看课节 选择
     97     def lesson_l(self):
     98         les=self.less_cher()#取课节名列表
     99         # for i in les:
    100         #     print('编号',i.id,'课节名>>:',i)
    101         les_id=input('请按编号选择课节 >>:').strip()
    102         if les_id.isdigit():
    103             for i in les:
    104                 if int(les_id)==i.id:
    105                     return int(les_id)#返回课节ID
    106             else:
    107                 print('选择课节有误!')
    108                 return None
    109         else:
    110             print('选择课节有误!')
    111             return None
    112 
    113     #创建班级
    114     def add_class(self):#创建班级
    115         print('\033[35;1m创建班级界面\033[0m'.center(60,'='))
    116         attr=input("输入班级名>>:").strip()
    117         if attr in self.class_list:#如果存在
    118             return print('班级名重复!')
    119         c=admin_class.Class_name(name=attr)#创建新班级
    120         self.teach_obj.class_n.append(c)#关联讲师与班级
    121         if self.add_all(c):#进行调用添加
    122             self.Session.add_all([c])
    123             self.Session.commit()
    124         return
    125 
    126     #班级增加学员
    127     def add_student(self):#班级增加学员
    128         print('\033[35;1m增加学员界面\033[0m'.center(60,'='))
    129         cla_id=self.class_l()#调用查看班级
    130         if not cla_id:return None
    131         #获取班级对象
    132         c=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()
    133         if not c:return None
    134         stu_l=self.student_l(c.name)#查看班级学员
    135         student_qq=input('请输入学生QQ号码>>:').strip()
    136         s_qq=self.Session.query(admin_class.Student).filter(admin_class.Student.qq==int(student_qq)).first()#学员qq对象
    137         if s_qq:#如果有这个qq
    138             c.students.append(s_qq)#加入班级
    139             self.Session.commit()
    140             print('加入班级成功!')
    141         else:
    142             return print('QQ对应的学员不存在')
    143 
    144     #添加课节
    145     def add_lesson(self):#添加课节
    146         print('现有课节'.center(40,'='))
    147         les=self.less_cher()#取课节名列表
    148         day_name=input('输入课节名>>:').strip()
    149         d1=admin_class.Lesson(name=day_name)
    150         self.add_all(d1)
    151 
    152     #获取课程ID
    153     def class_less(self,cla_id,les_id):
    154 
    155         cl_dayid=self.Session.query(admin_class.Class_Day).filter(admin_class.Class_Day.class_id==cla_id).\
    156             filter(admin_class.Class_Day.lesson_id==les_id).first()#获取班级课程表id
    157         if cl_dayid:
    158             return cl_dayid
    159         else:
    160             return None
    161 
    162     #获取班级对象
    163     def class_obj(self,cla_id):
    164         clas_obj=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()#获取班级对象
    165         return clas_obj
    166 
    167     #开始上课
    168     def add_cla_day(self):#开始上课
    169         print('\033[32;1m班级上课\033[0m'.center(60,'='))
    170         cla_id=self.class_l()##获取班级id
    171         if not cla_id:return None
    172         les_id=self.lesson_l()#获取课节id
    173         if not les_id:return None
    174         clas_obj=self.class_obj(cla_id)#获取班级对象
    175         print(clas_obj,clas_obj.id)#班级名,ID
    176         cl_dayid=self.class_less(cla_id,les_id)#获取课程表对象
    177         if cl_dayid:#如果课程表存在
    178             print('当前班级该节课已经上过!')
    179             return
    180         clas_day=admin_class.Class_Day(class_id=cla_id,lesson_id=les_id)#创建上课课程记录
    181         self.Session.add(clas_day)#添加记录
    182         cl_day_id=self.class_less(cla_id,les_id)#获取当前班级课程对象
    183         c_obj=self.student_l(cl_day_id.class_n)#获取班级   学员对象
    184         for i in c_obj.students:
    185             stu_work=admin_class.Student_work(students_id=i.id,class_id=cl_day_id.id,status='not')#创建上课记录
    186             self.Session.add(stu_work)#添加记录
    187         self.Session.commit()
    188         return print('上课记录添加完成')
    189 
    190     #批改作业
    191     def set_results(self):#批改作业
    192         print('\033[32;1m批改作业\033[0m'.center(60,'='))
    193         cla_id=self.class_l()##获取班级id
    194         if not cla_id:return None
    195         les_id=self.lesson_l()#获取课节id
    196         if not les_id:return None
    197         cl_day_id=self.class_less(cla_id,les_id)#获取课程表对象
    198         if not cl_day_id:print('本节课未上!');return None
    199         #获取当前班级中,
    200         stude_day=self.Session.query(admin_class.Student_work).filter(admin_class.Student_work.class_id==cl_day_id.id).all()
    201         print('\033[36;1m开始批改作业\033[0m'.center(60,'='))
    202         print('\033[31;1m作业未提交则不显示\033[0m')
    203         for i in stude_day:
    204             if i.status=='yes' and not i.results:
    205                 print(i.id,'姓名:',i.students_w.name,'成绩:',i.results)
    206                 resu=input('请输入成绩>>:').strip()
    207                 if resu.isdigit():
    208                     self.Session.query(admin_class.Student_work).filter(admin_class.Student_work.id==i.id).update({"results":resu})
    209             elif i.status=='yes' and i.results:
    210                 print(i.id,'姓名:',i.students_w.name,'成绩:',i.results)
    211                 resu=input('是否修改成绩? N/n 跳过,输入新成绩').upper().strip()
    212                 if resu=='N':
    213                     continue
    214                 if resu.isdigit():
    215                     self.Session.query(admin_class.Student_work).filter(admin_class.Student_work.id==i.id).update({"results":resu})
    216 
    217         else:
    218             self.Session.commit()
    219             print("已提交的作业全部批改完毕!")
    220 
    221     #增加函数
    222     def add_all(self,lists):#增加函数
    223         self.Session.add_all([lists])
    224         confirm=input('请进行确认: 按\033[31;1mN\033[0m回滚操作,其他键确认!' ).upper().strip()
    225         if confirm=="N":
    226             self.Session.rollback()#
    227             return False
    228         try:
    229             self.Session.commit()
    230             print('操作成功')
    231             return lists
    232         except Exception as e:
    233             self.Session.rollback()#
    234             print('操作失败!,可能该信息已经存在!')
    235             return
    236 
    237     #退出
    238     def tech_exit(self):
    239         return  exit()
    240     #登陆
    241     def user_log(self):#登陆
    242             user_n=input('请输入用户名>>:').strip()
    243             aut_obj=self.Session.query(admin_class.Teacher).filter(admin_class.Teacher.user==user_n).first()
    244             if aut_obj:
    245                 #print(self.aut_obj_1.pwd)#用户对应密码
    246                 pwds=input('请输入密码>>:').strip()
    247                 if pwds == aut_obj.pwd:
    248                     self.teach_name=aut_obj.name
    249                     #print(self.teach_name)#当前讲师姓名
    250                     self.teach_obj = self.Session.query(admin_class.Teacher).filter(admin_class.Teacher.name==self.teach_name).first()#取当前讲课对象实例
    251                     self.class_list=self.Session.query(admin_class.Class_name).all()#获取班级名列表
    252                     #self.les=self.Session.query(admin_class.Lesson).all()#取课节名列表
    253                     #print(self.s_name_list[2])
    254                     self.openatin()
    255                 else:
    256                     print('密码有误')
    257                     return
    258             else:
    259                 print('输入的用户名不存')
    260                 return
    261 
    262 #Session.query()
    263 while True:
    264     teach=Teach_Mag()
    265     #teach.add_teach()
    266     #teach.add_stu()
    267 
    268     teach.user_log()
    View Code

     



     

    以上就是python第六十八天--第十二周作业的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:python 第十二 六十八
    上一篇:推荐几本关于的Python好书 下一篇:编写登录接口实例详解
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• Python pygame入门基础教程• 带你了解Python进程管理神器Supervisor• Python的functools模块使用总结• Python轻量级搜索工具Whoosh的使用(总结分享)• python正则表达式如何实现重叠匹配
    1/1

    PHP中文网