一、业务逻辑
二、设计表结构
三、代码结构
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'))
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_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_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)
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
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()