• 学员管理系统(SQLAlchemy 实现)


     

    一、业务逻辑

    二、设计表结构

    三、代码结构

    start.py  

    import os, sys
    sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    
    if __name__ == '__main__':
        from core import main
        main.Management_center()

    main.py   处理不同角色请求

     1 from core.color import Colors
     2 from core.center_admin import Center_admin
     3 from core.center_student import Center_student
     4 from core.center_teacher import Center_teacher
     5 from core.create_table import User
     6 from sqlalchemy import create_engine
     7 from sqlalchemy.orm import sessionmaker
     8 import hashlib
     9 
    10 class Management_center(object):
    11     def __init__(self):
    12         engine = create_engine("mysql+pymysql://root:123456@10.0.0.15/studentdb?charset=utf8")#, echo=True)
    13         Session_class = sessionmaker(bind=engine)
    14         self.session = Session_class()
    15         self.init_db()
    16         self.interactive()
    17 
    18     def init_db(self):
    19         from core import create_table
    20         #创建表结构
    21         create_table.create_table()
    22         print(Colors('init database done..', 'green'))
    23         #初始化admin管理员用户
    24         if not self.session.query(User).filter(User.username=='admin').first():
    25             md5 = hashlib.md5()
    26             md5.update('admin'.encode('utf-8'))
    27             md5_password = md5.hexdigest()
    28             user_obj_admin = User(username='admin', password=md5_password, permission=0)
    29             self.session.add_all([user_obj_admin, ])
    30             self.session.commit()
    31             print(Colors('初始化admin管理员用户完成!', 'green'))
    32 
    33     def interactive(self):
    34         while True:
    35             print("欢迎来到学员管理系统".center(45, '-'))
    36             msg = """
    37                 1.管理员中心
    38                 2.讲师中心
    39                 3.学生中心
    40                 4.退出
    41             """
    42             print(Colors(msg))
    43             print("".center(50, '-'))
    44             choice = input(Colors('请输入要进入的中心:', 'cyan')).strip()
    45             if choice == '1':
    46                 Center_admin(self.session)
    47             elif choice == '2':
    48                 Center_teacher(self.session)
    49             elif choice == '3':
    50                 Center_student(self.session)
    51             elif choice == '4':
    52                 exit('Bye')
    53             else:
    54                 print(Colors('请输入正确的选项!', 'red'))
    main.py

    center_admin.py    管理员中心

       1 # Author:ton
       2 # -*- coding: utf-8 -*-
       3 from core.color import Colors
       4 from core import commons
       5 from core import auth
       6 from core.create_table import Course_m2m_class, User, School, Course, Teacher, Class, Student, Lesson, C2c_m2m_lesson,
       7     Study_record, school_m2m_course, school_m2m_teacher, school_m2m_student, student_m2m_class
       8 import hashlib
       9 
      10 
      11 class Center_admin(object):
      12     """管理员中心"""
      13     def __init__(self, session):
      14         self.session = session
      15         self.handle()
      16 
      17     @auth.auth(permission=0)
      18     def handle(self):
      19         while True:
      20             class_dic = {
      21                 '1':Manage_school,
      22                 '2':Manage_course,
      23                 '3':Manage_teacher,
      24                 '4':Manage_class,
      25                 '5':Manage_student,
      26             }
      27             print("管理员中心".center(45, '-'))
      28             msg = """
      29                 1.校区管理
      30                 2.课程管理
      31                 3.讲师管理
      32                 4.班级管理
      33                 5.学员管理
      34                 6.退出并返回系统主界面
      35             """
      36             print(Colors(msg))
      37             print('当前用户:%s' %self.user.username)
      38             print("".center(50, '-'))
      39             choice = input(Colors('请输入要执行的指令:', 'cyan')).strip()
      40             if choice == '6':break
      41             if class_dic.get(choice):
      42                 class_dic.get(choice)(self.session, self.user)
      43             else:
      44                 print(Colors('无效的指令!', 'red'))
      45 
      46 class Manage_school(object):
      47     """校区管理"""
      48     def __init__(self, session, user):
      49         self.session = session
      50         self.user = user
      51         self.handle()
      52 
      53     def handle(self):
      54         while True:
      55             print("校区管理界面".center(45, '-'))
      56             msg = """
      57                 创建校区 create_school
      58                 查看校区 display_school
      59                 删除校区 delete_school
      60                 修改校区 update_school
      61                 添加/删除课程 add_course/del_course
      62                 查看各校区已有课程 display_sch_courses
      63                 添加/删除讲师 add_teacher/del_teacher
      64                 查看各校区已有讲师 display_sch_teachers
      65                 查看各校区已有班级 display_sch_classes
      66                 添加/删除学员 add_student/del_student
      67                 查看各校区已有学员 display_sch_students
      68                 返回管理员中心 b
      69             """
      70             print(Colors(msg))
      71             print('当前用户:%s' %self.user.username)
      72             print("".center(50, '-'))
      73             choice = input(Colors('请输入要执行的指令(b 返回):', 'cyan')).strip()
      74             if choice == 'b':break
      75             if hasattr(self, choice):
      76                 getattr(self, choice)()
      77             else:
      78                 print(Colors('无效的指令!', 'red'))
      79 
      80     def create_school(self):
      81         while True:
      82             add_school_name = input(Colors('请输入要创建的校区名(b 返回):', 'cyan')).strip()
      83             if add_school_name == 'b':break
      84             if not add_school_name:continue
      85             #判断该校区名是否存在
      86             sch_obj = self.session.query(School).filter(School.name==add_school_name).first()
      87             if sch_obj:
      88                 print(Colors('该校区名已存在!', 'red'))
      89                 continue
      90             while True:
      91                 add_school_address = input(Colors('请输入校区地址(b 返回):', 'cyan')).strip()
      92                 if add_school_address == 'b':break
      93                 if not add_school_address:continue
      94                 #更新School表
      95                 sch_obj = School(name=add_school_name, address=add_school_address)
      96                 self.session.add_all([sch_obj, ])
      97                 self.session.commit()
      98                 print(Colors('创建校区成功!', 'green'))
      99                 break
     100 
     101     def display_school(self):
     102         return commons.display_school(self.session)
     103 
     104     def delete_school(self):
     105         while True:
     106             #判断School表是否为空
     107             if not self.display_school():break
     108             del_school_name = input(Colors('请输入要删除的校区名(b 返回):', 'cyan')).strip()
     109             if not del_school_name:continue
     110             if del_school_name == 'b':break
     111             #判断该校区名是否存在
     112             sch_obj = self.session.query(School).filter(School.name==del_school_name).first()
     113             if not sch_obj:
     114                 print(Colors('该校区名不存在!', 'red'))
     115                 continue
     116             else:
     117                 #删除School表记录
     118                 self.session.delete(sch_obj)
     119                 self.session.commit()
     120                 print(Colors('删除校区成功!', 'green'))
     121 
     122     def update_school(self):
     123         while True:
     124             #判断School表是否为空
     125             if not self.display_school():break
     126             update_school_name = input(Colors('请输入要修改的校区名(b 返回):', 'cyan')).strip()
     127             if not update_school_name:continue
     128             if update_school_name == 'b':break
     129             #判断该校区名是否存在
     130             sch_obj = self.session.query(School).filter(School.name==update_school_name).first()
     131             if not sch_obj:
     132                 print(Colors('该校区名不存在!', 'red'))
     133                 continue
     134             else:
     135                 #修改School表记录
     136                 column_school = [{'name':'校区名'}, {'address':'地址'}, ]
     137                 res = commons.update_table(self.session, column_school, sch_obj)
     138                 if not res:return
     139 
     140     def add_course(self):
     141         """为某校区增设课程"""
     142         sch_obj = commons.choice_school(self.session)
     143         if not sch_obj:return
     144         while True:
     145             #查看所有课程并判断Course表是否为空
     146             if not commons.display_course(self.session):return
     147             #展示该校区已有课程信息
     148             commons.display_sch_courses(sch_obj)
     149             add_course_name = input(Colors('请输入要增设的课程名(b 返回):', 'cyan')).strip()
     150             if not add_course_name:continue
     151             if add_course_name == 'b':break
     152             #判断该课程名是否存在
     153             cou_obj = self.session.query(Course).filter(Course.name==add_course_name).first()
     154             if not cou_obj:
     155                 print(Colors('该课程名不存在!', 'red'))
     156                 continue
     157             #判断该校区是否已经有该课程
     158             if cou_obj not in sch_obj.courses:
     159                 #更新school_m2m_course表
     160                 sch_obj.courses.append(cou_obj)
     161                 self.session.commit()
     162                 print(Colors('增设课程成功!', 'green'))
     163             else:
     164                 print(Colors('该校区已经有该课程!', 'red'))
     165 
     166     def display_sch_courses(self):
     167         """查看各校区已有课程"""
     168         sch_obj_li = self.session.query(School).all()
     169         if sch_obj_li:
     170             for sch_obj in sch_obj_li:
     171                 #展示某校区所有课程信息
     172                 commons.display_sch_courses(sch_obj)
     173         else:
     174             print(Colors('现在还没有校区,请先创建校区!', 'red'))
     175 
     176     def del_course(self):
     177         sch_obj = commons.choice_school(self.session)
     178         if not sch_obj:return
     179         while True:
     180             #展示该校区已有课程信息
     181             res = commons.display_sch_courses(sch_obj)
     182             if not res:return
     183             del_course_name = input(Colors('请输入要删除的课程名(b 返回):', 'cyan')).strip()
     184             if not del_course_name:continue
     185             if del_course_name == 'b':break
     186             #判断该校区是否存在该课程
     187             cou_obj = self.session.query(Course).join(school_m2m_course).join(School).filter(School.name==sch_obj.name).filter(Course.name==del_course_name).first()
     188             if not cou_obj:
     189                 print(Colors('该校区没有该课程!', 'red'))
     190                 continue
     191             else:
     192                 #删除该校区的该课程
     193                 sch_obj.courses.remove(cou_obj)
     194                 self.session.commit()
     195                 print(Colors('删除课程[%s]成功!'%cou_obj.name, 'green'))
     196 
     197     def add_teacher(self):
     198         sch_obj = commons.choice_school(self.session)
     199         if not sch_obj:return
     200         while True:
     201             #查看所有讲师并判断Teacher表是否为空
     202             if not commons.display_teacher(self.session):return
     203             #展示该校区已有讲师信息
     204             commons.display_sch_teachers(sch_obj)
     205             add_tea_card_id = input(Colors('请输入要创建的讲师身份证号码(b 返回):', 'cyan')).strip()
     206             if not add_tea_card_id:continue
     207             if add_tea_card_id == 'b':break
     208             #判断该讲师身份证号是否存在
     209             tea_obj = self.session.query(Teacher).filter(Teacher.card_id==add_tea_card_id).first()
     210             if not tea_obj:
     211                 print(Colors('该讲师身份证号不存在!', 'red'))
     212                 continue
     213             #判断该校区是否已经有该讲师
     214             if tea_obj not in sch_obj.teachers:
     215                 #更新school_m2m_teacher表
     216                 sch_obj.teachers.append(tea_obj)
     217                 self.session.commit()
     218                 print(Colors('添加讲师成功!', 'green'))
     219             else:
     220                 print(Colors('该校区已经有该讲师!', 'red'))
     221 
     222     def display_sch_teachers(self):
     223         """查看各校区已有讲师"""
     224         sch_obj_li = self.session.query(School).all()
     225         if sch_obj_li:
     226             for sch_obj in sch_obj_li:
     227                 #展示某校区所有讲师信息
     228                 commons.display_sch_teachers(sch_obj)
     229         else:
     230             print(Colors('现在还没有校区,请先创建校区!', 'red'))
     231 
     232     def del_teacher(self):
     233         sch_obj = commons.choice_school(self.session)
     234         if not sch_obj:return
     235         while True:
     236             #展示该校区已有讲师信息
     237             res = commons.display_sch_teachers(sch_obj)
     238             if not res:return
     239             del_tea_card_id = input(Colors('请输入要删除的讲师身份证号码(b 返回):', 'cyan')).strip()
     240             if not del_tea_card_id:continue
     241             if del_tea_card_id == 'b':break
     242             #判断该校区是否存在该讲师
     243             tea_obj = self.session.query(Teacher).join(school_m2m_teacher).join(School).filter(School.name==sch_obj.name).filter(Teacher.card_id==del_tea_card_id).first()
     244             if not tea_obj:
     245                 print(Colors('校区[%s]没有该讲师身份证号码[%s]!'%(sch_obj.name, del_tea_card_id), 'red'))
     246                 continue
     247             else:
     248                 #删除该校区的该讲师
     249                 sch_obj.teachers.remove(tea_obj)
     250                 self.session.commit()
     251                 print(Colors('删除讲师[%s]成功!'%tea_obj.name, 'green'))
     252 
     253     def display_sch_classes(self):
     254         """查看各校区已有班级"""
     255         sch_obj_li = self.session.query(School).all()
     256         if sch_obj_li:
     257             for sch_obj in sch_obj_li:
     258                 #展示某校区所有班级信息
     259                 commons.display_sch_classes(sch_obj)
     260         else:
     261             print(Colors('现在还没有校区,请先创建校区!', 'red'))
     262 
     263     def add_student(self):
     264         sch_obj = commons.choice_school(self.session)
     265         if not sch_obj:return
     266         while True:
     267             #查看所有学员并判断Student表是否为空
     268             if not commons.display_student(self.session):return
     269             #展示该校区已有学员信息
     270             commons.display_sch_students(sch_obj)
     271             add_stu_qq = input(Colors('请输入要添加的学员QQ(b 返回):', 'cyan')).strip()
     272             if not add_stu_qq:continue
     273             if add_stu_qq == 'b':break
     274             #判断该学员QQ是否存在
     275             stu_obj = self.session.query(Student).filter(Student.qq==add_stu_qq).first()
     276             if not stu_obj:
     277                 print(Colors('该学员QQ[%s]不存在!'%add_stu_qq, 'red'))
     278                 continue
     279             #判断该校区是否已经有该学员
     280             if stu_obj not in sch_obj.students:
     281                 #更新school_m2m_student表
     282                 sch_obj.students.append(stu_obj)
     283                 self.session.commit()
     284                 print(Colors('添加学员[%s]成功!'%stu_obj.name, 'green'))
     285             else:
     286                 print(Colors('校区[%s]已经有学员[%s]!'%(sch_obj.name, stu_obj.name), 'red'))
     287 
     288     def display_sch_students(self):
     289         """查看各校区已有学员"""
     290         sch_obj_li = self.session.query(School).all()
     291         if sch_obj_li:
     292             for sch_obj in sch_obj_li:
     293                 #展示某校区所有学员信息
     294                 commons.display_sch_students(sch_obj)
     295         else:
     296             print(Colors('现在还没有校区,请先创建校区!', 'red'))
     297 
     298     def del_student(self):
     299         sch_obj = commons.choice_school(self.session)
     300         if not sch_obj:return
     301         while True:
     302             #展示该校区已有学员信息
     303             res = commons.display_sch_students(sch_obj)
     304             if not res:return
     305             del_stu_qq = input(Colors('请输入要删除的学员QQ(b 返回):', 'cyan')).strip()
     306             if not del_stu_qq:continue
     307             if del_stu_qq == 'b':break
     308             #判断该校区是否存在该学员
     309             stu_obj = self.session.query(Student).join(school_m2m_student).join(School).filter(School.name==sch_obj.name).filter(Student.qq==del_stu_qq).first()
     310             if not stu_obj:
     311                 print(Colors('校区[%s]不存在该学员QQ[%s]!'%(sch_obj.name, del_stu_qq), 'red'))
     312                 continue
     313             else:
     314                 #删除该校区的该学员
     315                 sch_obj.students.remove(stu_obj)
     316                 self.session.commit()
     317                 print(Colors('删除学员[%s]成功!'%stu_obj.name, 'green'))
     318 
     319 class Manage_course(object):
     320     def __init__(self, session, user):
     321         self.session = session
     322         self.user = user
     323         self.handle()
     324 
     325     def handle(self):
     326         while True:
     327             print("课程管理界面".center(45, '-'))
     328             msg = """
     329                 创建课程 create_course
     330                 查看课程 display_course
     331                 删除课程 delete_course
     332                 修改课程 update_course
     333                 返回管理员中心 b
     334             """
     335             print(Colors(msg))
     336             print('当前用户:%s' %self.user.username)
     337             print("".center(50, '-'))
     338             choice = input(Colors('请输入要执行的指令(b 返回):', 'cyan')).strip()
     339             if choice == 'b':break
     340             if hasattr(self, choice):
     341                 getattr(self, choice)()
     342             else:
     343                 print(Colors('无效的指令!', 'red'))
     344 
     345     def create_course(self):
     346         while True:
     347             add_course_name = input(Colors('请输入要创建的课程名(b 返回):', 'cyan')).strip()
     348             if add_course_name == 'b':break
     349             if not add_course_name:continue
     350             cou_obj = self.session.query(Course).filter(Course.name==add_course_name).first()
     351             #判断该课程名是否存在
     352             if cou_obj:
     353                 print(Colors('该课程名已存在!', 'red'))
     354                 continue
     355             while True:
     356                 add_course_price = input(Colors('请输入课程价格(b 返回):', 'cyan')).strip()
     357                 if add_course_price == 'b':break
     358                 if not add_course_price:continue
     359                 if not add_course_price.isdigit():
     360                     print(Colors('无效的价格,请输入数字!', 'red'))
     361                     continue
     362                 #更新Course表
     363                 cou_obj = Course(name=add_course_name, price=add_course_price)
     364                 self.session.add_all([cou_obj, ])
     365                 self.session.commit()
     366                 print(Colors('创建课程成功!', 'green'))
     367                 break
     368 
     369     def display_course(self):
     370         return commons.display_course(self.session)
     371 
     372     def delete_course(self):
     373         while True:
     374             #判断Course表是否为空
     375             if not self.display_course():break
     376             del_course_name = input(Colors('请输入要删除的课程名(b 返回):', 'cyan')).strip()
     377             if not del_course_name:continue
     378             if del_course_name == 'b':break
     379             #判断该课程名是否存在
     380             cou_obj = self.session.query(Course).filter(Course.name==del_course_name).first()
     381             if not cou_obj:
     382                 print(Colors('该课程名不存在!', 'red'))
     383                 continue
     384             else:
     385                 #删除Course表记录
     386                 self.session.delete(cou_obj)
     387                 self.session.commit()
     388                 print(Colors('删除课程成功!', 'green'))
     389 
     390     def update_course(self):
     391         while True:
     392             #判断Course表是否为空
     393             if not self.display_course():break
     394             update_course_name = input(Colors('请输入要修改的课程名(b 返回):', 'cyan')).strip()
     395             if not update_course_name:continue
     396             if update_course_name == 'b':break
     397             #判断该课程名是否存在
     398             cou_obj = self.session.query(Course).filter(Course.name==update_course_name).first()
     399             if not cou_obj:
     400                 print(Colors('该课程名不存在!', 'red'))
     401                 continue
     402             else:
     403                 #修改Course表记录
     404                 column_course = [{'name':'课程名'}, {'price':'价格'}, ]
     405                 res = commons.update_table(self.session, column_course, cou_obj)
     406                 if not res:return
     407 
     408 class Manage_teacher(object):
     409     def __init__(self, session, user):
     410         self.session = session
     411         self.user = user
     412         self.handle()
     413 
     414     def handle(self):
     415         while True:
     416             print("讲师管理界面".center(45, '-'))
     417             msg = """
     418                 创建讲师 create_teacher
     419                 查看讲师 display_teacher
     420                 删除讲师 delete_teacher
     421                 修改讲师 update_teacher
     422                 添加/删除任课的班级课程 add_c2c/del_c2c
     423                 查看各讲师任课的班级课程 display_tea_c2c
     424                 返回管理员中心 b
     425             """
     426             print(Colors(msg))
     427             print('当前用户:%s' %self.user.username)
     428             print("".center(50, '-'))
     429             choice = input(Colors('请输入要执行的指令(b 返回):', 'cyan')).strip()
     430             if choice == 'b':break
     431             if hasattr(self, choice):
     432                 getattr(self, choice)()
     433             else:
     434                 print(Colors('无效的指令!', 'red'))
     435 
     436     def create_teacher(self):
     437         while True:
     438             add_teacher_card_id = input(Colors('请输入要创建的讲师身份证号码(b 返回):', 'cyan')).strip()
     439             if add_teacher_card_id == 'b':break
     440             if not add_teacher_card_id:continue
     441             if not add_teacher_card_id[:-1].isdigit() or not len(add_teacher_card_id) == 18:
     442                 print(Colors('无效的身份证号码,请输入正确格式身份证号码!', 'red'))
     443                 continue
     444             tea_obj = self.session.query(Teacher).filter(Teacher.card_id==add_teacher_card_id).first()
     445             if tea_obj:
     446                 print(Colors('该身份证号码已存在!', 'red'))
     447                 continue
     448             while True:
     449                 add_teacher_name = input(Colors('请输入要创建的讲师名(b 返回):', 'cyan')).strip()
     450                 if add_teacher_name == 'b':break
     451                 if not add_teacher_name:continue
     452                 user_obj_id = commons.create_user(self.session, 1)
     453                 if not user_obj_id:continue
     454                 #更新teacher表
     455                 tea_obj = Teacher(name=add_teacher_name, card_id=add_teacher_card_id, user_id=user_obj_id)
     456                 self.session.add_all([tea_obj, ])
     457                 self.session.commit()
     458                 print(Colors('创建讲师成功!', 'green'))
     459                 break
     460 
     461     def display_teacher(self):
     462         return commons.display_teacher(self.session)
     463 
     464     def delete_teacher(self):
     465         while True:
     466             print("开始删除讲师".center(45, '-'))
     467             #判断Teacher表是否为空
     468             if not self.display_teacher():break
     469             del_tea_card_id = input(Colors('请输入要删除的讲师的身份证号码(b 返回):', 'cyan')).strip()
     470             if not del_tea_card_id:continue
     471             if del_tea_card_id == 'b':break
     472             #判断该讲师身份证号码是否存在
     473             tea_obj = self.session.query(Teacher).filter(Teacher.card_id==del_tea_card_id).first()
     474             if not tea_obj:
     475                 print(Colors('该讲师身份证号码不存在!', 'red'))
     476                 continue
     477             else:
     478                 #删除Teacher表记录
     479                 self.session.delete(tea_obj)
     480                 #删除User表
     481                 self.session.delete(tea_obj.user)
     482                 self.session.commit()
     483                 print(Colors('删除讲师成功!同时该讲师账号已被注销!', 'green'))
     484 
     485     def update_teacher(self):
     486         while True:
     487             #判断Teacher表是否为空
     488             if not self.display_teacher():break
     489             update_tea_card_id = input(Colors('请输入要修改的讲师的身份证号码(b 返回):', 'cyan')).strip()
     490             if not update_tea_card_id:continue
     491             if update_tea_card_id == 'b':break
     492             #判断该讲师身份证号码是否存在
     493             tea_obj = self.session.query(Teacher).filter(Teacher.card_id==update_tea_card_id).first()
     494             if not tea_obj:
     495                 print(Colors('该讲师身份证号码不存在!', 'red'))
     496                 continue
     497             else:
     498                 #修改Teacher表记录
     499                 column_teacher = [{'name':'讲师名'}, {'card_id':'身份证号码'},]
     500                 res = commons.update_table(self.session, column_teacher, tea_obj)
     501                 if not res:return
     502 
     503     def add_c2c(self):
     504         tea_obj = commons.choice_teacher(self.session)
     505         if not tea_obj:return
     506         while True:
     507             #选择该讲师任教的校区
     508             if not commons.display_tea_schools(tea_obj):return
     509             sch_name = input(Colors('请选择任教的校区名(b 结束操作):', 'cyan')).strip()
     510             if sch_name == 'b':return
     511             if not sch_name:continue
     512             sch_obj = self.session.query(School).join(school_m2m_teacher).join(Teacher).
     513                 filter(Teacher.name==tea_obj.name).filter(School.name==sch_name).first()
     514             if not sch_obj:
     515                 print(Colors('讲师[%s]没有任教该校区[%s]!'%(tea_obj.name, sch_name), 'red'))
     516                 continue
     517             while True:
     518                 #判断该校区是否有班级,有则继续选择讲师任课的班级
     519                 if not commons.display_sch_classes(sch_obj):break
     520                 commons.display_tea_sch_c2c(tea_obj, sch_obj)
     521                 cls_name = input(Colors('请输入讲师[%s]任课的班级名(b 返回):'%tea_obj.name, 'cyan')).strip()
     522                 if cls_name == 'b':break
     523                 if not cls_name:continue
     524                 cls_obj = self.session.query(Class).join(School).filter(School.name==sch_name).filter(Class.name==cls_name).first()
     525                 if not cls_obj:
     526                     print(Colors('校区[%s]不存在班级[%s]!'%(sch_name, cls_name), 'red'))
     527                     continue
     528                 while True:
     529                     #判断该班级是否有关联课程,有则继续选择讲师任课的课程
     530                     if not commons.display_cls_courses(cls_obj):break
     531                     commons.display_tea_cls_courses(self.session, tea_obj, cls_obj)
     532                     cou_name = input(Colors('请输入讲师[%s]任课的课程名(b 返回):'%tea_obj.name, 'cyan')).strip()
     533                     if cou_name == 'b':break
     534                     if not cou_name:continue
     535                     cou_obj = self.session.query(Course).join(Course_m2m_class).filter(Course_m2m_class.class_id==cls_obj.id).filter(Course.name==cou_name).first()
     536                     if not cou_obj:
     537                         print(Colors('班级[%s]没有添加课程[%s]!'%(sch_name, cls_name), 'red'))
     538                         continue
     539                     add_c2c_obj = self.session.query(Course_m2m_class).filter(Course_m2m_class.course_id==cou_obj.id).
     540                         filter(Course_m2m_class.class_id==cls_obj.id).filter(Course_m2m_class.teacher_id.isnot(None)).first()
     541                     if add_c2c_obj:
     542                         used_tea_obj = self.session.query(Teacher).join(Course_m2m_class).filter(Course_m2m_class.course_id==cou_obj.id)
     543                             .filter(Course_m2m_class.class_id==cls_obj.id).first()
     544                         print(Colors('该班级-课程[%s]已有任课讲师%s!请先删除该班级-课程的任课讲师'%(add_c2c_obj, used_tea_obj.name), 'red'))
     545                         continue
     546                     add_c2c_obj = self.session.query(Course_m2m_class).filter(Course_m2m_class.course_id==cou_obj.id).
     547                                         filter(Course_m2m_class.class_id==cls_obj.id).first()
     548                     #更新course_m2m_class表
     549                     print(add_c2c_obj)
     550                     tea_obj.course_m2m_classes.append(add_c2c_obj)
     551                     self.session.commit()
     552                     print(Colors('添加任课的班级-课程[%s]成功!'%add_c2c_obj, 'green'))
     553 
     554     def del_c2c(self):
     555         while True:
     556             tea_obj = commons.choice_teacher(self.session)
     557             if not tea_obj:return
     558             if not tea_obj.course_m2m_classes:
     559                 print(Colors('讲师[%s]还没有添加任课的班级-课程'%tea_obj.name, 'red'))
     560                 continue
     561             while True:
     562                 #选择该讲师任教的校区
     563                 if not commons.display_tea_schools(tea_obj):return
     564                 sch_name = input(Colors('请选择任教的校区名(b 结束操作):', 'cyan')).strip()
     565                 if sch_name == 'b':return
     566                 if not sch_name:continue
     567                 sch_obj = self.session.query(School).join(school_m2m_teacher).join(Teacher).
     568                     filter(Teacher.id==tea_obj.id).filter(School.name==sch_name).first()
     569                 if not sch_obj:
     570                     print(Colors('讲师[%s]没有任教该校区[%s]!'%(tea_obj.name, sch_name), 'red'))
     571                     continue
     572                 while True:
     573                     #判断该讲师是否有任课的班级,有则继续选择删除任课的班级
     574                     if not commons.display_tea_sch_c2c(tea_obj, sch_obj):break
     575                     cls_name = input(Colors('请输入要删除任课的班级名(b 返回):', 'cyan')).strip()
     576                     if cls_name == 'b':break
     577                     if not cls_name:continue
     578                     while True:
     579                         cou_name = input(Colors('请输入要删除任课的课程名(b 返回):', 'cyan')).strip()
     580                         if cou_name == 'b':break
     581                         if not cou_name:continue
     582                         c2c_obj = self.session.query(Course_m2m_class).join(Course).join(Class).
     583                             filter(Class.school_id==sch_obj.id).filter(Class.name==cls_name).filter(Course.name==cou_name).first()
     584                         if c2c_obj not in tea_obj.course_m2m_classes:
     585                             print(Colors('讲师[%s]没有任课班级-课程[%s %s]'%(tea_obj.name, cls_name, cou_name), 'red'))
     586                             continue
     587                         #更新course_m2m_class表
     588                         tea_obj.course_m2m_classes.remove(c2c_obj)
     589                         self.session.commit()
     590                         print(Colors('删除任课的班级-课程[%s]成功!'%c2c_obj, 'green'))
     591 
     592     def display_tea_c2c(self):
     593         """查看各讲师任教的各校区任课的班级课程"""
     594         tea_obj_li = self.session.query(Teacher).all()
     595         if tea_obj_li:
     596             for tea_obj in tea_obj_li:
     597                 for sch_obj in tea_obj.schools:
     598                     commons.display_tea_sch_c2c(tea_obj, sch_obj)
     599         else:
     600             print(Colors('现在还没有讲师,请先创建讲师!', 'red'))
     601 
     602 class Manage_student(object):
     603     def __init__(self, session, user):
     604         self.session = session
     605         self.user = user
     606         self.handle()
     607 
     608     def handle(self):
     609         while True:
     610             print("学员管理界面".center(45, '-'))
     611             msg = """
     612                 创建学员 create_student
     613                 查看学员 display_student
     614                 删除学员 delete_student
     615                 修改学员 update_student
     616                 返回管理员中心 b
     617             """
     618             print(Colors(msg))
     619             print('当前用户:%s' %self.user.username)
     620             print("".center(50, '-'))
     621             choice = input(Colors('请输入要执行的指令(b 返回):', 'cyan')).strip()
     622             if choice == 'b':break
     623             if hasattr(self, choice):
     624                 getattr(self, choice)()
     625             else:
     626                 print(Colors('无效的指令!', 'red'))
     627 
     628     def create_student(self):
     629         while True:
     630             add_stu_qq = input(Colors('请输入学生qq(b 返回):', 'cyan')).strip()
     631             if add_stu_qq == 'b':return
     632             if not add_stu_qq:continue
     633             if not add_stu_qq.isdigit() or not len(add_stu_qq) > 3:
     634                 print(Colors('无效的qq号,请输入正确格式qq号!', 'red'))
     635                 continue
     636             stu_obj = self.session.query(Student).filter(Student.qq==add_stu_qq).first()
     637             if stu_obj:
     638                 print(Colors('该qq号已存在!', 'red'))
     639                 continue
     640             while True:
     641                 add_stu_name = input(Colors('请输入要创建的学生名(b 返回):', 'cyan')).strip()
     642                 if add_stu_name == 'b':return
     643                 if not add_stu_name:continue
     644                 user_obj_id = commons.create_user(self.session, 2)
     645                 if not user_obj_id:continue
     646                 #更新student表
     647                 stu_obj = Student(name=add_stu_name, qq=add_stu_qq, user_id=user_obj_id)
     648                 self.session.add_all([stu_obj, ])
     649                 self.session.commit()
     650                 print(Colors('创建学生成功!', 'green'))
     651                 break
     652 
     653     def display_student(self):
     654         return commons.display_student(self.session)
     655 
     656     def delete_student(self):
     657         while True:
     658             #判断Student表是否为空
     659             if not self.display_student():break
     660             del_stu_qq = input(Colors('请输入要删除的学生的QQ号码(b 返回):', 'cyan')).strip()
     661             if not del_stu_qq:continue
     662             if del_stu_qq == 'b':break
     663             #判断该学生qq号码是否存在
     664             stu_obj = self.session.query(Student).filter(Student.qq==del_stu_qq).first()
     665             if not stu_obj:
     666                 print(Colors('该学生qq号码不存在!', 'red'))
     667                 continue
     668             else:
     669                 #删除Student表记录
     670                 self.session.delete(stu_obj)
     671                 #删除User表
     672                 self.session.delete(stu_obj.user)
     673                 self.session.commit()
     674                 print(Colors('删除学生成功!同时该学生账号已被注销!', 'green'))
     675 
     676     def update_student(self):
     677         while True:
     678             #判断Student表是否为空
     679             if not self.display_student():break
     680             update_stu_qq = input(Colors('请输入要修改的学生的QQ号码(b 返回):', 'cyan')).strip()
     681             if not update_stu_qq:continue
     682             if update_stu_qq == 'b':break
     683             #判断该学生qq号码是否存在
     684             stu_obj = self.session.query(Student).filter(Student.qq==update_stu_qq).first()
     685             if not stu_obj:
     686                 print(Colors('该学生qq号码不存在!', 'red'))
     687                 continue
     688             else:
     689                 #修改Student表记录
     690                 column_student = [{'name':'学生名'}, {'qq':'QQ号码'},]
     691                 res = commons.update_table(self.session, column_student, stu_obj)
     692                 if not res:return
     693 
     694 class Manage_class(object):
     695     def __init__(self, session, user):
     696         self.session = session
     697         self.user = user
     698         self.handle()
     699 
     700     def handle(self):
     701         while True:
     702             print("课程管理界面".center(45, '-'))
     703             msg = """
     704                 创建班级 create_class
     705                 查看班级 display_class
     706                 删除班级 delete_class
     707                 修改班级 update_class
     708                 添加/删除课程 add_course/del_course
     709                 添加/删除学员 add_student/del_student
     710                 查看各班级的课程 display_cls_course
     711                 查看各班级的学员 display_cls_student
     712                 返回管理员中心 b
     713             """
     714             print(Colors(msg))
     715             print('当前用户:%s' %self.user.username)
     716             print("".center(50, '-'))
     717             choice = input(Colors('请输入要执行的指令(b 返回):', 'cyan')).strip()
     718             if choice == 'b':break
     719             if hasattr(self, choice):
     720                 getattr(self, choice)()
     721             else:
     722                 print(Colors('无效的指令!', 'red'))
     723 
     724     def create_class(self):
     725         sch_obj = commons.choice_school(self.session)
     726         if not sch_obj:return
     727         while True:
     728             add_class_name = input(Colors('请输入要创建的班级名(b 返回):', 'cyan')).strip()
     729             if add_class_name == 'b':return
     730             if not add_class_name:continue
     731             #判断该校区是否已经存在该班级
     732             cls_obj = self.session.query(Class).join(School).filter(School.name==sch_obj.name).filter(Class.name==add_class_name).first()
     733             if cls_obj:
     734                 print(Colors('该校区已有该班级!', 'red'))
     735                 continue
     736             #更新Class表
     737             cls_obj = Class(name=add_class_name, school_id=sch_obj.id)
     738             self.session.add_all([cls_obj, ])
     739             self.session.commit()
     740             print(Colors('创建班级成功!', 'green'))
     741 
     742     def display_class(self):
     743         return commons.display_class(self.session)
     744 
     745     def delete_class(self):
     746         while True:
     747             #判断Class表是否为空
     748             if not self.display_class():break
     749             del_class_name = input(Colors('请输入要删除的班级名(b 返回):', 'cyan')).strip()
     750             if del_class_name == 'b':return
     751             sch_name = input(Colors('请输入删除的班级所属校区名(b 返回):', 'cyan')).strip()
     752             if sch_name == 'b':return
     753             #判断该校区是否存在该班级
     754             cls_obj = self.session.query(Class).join(School).filter(Class.name==del_class_name).filter(School.name==sch_name).first()
     755             if not cls_obj:
     756                 print(Colors('该校区[%s]下不存在班级[%s]!'%(sch_name, del_class_name), 'red'))
     757                 continue
     758             #删除Class表记录
     759             self.session.delete(cls_obj)
     760             self.session.commit()
     761             print(Colors('删除班级成功!', 'green'))
     762 
     763     def update_class(self):
     764         while True:
     765             #判断Class表是否为空
     766             if not self.display_class():break
     767             update_class_name = input(Colors('请输入要修改的班级名(b 返回):', 'cyan')).strip()
     768             if update_class_name == 'b':return
     769             sch_name = input(Colors('请输入要修改班级所属校区名(b 返回):', 'cyan')).strip()
     770             if sch_name == 'b':return
     771             #判断该校区是否存在该班级
     772             cls_obj = self.session.query(Class).join(School).filter(Class.name==update_class_name).filter(School.name==sch_name).first()
     773             if not cls_obj:
     774                 print(Colors('该校区[%s]下不存在班级[%s]!'%(sch_name, update_class_name), 'red'))
     775                 continue
     776             #修改Class表记录
     777             column_class = [{'name':'班级名'},]
     778             res = commons.update_table(self.session, column_class, cls_obj)
     779             if not res:return
     780 
     781     def add_course(self):
     782         """为某班级添加课程"""
     783         sch_obj, cls_obj = commons.choice_class(self.session)
     784         if not cls_obj:return
     785         while True:
     786             #展示所选校区所有课程信息,并判断所选校区已有课程是否为空
     787             if not commons.display_sch_courses(sch_obj):return
     788             #展示该班级已有课程信息
     789             commons.display_cls_courses(cls_obj)
     790             add_cou_name = input(Colors('请输入要添加的课程名(b 返回):', 'cyan')).strip()
     791             if not add_cou_name:continue
     792             if add_cou_name == 'b':break
     793             #判断所选校区是否存在该课程名
     794             cou_obj = self.session.query(Course).join(school_m2m_course).join(School).filter(School.id==sch_obj.id).filter(Course.name==add_cou_name).first()
     795             if not cou_obj:
     796                 print(Colors('所选校区[%s]没有该课程[%s]!'%(sch_obj.name, add_cou_name), 'red'))
     797                 continue
     798             #判断该班级是否已经有该课程
     799             if cou_obj not in cls_obj.courses:
     800                 #更新course_m2m_class表
     801                 cls_obj.courses.append(cou_obj)
     802                 self.session.commit()
     803                 print(Colors('班级[%s]添加课程[%s]成功!'%(cls_obj.name, cou_obj.name), 'green'))
     804             else:
     805                 print(Colors('班级[%s]已经有该课程[%s]!'%(cls_obj.name, cou_obj.name), 'red'))
     806 
     807     def del_course(self):
     808         sch_obj, cls_obj = commons.choice_class(self.session)
     809         if not cls_obj:return
     810         while True:
     811             #展示该班级已有课程信息,没有则退出
     812             if not commons.display_cls_courses(cls_obj):return
     813             del_cou_name = input(Colors('请输入要删除的课程名(b 返回):', 'cyan')).strip()
     814             if not del_cou_name:continue
     815             if del_cou_name == 'b':break
     816             #判断该班级是否存在该课程
     817             cou_obj = self.session.query(Course).join(Course_m2m_class).join(Class).filter(Class.name==cls_obj.name).filter(Course.name==del_cou_name).first()
     818             if not cou_obj:
     819                 print(Colors('班级[%s]没有该课程[%s]!'%(cls_obj.name, del_cou_name), 'red'))
     820                 continue
     821             else:
     822                 #删除该班级的该课程
     823                 cls_obj.courses.remove(cou_obj)
     824                 self.session.commit()
     825                 print(Colors('班级[%s]删除课程[%s]成功!'%(cls_obj.name, cou_obj.name), 'green'))
     826 
     827     def display_cls_course(self):
     828         """查看各校区下各班级已有课程"""
     829         sch_obj_li = self.session.query(School).all()
     830         if sch_obj_li:
     831             for sch_obj in sch_obj_li:
     832                 print('校区[%s]:'%sch_obj.name)
     833                 if sch_obj.classes:
     834                     for cls_obj in sch_obj.classes:
     835                         #展示某班级所有课程信息
     836                         commons.display_cls_courses(cls_obj)
     837                 else:
     838                     print(Colors('现在还没有校区,请先创建校区!', 'red'))
     839         else:
     840             print(Colors('现在还没有校区,请先创建校区!', 'red'))
     841 
     842     def add_student(self):
     843         """为某班级添加学员"""
     844         sch_obj, cls_obj = commons.choice_class(self.session)
     845         if not cls_obj:return
     846         while True:
     847             #展示所选校区所有学员信息,并判断所选校区已有学员是否为空
     848             if not commons.display_sch_students(sch_obj):return
     849             #展示该班级已有学员信息
     850             commons.display_cls_students(cls_obj)
     851             add_stu_qq = input(Colors('请输入要添加的学员QQ(b 返回):', 'cyan')).strip()
     852             if not add_stu_qq:continue
     853             if add_stu_qq == 'b':break
     854             #判断所选校区是否存在该学员QQ
     855             stu_obj = self.session.query(Student).join(school_m2m_student).join(School).filter(School.id==sch_obj.id).filter(Student.qq==add_stu_qq).first()
     856             if not stu_obj:
     857                 print(Colors('所选校区[%s]没有该学员QQ[%s]!'%(sch_obj.name, add_stu_qq), 'red'))
     858                 continue
     859             #判断该班级是否已经有该学员
     860             if stu_obj not in cls_obj.students:
     861                 #更新student_m2m_class表
     862                 cls_obj.students.append(stu_obj)
     863                 self.session.commit()
     864                 print(Colors('班级[%s]添加学员[%s]成功!'%(cls_obj.name, stu_obj.name), 'green'))
     865             else:
     866                 print(Colors('班级[%s]已经有该学员[%s]!'%(cls_obj.name, stu_obj.name), 'red'))
     867 
     868     def del_student(self):
     869         sch_obj, cls_obj = commons.choice_class(self.session)
     870         if not cls_obj:return
     871         while True:
     872             #展示该班级已有学员信息,没有则退出
     873             if not commons.display_cls_students(cls_obj):return
     874             del_stu_qq = input(Colors('请输入要删除的学员QQ(b 返回):', 'cyan')).strip()
     875             if not del_stu_qq:continue
     876             if del_stu_qq == 'b':break
     877             #判断该班级是否存在该学员
     878             stu_obj = self.session.query(Student).join(student_m2m_class).filter(student_m2m_class.class_id==cls_obj.id).filter(Student.qq==del_stu_qq).first()
     879             if not stu_obj:
     880                 print(Colors('班级[%s]没有该学员QQ[%s]!'%(cls_obj.name, del_stu_qq), 'red'))
     881                 continue
     882             else:
     883                 #删除该班级的该学员
     884                 cls_obj.students.remove(stu_obj)
     885                 self.session.commit()
     886                 print(Colors('班级[%s]删除学员[%s]成功!'%(cls_obj.name, stu_obj.name), 'green'))
     887 
     888     def display_cls_student(self):
     889         """查看各校区下各班级已有学员"""
     890         sch_obj_li = self.session.query(School).all()
     891         if sch_obj_li:
     892             for sch_obj in sch_obj_li:
     893                 print('校区[%s]:'%sch_obj.name)
     894                 if sch_obj.classes:
     895                     for cls_obj in sch_obj.classes:
     896                         #展示某班级所有学员信息
     897                         commons.display_cls_students(cls_obj)
     898                 else:
     899                     print(Colors('现在还没有校区,请先创建校区!', 'red'))
     900         else:
     901             print(Colors('现在还没有校区,请先创建校区!', 'red'))
     902 
     903 def display_course(self):
     904     """展示该校区所有课程信息"""
     905     if not len(self.school.courses) == 0:
     906         print('该校区已有课程信息如下:')
     907         column_course = [{'name':'课程名'}, {'price':'价格'}, ]
     908         fmt_cou_table = commons.fmt_table(column_course, self.school.courses)
     909         print(fmt_cou_table)
     910         return True
     911     else:
     912         print(Colors('该校区还没有课程,请先为该校区增设课程!', 'red'))
     913 
     914 def delete_course(self):
     915     while True:
     916         #判断该校区的课程是否为空
     917         if not self.display_course():break
     918         del_course_name = input(Colors('请输入要删除的课程名(b 返回):', 'cyan')).strip()
     919         if not del_course_name:continue
     920         if del_course_name == 'b':break
     921         #判断该校区是否存在该课程
     922         cou_obj = self.session.query(Course).join(school_m2m_course).join(School).filter(School.name==self.school.name).filter(Course.name==del_course_name).first()
     923         if not cou_obj:
     924             print(Colors('该校区没有该课程!', 'red'))
     925             continue
     926         else:
     927             #删除该校区的该课程
     928             self.school.courses.remove(cou_obj)
     929             self.session.commit()
     930             print(Colors('该校区删除课程成功!', 'green'))
     931 
     932 def display_teacher(self):
     933     """展示该校区所有讲师信息"""
     934     if self.school.teachers:
     935         column_teacher = [{'name':'讲师名'}, {'card_id':'身份证号码'}, {'user':'账号信息'}]
     936         fmt_tea_table = commons.fmt_table(column_teacher, self.school.teachers)
     937         print(Colors('该校区已有讲师信息如下:'))
     938         print(fmt_tea_table)
     939         return True
     940     else:
     941         print(Colors('该校区还没有讲师,请先为该校区创建讲师!', 'red'))
     942 
     943 def create_teacher(self):
     944         add_teacher_name = None
     945         add_teacher_card_id = None
     946         add_username = None
     947         add_password = None
     948         sch_obj = None
     949         cou_m2m_cls_li = []
     950         while True:
     951             add_teacher_name = input(Colors('请输入要创建的讲师名(b 返回):', 'cyan')).strip()
     952             if add_teacher_name == 'b':return
     953             if not add_teacher_name:continue
     954             break
     955         while True:
     956             add_teacher_card_id = input(Colors('请输入讲师身份证号码(b 返回):', 'cyan')).strip()
     957             if add_teacher_card_id == 'b':return
     958             if not add_teacher_card_id:continue
     959             if not add_teacher_card_id[:-1].isdigit() or not len(add_teacher_card_id) == 18:
     960                 print(Colors('无效的身份证号码,请输入正确格式身份证号码!', 'red'))
     961                 continue
     962             tea_obj = self.session.query(Teacher).filter(Teacher.card_id==add_teacher_card_id).first()
     963             if tea_obj:
     964                 print(Colors('该身份证号码已存在!', 'red'))
     965                 continue
     966             break
     967         while True:
     968             add_username = input(Colors('请输入该讲师用于登陆的用户名(b 返回):', 'cyan')).strip()
     969             if add_username == 'b':return
     970             if not add_username:continue
     971             user_obj = self.session.query(User).filter(User.username==add_username).first()
     972             if user_obj:
     973                 print(Colors('该用户名已存在!', 'red'))
     974                 continue
     975             break
     976         while True:
     977             add_password = input(Colors('请输入该讲师用于登陆的密码(b 返回):', 'cyan')).strip()
     978             if add_password == 'b':return
     979             if not add_password:continue
     980             md5 = hashlib.md5()
     981             md5.update(add_password.encode('utf-8'))
     982             add_password = md5.hexdigest()
     983             break
     984         #选择该讲师归属的校区
     985         while while_flag:
     986             res = self.display_school()
     987             if not res:
     988                 while_flag = False
     989                 break
     990             sch_name = input(Colors('请输入该讲师归属的校区名(b 返回):', 'cyan')).strip()
     991             if sch_name == 'b':while_flag = False
     992             if not sch_name:continue
     993             sch_obj = self.session.query(School).filter(School.name==sch_name).first()
     994             if not sch_obj:
     995                 print(Colors('该校区名不存在!', 'red'))
     996                 continue
     997             break
     998         #判断该校区是否有班级,有则继续选择讲师任课的班级
     999         if while_flag:
    1000             if sch_obj.classes:
    1001                 choice_cls_obj_li = []
    1002                 choice_cls_name_li = []
    1003                 while while_flag:
    1004                     self.display_class(sch_name=sch_name)
    1005                     print('已选择班级:%s'%choice_cls_name_li)
    1006                     cls_name = input(Colors('请输入该讲师任课的班级名(b 返回|end 结束选择班级):', 'cyan')).strip()
    1007                     if cls_name == 'b':
    1008                         while_flag = False
    1009                         break
    1010                     if cls_name == 'end':break
    1011                     if not cls_name:continue
    1012                     cls_obj = self.session.query(Class).join(School).filter(School.name==sch_name).filter(Class.name==cls_name).first()
    1013                     if not cls_obj:
    1014                         print(Colors('校区[%s]不存在[%s]该班级!'%(sch_name, cls_name), 'red'))
    1015                         continue
    1016                     if cls_obj in choice_cls_obj_li:
    1017                         print(Colors('已经选择过该班级', 'red'))
    1018                         continue
    1019                     #判断该班级是否有关联课程,有则继续选择讲师任课的课程
    1020                     if cls_obj.courses:
    1021                         choice_cou_obj_li = []
    1022                         choice_cou_name_li = []
    1023                         while while_flag:
    1024                             print('班级[%s]的所有课程:'%cls_obj.name)
    1025                             column_course = [{'name':'课程名'},]
    1026                             fmt_cou_table = commons.fmt_table(column_course, cls_obj.courses)
    1027                             print(fmt_cou_table)
    1028                             print('已选择课程:%s'%choice_cou_name_li)
    1029                             cou_name = input(Colors('请输入该讲师任课的课程名(b 返回|end 结束选择课程):', 'cyan')).strip()
    1030                             if cou_name == 'b':
    1031                                 while_flag = False
    1032                                 break
    1033                             if cou_name == 'end':
    1034                                 if len(choice_cou_obj_li) != 0:
    1035                                     for cou_obj in choice_cou_obj_li:
    1036                                         cou_m2m_cls_li.append(self.session.query(Course_m2m_class).filter(Course_m2m_class.course_id==cou_obj.id).filter(Course_m2m_class.class_id==cls_obj.id).first())
    1037                                     choice_cls_obj_li.append(cls_obj)
    1038                                     choice_cls_name_li.append(cls_name)
    1039                                 break
    1040                             if not cou_name:continue
    1041                             cou_obj = self.session.query(Course).join(Course_m2m_class).join(Class).filter(Class.name==cls_obj.name).filter(Course.name==cou_name).first()
    1042                             if not cou_obj:
    1043                                 print(Colors('班级[%s]不存在[%s]该课程!'%(cls_obj.name, cou_name), 'red'))
    1044                                 continue
    1045                             if cou_obj in choice_cou_obj_li:
    1046                                 print(Colors('已经选择过该课程', 'red'))
    1047                                 continue
    1048                             choice_cou_obj_li.append(cou_obj)
    1049                             choice_cou_name_li.append(cou_name)
    1050                     else:
    1051                         print(Colors('该班级还没有关联课程!', 'red'))
    1052             else:
    1053                 print(Colors('该校区还没有设立班级,已经跳过为该讲师选择任课班级和课程的步骤!', 'red'))
    1054         if while_flag:
    1055             #至此,Teacher/course_m2m_class/User/school_m2m_teacher表所有外键关联确认完毕
    1056             #更新User表
    1057             user_obj = User(username=add_username, password=add_password, permission=1)
    1058             self.session.add_all([user_obj, ])
    1059             self.session.commit()
    1060             #更新teacher表
    1061             user_obj = self.session.query(User).filter(User.username==add_username).first()
    1062             tea_obj = Teacher(name=add_teacher_name, card_id=add_teacher_card_id, user_id=user_obj.id)
    1063             self.session.add_all([tea_obj, ])
    1064             #更新school_m2m_teacher表
    1065             tea_obj.schools = [sch_obj,]
    1066             self.session.commit()
    1067             #判断该校区是否有班级且选择的班级是否有课程,没有则不更新Course_m2m_class表
    1068             if not len(cou_m2m_cls_li) == 0:
    1069                 #更新course_m2m_class表
    1070                 tea_obj.course_m2m_classes = cou_m2m_cls_li
    1071                 self.session.commit()
    1072             print(Colors('创建讲师成功!', 'green'))
    1073 
    1074 def create_student(self):
    1075         while_flag = True
    1076         add_stu_name = None
    1077         add_stu_qq = None
    1078         add_username = None
    1079         add_password = None
    1080         sch_obj = None
    1081         cls_obj = None
    1082         while while_flag:
    1083             add_stu_name = input(Colors('请输入要创建的学生名(b 返回):', 'cyan')).strip()
    1084             if add_stu_name == 'b':while_flag = False
    1085             if not add_stu_name:continue
    1086             break
    1087         while while_flag:
    1088             add_stu_qq = input(Colors('请输入学生qq(b 返回):', 'cyan')).strip()
    1089             if add_stu_qq == 'b':while_flag = False
    1090             if not add_stu_qq:continue
    1091             if not add_stu_qq.isdigit() or not len(add_stu_qq) > 3:
    1092                 print(Colors('无效的qq号,请输入正确格式qq号!', 'red'))
    1093                 continue
    1094             stu_obj = self.session.query(Student).filter(Student.qq==add_stu_qq).first()
    1095             if stu_obj:
    1096                 print(Colors('该qq号已存在!', 'red'))
    1097                 continue
    1098             else:
    1099                 break
    1100         while while_flag:
    1101             add_username = input(Colors('请输入该学生用于登陆的用户名(b 返回):', 'cyan')).strip()
    1102             if add_username == 'b':while_flag = False
    1103             if not add_username:continue
    1104             #判断该用户名是否存在
    1105             user_obj = self.session.query(User).filter(User.username==add_username).first()
    1106             if user_obj:
    1107                 print(Colors('该用户名已存在!', 'red'))
    1108                 continue
    1109             break
    1110         while while_flag:
    1111             add_password = input(Colors('请输入该学生用于登陆的密码(b 返回):', 'cyan')).strip()
    1112             if add_password == 'b':while_flag = False
    1113             if not add_password:continue
    1114             md5 = hashlib.md5()
    1115             md5.update(add_password.encode('utf-8'))
    1116             add_password = md5.hexdigest()
    1117             break
    1118         #选择该学生注册的校区
    1119         while while_flag:
    1120             res = self.display_school()
    1121             if not res:while_flag = False
    1122             sch_name = input(Colors('请输入该学生注册的校区名(b 返回):', 'cyan')).strip()
    1123             if sch_name == 'b':while_flag = False
    1124             if not sch_name:continue
    1125             sch_obj = self.session.query(School).filter(School.name==sch_name).first()
    1126             if not sch_obj:
    1127                 print(Colors('该校区名不存在!', 'red'))
    1128                 continue
    1129             break
    1130         #判断该校区是否有班级,有则继续选择学生报名的班级,没有则退出
    1131         if sch_obj.classes:
    1132             while while_flag:
    1133                 self.display_class(sch_name=sch_name)
    1134                 cls_name = input(Colors('请输入学生报名的班级名(b 返回):', 'cyan')).strip()
    1135                 if cls_name == 'b':while_flag = False
    1136                 if not cls_name:continue
    1137                 cls_obj = self.session.query(Class).join(School).filter(School.name==sch_name).filter(Class.name==cls_name).first()
    1138                 if not cls_obj:
    1139                     print(Colors('校区[%s]不存在[%s]该班级!'%(sch_name, cls_name), 'red'))
    1140                     continue
    1141                 break
    1142         else:
    1143             print(Colors('该校区还没有设立班级,请先为该校区增设班级!', 'red'))
    1144             return
    1145         #至此,Student/User/school_m2m_student/student_m2m_class表所有外键关联确认完毕
    1146         #更新User表
    1147         user_obj = User(username=add_username, password=add_password, permission=2)
    1148         self.session.add_all([user_obj, ])
    1149         self.session.commit()
    1150         #更新student表
    1151         user_obj = self.session.query(User).filter(User.username==add_username).first()
    1152         stu_obj = Student(name=add_stu_name, qq=add_stu_qq, user_id=user_obj.id)
    1153         self.session.add_all([stu_obj, ])
    1154         #更新school_m2m_student表
    1155         stu_obj.schools = [sch_obj,]
    1156         self.session.commit()
    1157         #判断该校区是否有班级,没有则不更新student_m2m_class表
    1158         if cls_obj:
    1159             #更新course_m2m_class表
    1160             stu_obj.classes = [cls_obj,]
    1161             self.session.commit()
    1162         print(Colors('创建学生成功!', 'green'))
    1163 
    1164 def create_class(self):
    1165         sch_obj = None #要创建班级的校区
    1166         add_class_name = None #新增班级名
    1167         tea_obj = None #该班级的班主任
    1168         choice_cou_obj_li = None #该班级关联的课程列表
    1169         while True:
    1170             #判断School表是否为空
    1171             res = Manage_school(self.session, self.user).display_school()
    1172             if not res:break
    1173             choice_school_name = input(Colors('请输入要创建班级的校区名(b 返回):', 'cyan')).strip()
    1174             if not choice_school_name:continue
    1175             if choice_school_name == 'b':return
    1176             #判断该校区名是否存在
    1177             sch_obj = self.session.query(School).filter(School.name==choice_school_name).first()
    1178             if not sch_obj:
    1179                 print(Colors('该校区名不存在!', 'red'))
    1180                 continue
    1181             break
    1182         while True:
    1183             add_class_name = input(Colors('请输入要创建的班级名(b 返回):', 'cyan')).strip()
    1184             if add_class_name == 'b':return
    1185             if not add_class_name:continue
    1186             #判断该校区是否已经存在该班级
    1187             cls_obj = self.session.query(Class).join(School).filter(School.name==sch_obj.name).filter(Class.name==add_class_name).first()
    1188             if cls_obj:
    1189                 print(Colors('该校区已有该班级!', 'red'))
    1190                 continue
    1191             break
    1192         #判断该校区是否存在讲师
    1193         if sch_obj.teachers:
    1194             while True:
    1195                 Manage_teacher.display_teacher()
    1196                 add_class_tea_card_id = input(Colors('请输入该班级的班主任(讲师)身份证号(b 返回):', 'cyan')).strip()
    1197                 if add_class_tea_card_id == 'b':
    1198                     while_flag = False
    1199                     break
    1200                 if not add_class_tea_card_id:continue
    1201                 tea_obj = self.session.query(Teacher).join(school_m2m_teacher).join(School).filter(School.name==self.school.name).filter(Teacher.card_id==add_class_tea_card_id).first()
    1202                 if not tea_obj:
    1203                     print(Colors('该校区不存在该讲师身份证号!', 'red'))
    1204                     continue
    1205                 break
    1206         else:
    1207             print(Colors('该校区还没有讲师,已经跳过为该班级指定班主任(讲师)的步骤!', 'red'))
    1208         if while_flag:
    1209             #判断该校区是否存在课程,并为该班级关联课程
    1210             if self.school.courses:
    1211                 choice_cou_obj_li = []
    1212                 choice_cou_name_li = []
    1213                 while while_flag:
    1214                     self.display_course()
    1215                     print(Colors('该班级已关联课程名:%s'%choice_cou_name_li, 'cyan'))
    1216                     cou_name = input(Colors('请输入该班级关联的课程名(b 返回|end 结束关联课程):', 'cyan')).strip()
    1217                     if cou_name == 'b':
    1218                         while_flag = False
    1219                         break
    1220                     if cou_name == 'end':break
    1221                     if not cou_name:continue
    1222                     cou_obj = self.session.query(Course).join(school_m2m_course).join(School).filter(School.name==self.school.name).filter(Course.name==cou_name).first()
    1223                     if not cou_obj:
    1224                         print(Colors('该校区不存在课程[%s]!'%cou_name, 'red'))
    1225                         continue
    1226                     if cou_obj in choice_cou_obj_li:
    1227                         print(Colors('该班级已关联该课程[%s]'%cou_name, 'red'))
    1228                         continue
    1229                     choice_cou_obj_li.append(cou_obj)
    1230                     choice_cou_name_li.append(cou_name)
    1231             else:
    1232                 print(Colors('该校区还没有增设课程,已经跳过为该班级关联课程的步骤!', 'red'))
    1233         if while_flag:
    1234             #更新Class表
    1235             if tea_obj:
    1236                 cls_obj = Class(name=add_class_name, school_id=self.school.id, class_teacher_id=tea_obj.id)
    1237             else:
    1238                 cls_obj = Class(name=add_class_name, school_id=self.school.id)
    1239             self.session.add_all([cls_obj, ])
    1240             self.session.commit()
    1241             #更新course_m2m_class表
    1242             if choice_cou_obj_li:
    1243                 cls_obj = self.session.query(Class).join(School).filter(School.name==self.school.name).filter(Class.name==add_class_name).first()
    1244                 cls_obj.courses = choice_cou_obj_li
    1245                 self.session.commit()
    1246             print(Colors('创建班级成功!', 'green'))
    center_admin.py

    center_teacher.py    讲师中心

      1 # Author:ton
      2 # -*- coding: utf-8 -*-
      3 from core.color import Colors
      4 from core import commons
      5 from core import auth
      6 from core.create_table import Course_m2m_class, User, School, Course, Teacher, Class, Student, Lesson, C2c_m2m_lesson,
      7     Study_record, school_m2m_course, school_m2m_teacher, school_m2m_student, student_m2m_class
      8 
      9 class Center_teacher(object):
     10     """讲师中心"""
     11     def __init__(self, session):
     12         self.session = session
     13         self.handle()
     14 
     15     @auth.auth(permission=1)
     16     def handle(self):
     17         self.tea_obj = self.user.teacher[0]
     18         while True:
     19             print("讲师中心".center(45, '-'))
     20             msg = """
     21                 创建指定班级-课程、天数的上课纪录 create_c2c_m2m_lesson
     22                 查看上课记录 display_tea_c2c_m2m_lessons
     23                 批改成绩 correcting_results
     24                 退出并返回系统主界面 q
     25             """
     26             print(Colors(msg))
     27             print('当前讲师:%s' %self.tea_obj.name)
     28             print("".center(50, '-'))
     29             choice = input(Colors('请输入要执行的指令:', 'cyan')).strip()
     30             if choice == 'q':break
     31             if hasattr(self, choice):
     32                 getattr(self, choice)()
     33             else:
     34                 print(Colors('无效的指令!', 'red'))
     35 
     36     def create_c2c_m2m_lesson(self):
     37         while True:
     38             if not commons.display_tea_classes(self.session, self.tea_obj):return
     39             cls_name = input(Colors('请指定班级名(b返回):', 'cyan')).strip()
     40             if cls_name == 'b':break
     41             if not cls_name:continue
     42             #判断该讲师是否有任课该班级名
     43             cls_obj = self.session.query(Class).join(Course_m2m_class).filter(Course_m2m_class.teacher_id==self.tea_obj.id).filter(Class.name==cls_name).first()
     44             if not cls_obj:
     45                 print(Colors('讲师[%s]没有任课该班级[%s]!'%(self.tea_obj.name, cls_name), 'red'))
     46                 continue
     47             while True:
     48                 if not commons.display_tea_cls_courses(self.session, self.tea_obj, cls_obj):return
     49                 cou_name = input(Colors('请指定课程名(b返回):', 'cyan')).strip()
     50                 if cou_name == 'b':break
     51                 if not cou_name:continue
     52                 #判断该讲师是否有任课该班级-课程
     53                 c2c_obj = self.session.query(Course_m2m_class).join(Course).filter(Course_m2m_class.teacher_id==self.tea_obj.id)
     54                     .filter(Course_m2m_class.class_id==cls_obj.id).filter(Course.name==cou_name).first()
     55                 if not c2c_obj:
     56                     print(Colors('讲师[%s]没有任课[班级%s课程%s]!'%(self.tea_obj.name, cls_name, cou_name), 'red'))
     57                     continue
     58                 while True:
     59                     print(Colors('选定的班级-课程[%s]'%c2c_obj, 'cyan'))
     60                     les_name = input(Colors('请指定天数(例如day01)(b返回):', 'cyan')).strip()
     61                     if les_name == 'b':break
     62                     if not les_name:continue
     63                     #该天数不存在则更新Lesson表
     64                     les_obj = self.session.query(Lesson).filter(Lesson.name==les_name).first()
     65                     if not les_obj:
     66                         les_obj = Lesson(name=les_name)
     67                         self.session.add(les_obj)
     68                         self.session.commit()
     69                     #该上课记录不存在则更新C2c_m2m_lesson表
     70                     c2c_m2m_les_obj = self.session.query(C2c_m2m_lesson).filter(C2c_m2m_lesson.lesson_id==les_obj.id)
     71                         .filter(C2c_m2m_lesson.course_m2m_class_id==c2c_obj.id).first()
     72                     if c2c_m2m_les_obj:
     73                         print(Colors('该上课记录已存在!', 'red'))
     74                         continue
     75                     c2c_m2m_les_obj = C2c_m2m_lesson(course_m2m_class_id=c2c_obj.id, lesson_id=les_obj.id)
     76                     self.session.add(c2c_m2m_les_obj)
     77                     self.session.commit()
     78                     #更新该班级所有学员的学习记录
     79                     for stu_obj in cls_obj.students:
     80                         stu_rec_obj = Study_record(c2c_m2m_lesson_id=c2c_m2m_les_obj.id, student_id=stu_obj.id)
     81                         self.session.add(stu_rec_obj)
     82                         self.session.flush()
     83                         self.session.commit()
     84 
     85                     print(Colors('创建上课纪录成功!', 'green'))
     86 
     87     def display_tea_c2c_m2m_lessons(self):
     88         for sch_obj in self.tea_obj.schools:
     89             commons.display_tea_sch_c2c_m2m_lessons(self.session, self.tea_obj, sch_obj)
     90 
     91     def correcting_results(self):
     92         """批改作业"""
     93         while True:
     94             for sch_obj in self.session.query(School).join(school_m2m_teacher).join(Teacher).filter(Teacher.id==self.tea_obj.id).all():
     95                 commons.display_tea_sch_studyRecords(self.session, self.tea_obj, sch_obj)
     96             stu_rec_id = input(Colors('请输入批改的学习记录ID(b返回):', 'cyan')).strip()
     97             if stu_rec_id == 'b':break
     98             if not stu_rec_id:continue
     99             stu_rec_obj = self.session.query(Study_record).join(C2c_m2m_lesson).join(Course_m2m_class).
    100                 filter(Course_m2m_class.teacher_id==self.tea_obj.id).filter(Study_record.id==stu_rec_id).first()
    101             if not stu_rec_obj:
    102                 print(Colors('无权限或者没有该学习记录!', 'red'))
    103                 continue
    104             score = input(Colors('请输入批改后的分数(b返回):', 'cyan')).strip()
    105             if score == 'b':break
    106             if not score:continue
    107             #更新Study_record表
    108             stu_rec_obj.score = score
    109             self.session.commit()
    110             print(Colors('批改作业成功!', 'green'))
    center_teacher.py

    center_student.py    学员中心

     1 from core.color import Colors
     2 from core import commons
     3 from core import auth
     4 from core.create_table import Course_m2m_class, User, School, Course, Teacher, Class, Student, Lesson, C2c_m2m_lesson,
     5     Study_record, school_m2m_course, school_m2m_teacher, school_m2m_student, student_m2m_class
     6 
     7 class Center_student(object):
     8     """学员中心"""
     9     def __init__(self, session):
    10         self.session = session
    11         self.handle()
    12 
    13     @auth.auth(permission=2)
    14     def handle(self):
    15         self.stu_obj = self.user.student[0]
    16         while True:
    17             print("学员中心".center(45, '-'))
    18             msg = """
    19                 签到(提交作业) sign_in
    20                 查看作业成绩 display_score
    21                 成绩排名 pai
    22                 退出并返回系统主界面 q
    23             """
    24             print(Colors(msg))
    25             print('当前学员:%s' %self.stu_obj.name)
    26             print("".center(50, '-'))
    27             choice = input(Colors('请输入要执行的指令:', 'cyan')).strip()
    28             if choice == 'q':break
    29             if hasattr(self, choice):
    30                 getattr(self, choice)()
    31             else:
    32                 print(Colors('无效的指令!', 'red'))
    33 
    34     def sign_in(self):
    35         while True:
    36             for sch_obj in self.session.query(School).join(school_m2m_student).join(Student).filter(Student.id==self.stu_obj.id).all():
    37                 commons.display_stu_sch_studyRecords(self.session, self.stu_obj, sch_obj)
    38             stu_rec_id = input(Colors('请输入要签到的学习记录ID(b返回):', 'cyan')).strip()
    39             if stu_rec_id == 'b':break
    40             if not stu_rec_id:continue
    41             stu_rec_obj = self.session.query(Study_record).filter(Study_record.student_id==self.stu_obj.id).filter(Study_record.id==stu_rec_id).first()
    42             if not stu_rec_obj:
    43                 print(Colors('无权限或者没有该学习记录!', 'red'))
    44                 continue
    45             #更新Study_record表
    46             stu_rec_obj.status = 'yes'
    47             self.session.commit()
    48             print(Colors('签到成功!', 'green'))
    49 
    50     def display_score(self):
    51         for sch_obj in self.session.query(School).join(school_m2m_student).join(Student).filter(Student.id==self.stu_obj.id).all():
    52                 commons.display_stu_sch_studyRecords(self.session, self.stu_obj, sch_obj)
    53 
    54 
    55     def pai(self):
    56         for sch_obj in self.session.query(School).join(school_m2m_student).join(Student).filter(Student.id==self.stu_obj.id).all():
    57             commons.display_stu_sch_cls_score(self.session, self.stu_obj, sch_obj)
    center_student.py

    commons.py  

      1 from tabulate import tabulate
      2 from core.color import Colors
      3 from sqlalchemy import Column, Integer, String, Table, MetaData, ForeignKey, func,DATE, Enum
      4 from core.create_table import User, School, Course, Teacher, Student, Class, Course_m2m_class, C2c_m2m_lesson, Study_record, student_m2m_class
      5 import hashlib
      6 
      7 
      8 def fmt_table(column_table, table_obj_li):
      9     headers = []
     10     table = []
     11     for column_dic in column_table:
     12         for column_name in column_dic:
     13             headers.append(column_dic[column_name])
     14     for obj in table_obj_li:
     15         row = []
     16         for column_dic in column_table:
     17             for column_name in column_dic:
     18                 row.append(getattr(obj, column_name))
     19         table.append(row)
     20     else:
     21         return tabulate(table, headers, tablefmt='psql')
     22 
     23 def update_table(session, column_table, table_obj):
     24     for column_dic in column_table:
     25         for column_name in column_dic:
     26             while True:
     27                 new_value = input(Colors('请输入修改后的%s(b 退出修改操作):'%column_dic[column_name], 'cyan')).strip()
     28                 if not new_value:continue
     29                 if new_value == 'b':return
     30                 setattr(table_obj, column_name, new_value)
     31                 break
     32     session.commit()
     33     print(Colors('更新%s表成功!'%table_obj.__tablename__, 'green'))
     34     return True
     35 
     36 def create_user(session, permission):
     37     while True:
     38         add_username = input(Colors('请输入用于登陆的用户名(b 返回):', 'cyan')).strip()
     39         if add_username == 'b':return
     40         if not add_username:continue
     41         user_obj = session.query(User).filter(User.username==add_username).first()
     42         if user_obj:
     43             print(Colors('该用户名已存在!', 'red'))
     44             continue
     45         while True:
     46             add_password = input(Colors('请输入用于登陆的密码(b 返回):', 'cyan')).strip()
     47             if add_password == 'b':break
     48             if not add_password:continue
     49             md5 = hashlib.md5()
     50             md5.update(add_password.encode('utf-8'))
     51             add_password = md5.hexdigest()
     52             #更新User表
     53             user_obj = User(username=add_username, password=add_password, permission=permission)
     54             session.add_all([user_obj, ])
     55             session.commit()
     56             user_obj = session.query(User).filter(User.username==add_username).first()
     57             return user_obj.id
     58 
     59 def choice_school(session):
     60     while True:
     61         #判断School表是否为空,为空则退出
     62         if not display_school(session):return
     63         choice_school_name = input(Colors('请输入校区名(b 返回):', 'cyan')).strip()
     64         if choice_school_name == 'b':return
     65         if not choice_school_name:continue
     66         #判断该校区名是否存在
     67         sch_obj = session.query(School).filter(School.name==choice_school_name).first()
     68         if not sch_obj:
     69             print(Colors('该校区名不存在!', 'red'))
     70             continue
     71         return sch_obj
     72 
     73 def choice_teacher(session):
     74     while True:
     75         #判断Teacher表是否为空,为空则退出
     76         if not display_teacher(session):return
     77         choice_tea_card_id = input(Colors('请输入讲师身份证号码(b 返回):', 'cyan')).strip()
     78         if choice_tea_card_id == 'b':return
     79         if not choice_tea_card_id:continue
     80         #判断该讲师身份证号码是否存在
     81         tea_obj = session.query(Teacher).filter(Teacher.card_id==choice_tea_card_id).first()
     82         if not tea_obj:
     83             print(Colors('该讲师身份证号码不存在!', 'red'))
     84             continue
     85         return tea_obj
     86 
     87 def choice_class(session):
     88     while True:
     89         sch_obj = choice_school(session)
     90         if not sch_obj:return
     91         while True:
     92             #判断该校区的班级是否为空,为空则break
     93             if not display_sch_classes(sch_obj):break
     94             choice_cls_name = input(Colors('请输入班级名(b 返回):', 'cyan')).strip()
     95             if choice_cls_name == 'b':break
     96             if not choice_cls_name:continue
     97             #判断该班级名是否存在
     98             cls_obj = session.query(Class).filter(Class.name==choice_cls_name).first()
     99             if not cls_obj:
    100                 print(Colors('校区[%s]没有该班级[%s]!'%(sch_obj.name, choice_cls_name), 'red'))
    101                 continue
    102             return sch_obj, cls_obj
    103 
    104 def display_school(session):
    105     sch_obj_li = session.query(School).all()
    106     if sch_obj_li:
    107         print('所有校区信息如下:')
    108         column_school = [{'name':'校区名'}, {'address':'地址'}, ]
    109         fmt_sch_table = fmt_table(column_school, sch_obj_li)
    110         print(fmt_sch_table)
    111         return True
    112     else:
    113         print(Colors('现在还没有校区,请先创建校区!', 'red'))
    114 
    115 def display_course(session):
    116     cou_obj_li = session.query(Course).all()
    117     if not len(cou_obj_li) == 0:
    118         print('所有课程信息如下:')
    119         column_course = [{'name':'课程名'}, {'price':'价格'}, ]
    120         fmt_cou_table = fmt_table(column_course, cou_obj_li)
    121         print(fmt_cou_table)
    122         return True
    123     else:
    124         print(Colors('现在还没有课程,请先创建课程!', 'red'))
    125 
    126 def display_teacher(session):
    127     tea_obj_li = session.query(Teacher).all()
    128     if tea_obj_li:
    129         column_teacher = [{'name':'讲师名'}, {'card_id':'身份证号码'}, {'user':'账号信息'}, {'schools':'所属校区信息'}, {'course_m2m_classes':'任课班级和课程信息'}]
    130         fmt_tea_table = fmt_table(column_teacher, tea_obj_li)
    131         print(Colors('所有讲师信息如下:'))
    132         print(fmt_tea_table)
    133         return True
    134     else:
    135         print(Colors('现在还没有讲师,请先创建讲师!', 'red'))
    136 
    137 def display_student(session):
    138     stu_obj_li = session.query(Student).all()
    139     if stu_obj_li:
    140         column_student = [{'name':'学员名'}, {'qq':'QQ号'}, {'user':'账号信息'}, {'schools':'所属校区信息'}, {'classes':'报名班级信息'}]
    141         fmt_stu_table = fmt_table(column_student, stu_obj_li)
    142         print(Colors('所有学员信息如下:'))
    143         print(fmt_stu_table)
    144         return True
    145     else:
    146         print(Colors('现在还没有学员,请先创建学员!', 'red'))
    147 
    148 def display_class(session):
    149     cls_obj_li = session.query(Class).all()
    150     if cls_obj_li:
    151         column_class = [{'name':'班级名'}, {'school':'所属校区信息'}, {'courses':'关联课程'}, {'students':'该班学员信息'}]
    152         fmt_cls_table = fmt_table(column_class, cls_obj_li)
    153         print(Colors('所有班级信息如下:'))
    154         print(fmt_cls_table)
    155         return True
    156     else:
    157         print(Colors('现在还没有班级,请先创建班级!', 'red'))
    158 
    159 def display_sch_courses(sch_obj):
    160     """展示某校区所有课程信息"""
    161     if sch_obj.courses:
    162         print('校区[%s]已有课程信息如下:'%sch_obj.name)
    163         column_course = [{'name':'课程名'}, {'price':'价格'}, ]
    164         fmt_cou_table = fmt_table(column_course, sch_obj.courses)
    165         print(fmt_cou_table)
    166         return True
    167     else:
    168         print(Colors('校区[%s]还没有课程'%sch_obj.name, 'red'))
    169 
    170 def display_sch_teachers(sch_obj):
    171     """展示某校区所有讲师信息"""
    172     if sch_obj.teachers:
    173         print('校区[%s]已有讲师信息如下:'%sch_obj.name)
    174         column_teacher = [{'name':'讲师名'}, {'card_id':'身份证号码'}, {'user':'账号信息'}, {'schools':'所属校区信息'}, {'course_m2m_classes':'任课班级和课程信息'}]
    175         fmt_tea_table = fmt_table(column_teacher, sch_obj.teachers)
    176         print(fmt_tea_table)
    177         return True
    178     else:
    179         print(Colors('校区[%s]还没有讲师'%sch_obj.name, 'red'))
    180 
    181 def display_sch_students(sch_obj):
    182     """展示某校区所有学员信息"""
    183     if sch_obj.students:
    184         print('校区[%s]已有学员信息如下:'%sch_obj.name)
    185         column_student = [{'name':'学员名'}, {'qq':'QQ号'}, {'user':'账号信息'}, {'schools':'所属校区信息'}, {'classes':'报名班级信息'}]
    186         fmt_stu_table = fmt_table(column_student, sch_obj.students)
    187         print(fmt_stu_table)
    188         return True
    189     else:
    190         print(Colors('校区[%s]还没有学员'%sch_obj.name, 'red'))
    191 
    192 def display_sch_classes(sch_obj):
    193     """展示某校区所有班级信息"""
    194     if sch_obj.classes:
    195         print('校区[%s]已有班级信息如下:'%sch_obj.name)
    196         column_class = [{'name':'班级名'}, {'school':'所属校区信息'}, {'courses':'关联课程'}, {'students':'该班学员信息'}]
    197         fmt_cls_table = fmt_table(column_class, sch_obj.classes)
    198         print(fmt_cls_table)
    199         return True
    200     else:
    201         print(Colors('校区[%s]还没有班级'%sch_obj.name, 'red'))
    202 
    203 def display_cls_courses(cls_obj):
    204     """展示某班级已有课程信息"""
    205     if not cls_obj.courses:
    206         print(Colors('班级[%s]还没有添加课程'%cls_obj.name, 'red'))
    207         return
    208     print('班级[%s]关联的所有课程信息如下:'%cls_obj.name)
    209     column_course = [{'name':'课程名'},]
    210     fmt_cou_table = fmt_table(column_course, cls_obj.courses)
    211     print(fmt_cou_table)
    212     return True
    213 
    214 def display_cls_students(cls_obj):
    215     """展示某班级已有学员信息"""
    216     if not cls_obj.students:
    217         print(Colors('班级[%s]还没有添加学员'%cls_obj.name, 'red'))
    218         return
    219     print('班级[%s]的所有学员信息如下:'%cls_obj.name)
    220     column_student = [{'name':'学员名'}, {'qq':'QQ号'}, {'user':'账号信息'}, {'schools':'所属校区信息'}, {'classes':'报名班级信息'}]
    221     fmt_stu_table = fmt_table(column_student, cls_obj.students)
    222     print(fmt_stu_table)
    223     return True
    224 
    225 def display_tea_schools(tea_obj):
    226     if not tea_obj.schools:
    227         print(Colors('讲师[%s]还没有任教的校区,请在校区管理界面添加讲师!'%tea_obj.name, 'red'))
    228         return
    229     print('讲师[%s]任教的所有校区信息如下:'%tea_obj.name)
    230     column_school = [{'name':'校区名'}, {'address':'地址'}, ]
    231     fmt_sch_table = fmt_table(column_school, tea_obj.schools)
    232     print(fmt_sch_table)
    233     return True
    234 
    235 def display_tea_classes(session, tea_obj):
    236     """展示某讲师任课的所有班级"""
    237     cls_obj_li = session.query(Class).join(Course_m2m_class).filter(Course_m2m_class.teacher_id==tea_obj.id).all()
    238     if not cls_obj_li:
    239         print(Colors('讲师[%s]还没有添加任课的班级,请在讲师管理界面添加班级-课程!'%tea_obj.name, 'red'))
    240         return
    241     print('讲师[%s]任课的所有班级信息如下:'%tea_obj.name)
    242     column_class = [{'name':'班级名'}, {'school':'所属校区信息'}, {'courses':'关联课程'}, {'students':'该班学员信息'}]
    243     fmt_cls_table = fmt_table(column_class, cls_obj_li)
    244     print(fmt_cls_table)
    245     return True
    246 
    247 def display_tea_cls_courses(session, tea_obj, cls_obj):
    248     """展示某讲师任课的某班级的所有任课课程"""
    249     cou_obj_li = session.query(Course).join(Course_m2m_class).filter(Course_m2m_class.teacher_id==tea_obj.id).filter(Course_m2m_class.class_id==cls_obj.id).all()
    250     if not cou_obj_li:
    251         print(Colors('讲师[%s]没有任课班级[%s]!'%(tea_obj.name, cls_obj.name), 'red'))
    252         return
    253     print('讲师[%s]任课的校区%s班级[%s]的所有任课课程信息如下:'%(tea_obj.name, cls_obj.school.name, cls_obj.name))
    254     column_course = [{'name':'课程名'},]
    255     fmt_cls_table = fmt_table(column_course, cou_obj_li)
    256     print(fmt_cls_table)
    257     return True
    258 
    259 def display_tea_sch_c2c(tea_obj, sch_obj):
    260     """展示讲师任教的某一校区所任课的班级-课程"""
    261     #找出讲师任教的某一校区所任课的班级-课程
    262     c2c_obj_li = select_tea_sch_c2c(tea_obj, sch_obj)
    263     if len(c2c_obj_li)==0:
    264         print(Colors('讲师%s任教的校区%s还没有任课的班级-课程'%(tea_obj.name, sch_obj.name), 'red'))
    265         return
    266     c2c_name_dic = {}
    267     for c2c_obj in c2c_obj_li:
    268         if not c2c_name_dic.get(c2c_obj.glass.name):
    269             c2c_name_dic[c2c_obj.glass.name] = [c2c_obj.course.name,]
    270         else:
    271             c2c_name_dic[c2c_obj.glass.name].append(c2c_obj.course.name)
    272     print('讲师%s任教的校区%s任课的班级-课程信息如下:'%(tea_obj.name, sch_obj.name))
    273     for cls_name in c2c_name_dic:
    274         print('	班级[%s]:'%cls_name)
    275         for cou_name in c2c_name_dic[cls_name]:
    276             print('		课程[%s]'%cou_name)
    277     return True
    278 
    279 def display_tea_sch_c2c_m2m_lessons(session, tea_obj, sch_obj):
    280     """展示某讲师任教的某校区的上课记录"""
    281     #找出讲师任教的某校区所任课的班级-课程
    282     c2c_obj_li = select_tea_sch_c2c(session, tea_obj, sch_obj)
    283     if len(c2c_obj_li)==0:
    284         print(Colors('讲师%s任教的校区%s还没有任课的班级-课程'%(tea_obj.name, sch_obj.name), 'red'))
    285         return
    286     #循环找出c2c的上课记录
    287     c2c_les_obj_li = []
    288     c2c_les_obj_dic = {}
    289     for c2c_obj in c2c_obj_li:
    290         # c2c_les_obj_li.extend(c2c_obj.c2c_m2m_lessons)
    291         c2c_les_obj_li.extend(session.query(C2c_m2m_lesson).filter(C2c_m2m_lesson.course_m2m_class_id==c2c_obj.id).all())
    292     if len(c2c_les_obj_li)==0:
    293         print(Colors('讲师%s任教的校区%s还没有上课记录'%(tea_obj.name, sch_obj.name), 'red'))
    294         return
    295     for c2c_les_obj in c2c_les_obj_li:
    296         if not c2c_les_obj_dic.get(c2c_les_obj.c2c.glass.name):
    297             c2c_les_obj_dic[c2c_les_obj.c2c.glass.name] = [c2c_les_obj,]
    298         else:
    299             c2c_les_obj_dic[c2c_les_obj.c2c.glass.name].append(c2c_les_obj)
    300     print('讲师%s任教的校区%s的上课记录信息如下:'%(tea_obj.name, sch_obj.name))
    301     for cls_name in c2c_les_obj_dic:
    302         print('	班级[%s]:'%cls_name)
    303         for c2c_les_obj in c2c_les_obj_dic[cls_name]:
    304             print('		%s'%c2c_les_obj)
    305     return True
    306 
    307 def display_tea_sch_studyRecords(session, tea_obj, sch_obj):
    308     """展示某讲师任教的某校区任课的班级-课程的所有学习记录"""
    309     #找出讲师任教的某校区任课的班级-课程的所有学习记录
    310     stu_rec_obj_li = select_tea_sch_stuRec(session, tea_obj, sch_obj)
    311     stu_rec_obj_dic = {}
    312     if len(stu_rec_obj_li)==0:
    313         print(Colors('讲师%s任教的校区%s还没有上课记录'%(tea_obj.name, sch_obj.name), 'red'))
    314         return
    315     for stu_rec_obj in stu_rec_obj_li:
    316         if not stu_rec_obj_dic.get(stu_rec_obj.c2c_m2m_lesson.c2c.glass.name):
    317             stu_rec_obj_dic[stu_rec_obj.c2c_m2m_lesson.c2c.glass.name] = [stu_rec_obj,]
    318         else:
    319             stu_rec_obj_dic[stu_rec_obj.c2c_m2m_lesson.c2c.glass.name].append(stu_rec_obj)
    320     print('讲师%s任教的校区%s的学员学习记录如下:'%(tea_obj.name, sch_obj.name))
    321     for cls_name in stu_rec_obj_dic:
    322         print('	班级%s:'%cls_name)
    323         for stu_rec_obj in stu_rec_obj_dic[cls_name]:
    324             print('		%s'%stu_rec_obj)
    325     return True
    326 
    327 def display_stu_sch_studyRecords(session, stu_obj, sch_obj):
    328     """展示某学员注册的某校区的学习记录"""
    329     #找出学员注册的某校区报名班级的所有学习记录
    330     stu_rec_obj_li = select_stu_sch_stuRec(session, stu_obj, sch_obj)
    331     stu_rec_obj_dic = {}
    332     if len(stu_rec_obj_li)==0:
    333         print(Colors('学员%s注册的校区%s还没有学习记录'%(stu_obj.name, sch_obj.name), 'red'))
    334         return
    335     for stu_rec_obj in stu_rec_obj_li:
    336         if not stu_rec_obj_dic.get(stu_rec_obj.c2c_m2m_lesson.c2c.glass.name):
    337             stu_rec_obj_dic[stu_rec_obj.c2c_m2m_lesson.c2c.glass.name] = [stu_rec_obj,]
    338         else:
    339             stu_rec_obj_dic[stu_rec_obj.c2c_m2m_lesson.c2c.glass.name].append(stu_rec_obj)
    340     print('学员%s注册的校区%s的学习记录如下:'%(stu_obj.name, sch_obj.name))
    341     for cls_name in stu_rec_obj_dic:
    342         print('	班级%s:'%cls_name)
    343         for stu_rec_obj in stu_rec_obj_dic[cls_name]:
    344             print('		%s'%stu_rec_obj)
    345     return True
    346 
    347 def display_stu_sch_cls_score(session, stu_obj, sch_obj):
    348     """展示某学员注册的某学校下报名的班级的成绩排名"""
    349     #找出学员注册的某校区报名班级的所有学习记录
    350     stu_rec_obj_li = select_stu_sch_stuRec(session, stu_obj, sch_obj)
    351     stu_rec_obj_dic = {}
    352     if len(stu_rec_obj_li)==0:
    353         print(Colors('学员%s注册的校区%s还没有学习记录'%(stu_obj.name, sch_obj.name), 'red'))
    354         return
    355 
    356     for stu_rec_obj in stu_rec_obj_li:
    357         if not stu_rec_obj_dic.get(stu_rec_obj.c2c_m2m_lesson.c2c.glass.name):
    358             stu_rec_obj_dic[stu_rec_obj.c2c_m2m_lesson.c2c.glass.name] = [stu_rec_obj,]
    359         else:
    360             stu_rec_obj_dic[stu_rec_obj.c2c_m2m_lesson.c2c.glass.name].append(stu_rec_obj)
    361     print('学员%s注册的校区%s的学习记录如下:'%(stu_obj.name, sch_obj.name))
    362     for cls_name in stu_rec_obj_dic:
    363         print('	班级%s:'%cls_name)
    364         obj_li = session.query(Student.qq, func.sum(Study_record.score)).join(Study_record).join(C2c_m2m_lesson).join(Course_m2m_class).join(Class).
    365             filter(Class.name==cls_name).filter(Class.school_id==sch_obj.id).group_by(Study_record.student_id).order_by(func.sum(Study_record.score)).all()
    366         print(obj_li)
    367         sort_stu_qq_li = []
    368         for obj in obj_li:
    369             sort_stu_qq_li.append(obj[0])
    370         print(sort_stu_qq_li)
    371         print('当前班级总成绩排名%s'%(len(sort_stu_qq_li)-sort_stu_qq_li.index(stu_obj.qq)))
    372         # for stu_rec_obj in stu_rec_obj_dic[cls_name]:
    373         #     print('		%s'%stu_rec_obj)
    374     return True
    375 
    376 def select_tea_sch_c2c(session, tea_obj, sch_obj):
    377     """找出讲师任教的某一校区所任课的班级-课程"""
    378     tmp_c2c_obj_li = []
    379     c2c_obj_li = []
    380     cls_obj_li = session.query(Class).filter(Class.school_id==sch_obj.id).all()
    381     for cls_obj in cls_obj_li:
    382         tmp_c2c_obj_li.extend(session.query(Course_m2m_class).filter(Course_m2m_class.class_id==cls_obj.id).all())
    383     for c2c_obj in tmp_c2c_obj_li:
    384         if c2c_obj.teacher_id == tea_obj.id:
    385             c2c_obj_li.append(c2c_obj)
    386     return c2c_obj_li
    387 
    388 def select_tea_sch_stuRec(session, tea_obj, sch_obj):
    389     """找出讲师任教的某校区任课的班级-课程的所有学习记录"""
    390     #找出讲师任教的某校区所任课的班级-课程
    391     c2c_obj_li = select_tea_sch_c2c(session, tea_obj, sch_obj)
    392     if len(c2c_obj_li)==0:
    393         print(Colors('讲师%s任教的校区%s还没有任课的班级-课程'%(tea_obj.name, sch_obj.name), 'red'))
    394         return
    395     #循环找出c2c的上课记录
    396     c2c_les_obj_li = []
    397     stu_rec_obj_li = []
    398     for c2c_obj in c2c_obj_li:
    399         c2c_les_obj_li.extend(session.query(C2c_m2m_lesson).filter(C2c_m2m_lesson.course_m2m_class_id==c2c_obj.id).all())
    400     for c2c_les_obj in c2c_les_obj_li:
    401         stu_rec_obj_li.extend(session.query(Study_record).filter(Study_record.c2c_m2m_lesson_id==c2c_les_obj.id).all())
    402     return stu_rec_obj_li
    403 
    404 def select_stu_sch_stuRec(session, stu_obj, sch_obj):
    405     """找出学员注册的某校区报名的班级的所有学习记录"""
    406     #找出学员注册的某校区报名的班级
    407     cls_obj_li = session.query(Class).join(student_m2m_class).join(Student).filter(Student.id==stu_obj.id).filter(Class.school_id==sch_obj.id).all()
    408     if len(cls_obj_li)==0:
    409         print(Colors('学员%s注册的校区%s还没有报名班级'%(stu_obj.name, sch_obj.name), 'red'))
    410         return
    411     #循环找出该班级下该学员的学习记录
    412     stu_rec_obj_li = []
    413     for cls_obj in cls_obj_li:
    414         stu_rec_obj_li.extend(session.query(Study_record).join(C2c_m2m_lesson).join(Course_m2m_class).
    415                               filter(Course_m2m_class.class_id==cls_obj.id).filter(Study_record.student_id==stu_obj.id).all())
    416     return stu_rec_obj_li
    View Code

    create_table.py

    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, Table, ForeignKey, Enum, PrimaryKeyConstraint, UniqueConstraint
    from sqlalchemy.orm import relationship
    
    # 指定字符集、最大连接池数
    engine = create_engine("mysql+pymysql://root:123456@10.0.0.15/studentdb?charset=utf8", max_overflow=5)
    
    Base = declarative_base()
    
    school_m2m_course = Table('school_m2m_course', Base.metadata,
                              Column('school_id', Integer, ForeignKey('school.id'), nullable=False),
                              Column('course_id', Integer, ForeignKey('course.id'), nullable=False),
                              UniqueConstraint('school_id', 'course_id', name='sch_id_cou_id_uk'),
                              )
    school_m2m_teacher = Table('school_m2m_teacher', Base.metadata,
                              Column('school_id', Integer, ForeignKey('school.id'), nullable=False),
                              Column('teacher_id', Integer, ForeignKey('teacher.id'), nullable=False),
                              UniqueConstraint('school_id', 'teacher_id', name='sch_id_tea_id_uk'),
                              )
    school_m2m_student = Table('school_m2m_student', Base.metadata,
                              Column('school_id', Integer, ForeignKey('school.id'), nullable=False),
                              Column('student_id', Integer, ForeignKey('student.id'), nullable=False),
                              UniqueConstraint('school_id', 'student_id', name='sch_id_stu_id_uk'),
                              )
    # course_m2m_class = Table('course_m2m_class', Base.metadata,
    #                          Column('id', Integer, primary_key=True, autoincrement=True),
    #                          Column('course_id', Integer, ForeignKey('course.id')),
    #                          Column('class_id', Integer, ForeignKey('class.id')),
    #                          Column('teacher_id', Integer, ForeignKey('teacher.id')),
    #                          UniqueConstraint('course_id', 'class_id', name='cls_id_cou_id_uk'),
    #                          )
    student_m2m_class = Table('student_m2m_class', Base.metadata,
                              Column('student_id', Integer, ForeignKey('student.id'), nullable=False),
                              Column('class_id', Integer, ForeignKey('class.id'), nullable=False),
                              UniqueConstraint('student_id', 'class_id', name='stu_id_cls_id_uk'),
                              )
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer, primary_key=True, autoincrement=True)
        username = Column(String(32), nullable=False, unique=True)
        password = Column(String(64), nullable=False)
        permission = Column(Integer, nullable=False)
        def __repr__(self):
            return "用户名:%s 权限:%s"%(self.username, self.permission)
    
    class School(Base):
        __tablename__ = 'school'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32), nullable=False, unique=True)
        address = Column(String(32), nullable=False)
    
        courses = relationship('Course', secondary=school_m2m_course, backref='schools')
        classes = relationship('Class', backref='school')
        teachers = relationship('Teacher', secondary=school_m2m_teacher, backref='schools')
        students = relationship('Student', secondary=school_m2m_student, backref='schools')
        def __repr__(self):
            return "校区名:%s"%self.name
    
    class Course_m2m_class(Base):
        __tablename__ = 'course_m2m_class'
        id = Column(Integer, primary_key=True, autoincrement=True)
        course_id = Column(Integer, ForeignKey('course.id'), nullable=False)
        class_id = Column(Integer, ForeignKey('class.id'), nullable=False)
        teacher_id = Column(Integer, ForeignKey('teacher.id'), )
    
        __table_args__ = (
        UniqueConstraint('course_id', 'class_id', name='cls_id_cou_id_uk'), # 唯一索引
        )
    
        teacher = relationship('Teacher', backref='course_m2m_classes')
        glass = relationship('Class', backref='course_m2m_classes')
        course = relationship('Course', backref='course_m2m_classes')
        def __repr__(self):
            return "班级名:%s 课程名:%s"%(self.glass.name, self.course.name)
    
    class Course(Base):
        __tablename__ = 'course'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32), nullable=False, unique=True)
        price = Column(Integer, nullable=False)
    
        classes = relationship('Class', secondary=Course_m2m_class.__table__, backref='courses')
        def __repr__(self):
            return "课程名:%s"%self.name
    
    class Class(Base):
        __tablename__ = 'class'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32), nullable=False)
        school_id = Column(Integer, ForeignKey('school.id'), nullable=False)
    
        __table_args__ = (
        UniqueConstraint('name', 'school_id', name='name_school_id_uk'), # 唯一索引
        )
        def __repr__(self):
            return "班级名:%s"%self.name
    
    class Teacher(Base):
        __tablename__ = 'teacher'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32), nullable=False)
        card_id = Column(String(32), nullable=False, unique=True)
        user_id = Column(Integer, ForeignKey('user.id'), unique=True, nullable=False)
    
        user = relationship('User', backref='teacher')
        def __repr__(self):
            return "讲师名:%s 身份证号:%s 用户名:%s"%(self.name, self.card_id, self.user.username)
    
    class Student(Base):
        __tablename__ = 'student'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32), nullable=False)
        qq = Column(String(32), nullable=False, unique=True)
        user_id = Column(Integer, ForeignKey('user.id'), unique=True, nullable=False)
    
        classes = relationship('Class', secondary=student_m2m_class, backref='students')
        user = relationship('User', backref='student')
        def __repr__(self):
            return "学员名:%s QQ号:%s 用户名:%s"%(self.name, self.qq, self.user.username)
    
    class Lesson(Base):
        __tablename__ = 'lesson'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32), nullable=False, unique=True)
    
    class C2c_m2m_lesson(Base):
        __tablename__ = 'c2c_m2m_lesson'
        id = Column(Integer, primary_key=True, autoincrement=True)
        course_m2m_class_id = Column(Integer, ForeignKey('course_m2m_class.id'), nullable=False)
        lesson_id = Column(Integer, ForeignKey('lesson.id'), nullable=False)
    
        __table_args__ = (
        UniqueConstraint('course_m2m_class_id', 'lesson_id', name='c2c_id_les_id_uk'), # 唯一索引
        )
    
        c2c = relationship('Course_m2m_class', backref='c2c_m2m_lessons')
        lesson = relationship('Lesson', backref='c2c_m2m_lessons')
        def __repr__(self):
            return "%s %s"%(self.c2c, self.lesson.name)
    
    class Study_record(Base):
        __tablename__ = 'study_record'
        id = Column(Integer, primary_key=True, autoincrement=True)
        status = Column(Enum('no','yes'), nullable=False, default='no')
        score = Column(String(32), nullable=False, default='未评分')
        c2c_m2m_lesson_id = Column(Integer, ForeignKey('c2c_m2m_lesson.id'), nullable=False)
        student_id = Column(Integer, ForeignKey('student.id'), nullable=False)
    
        __table_args__ = (
        UniqueConstraint('c2c_m2m_lesson_id', 'student_id', name='c2c_m2m_les_id_stu_id_uk'), # 唯一索引
        )
    
        c2c_m2m_lesson = relationship('C2c_m2m_lesson', backref='study_records')
        student = relationship('Student', backref='study_records')
        def __repr__(self):
            return "学习记录ID:%s 签到状态:%s 成绩:%s 上课记录:%s 学员:%s"%(self.id, self.status, self.score, self.c2c_m2m_lesson, self.student.name)
    
    def create_table():
        Base.metadata.create_all(engine)
    
    if __name__ == '__main__':
        create_table()
    

      

  • 相关阅读:
    HTML5本地存储应用sessionStorage和localStorage
    [js高手之路] 设计模式系列课程
    [js高手之路] vue系列教程
    [js高手之路] vue系列教程
    [js高手之路] vue系列教程
    [js高手之路] vue系列教程
    [js高手之路] vue系列教程
    [js高手之路] vue系列教程
    js单页hash路由原理与应用实战
    javascript面向对象的常见写法与优缺点
  • 原文地址:https://www.cnblogs.com/linzetong/p/8406313.html
Copyright © 2020-2023  润新知