学员管理系统(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()

  

原文地址:https://www.cnblogs.com/linzetong/p/8406313.html