1 import os 2 import sys 3 import pickle 4 5 student_info = \'student_info\' 6 course_info = \'course_info\' 7 userinfo = \'userinfo\' 8 9 10 class Base: 11 def __str__(self): 12 return self.name 13 14 15 class Course(Base): 16 def __init__(self, name, price, period, teacher): 17 self.name = name 18 self.price = price 19 self.period = period 20 self.teacher = teacher 21 22 def __repr__(self): 23 return \' \'.join([self.name, self.price, self.period, self.teacher]) 24 25 26 class Person: 27 @staticmethod 28 def get_from_pickle(path): 29 with open(path, \'rb\')as f: 30 while True: 31 try: 32 stu_obj = pickle.load(f) 33 yield stu_obj 34 except EOFError: 35 break 36 37 def show_courses(self): 38 for count, course in enumerate(self.get_from_pickle(course_info), 1): 39 print(count, repr(course)) 40 41 def dump_obj(self, path, obj): 42 with open(path, \'ab\')as f: 43 pickle.dump(obj, f) 44 45 46 class Student(Person, Base): 47 operate_lst = [(\'查看所有课程\', \'show_courses\'), 48 (\'选择课程\', \'select_course\'), 49 (\'查看已选课程\', \'check_selected_course\'), 50 (\'退出\', \'exit\')] 51 52 def __init__(self, name): 53 self.name = name 54 self.courses = [] 55 56 def __repr__(self): 57 course_name = [course.name for course in self.courses] 58 return \'%s %s\' % (self.name, \'所选课程%s\' % \'|\'.join(course_name)) 59 60 def select_course(self): 61 self.show_courses() 62 num = int(input(\'请输入要选择课程的序号:\')) 63 for count, course in enumerate(self.get_from_pickle(course_info), 1): 64 if count == num: 65 self.courses.append(course) 66 print(\'您选择了%s课程\' % course) 67 break 68 else: 69 print(\'没有您要找的课程\') 70 71 def check_selected_course(self): 72 for course in self.courses: 73 print(course.name, course.teacher) 74 75 def exit(self): 76 with open(student_info+\'_bak\', \'wb\')as f2: 77 for stu in self.get_from_pickle(student_info): 78 if stu.name == self.name: 79 pickle.dump(self, f2) 80 else: 81 pickle.dump(stu, f2) 82 os.remove(student_info) 83 os.rename(student_info+\'_bak\', student_info) 84 exit() 85 86 @classmethod 87 def init(cls, name): 88 for stu in cls.get_from_pickle(student_info): 89 if stu.name == name: 90 return stu 91 else: 92 print(\'没有这个学生\') 93 94 95 class Manager(Person): 96 operate_lst = [(\'创建课程\', \'create_course\'), 97 (\'创建学生\', \'create_student\'), 98 (\'查看所有课程\', \'show_courses\'), 99 (\'查看所有学生\', \'show_students\'), 100 (\'查看所有学生的选课情况\', \'show_student_course\'), 101 (\'退出\', \'exit\')] 102 103 def __init__(self,name): 104 self.name = name 105 106 def create_course(self): 107 name = input(\'请输入课程名:\') 108 price = input(\'请输入课程价格:\') 109 period = input(\'请输入课程周期:\') 110 teacher = input(\'请输入执教老师:\') 111 course_obj = Course(name, price, period, teacher) 112 self.dump_obj(course_info, course_obj) 113 print(\'%s课程创建成功\' % course_obj.name) 114 115 def create_student(self): 116 stu_name = input(\'请输入学生名字:\') 117 stu_pwd = input(\'请输入初始密码:\') 118 stu_auth = \'%s|%s|Student\n\' % (stu_name, stu_pwd) 119 stu_obj = Student(stu_name) 120 with open(userinfo, \'a\', encoding=\'utf-8\')as f: 121 f.write(stu_auth) 122 self.dump_obj(student_info, stu_obj) 123 print(\'%s学生创建成功\' % stu_obj.name) 124 125 def show_students(self): 126 for count, stu in enumerate(self.get_from_pickle(student_info), 1): 127 print(count, stu) 128 129 def show_student_course(self): 130 for stu in self.get_from_pickle(student_info): 131 print(repr(stu)) 132 133 def exit(self): 134 exit() 135 136 @classmethod 137 def init(cls,name): 138 return cls(name) 139 140 def login(): 141 name = input(\'请输入用户名:\') 142 pwd = input(\'请输入密码:\') 143 with open(userinfo, encoding=\'utf-8\')as f: 144 for line in f: 145 usr,pwd1, identify = line.strip().split(\'|\') 146 if usr == name and pwd == pwd1: 147 return {\'result\': True, \'name\': name, \'id\': identify} 148 else: 149 return {\'result\': False, \'name\': name} 150 151 152 ret = login() 153 if ret[\'result\']: 154 print(\'\033[1;45;33m登陆成功\033[0m\') #\033[1;x;xm 换颜色 \033[0m换回原来的 155 if hasattr(sys.modules[__name__], ret[\'id\']): 156 cls = getattr(sys.modules[__name__], ret[\'id\']) 157 obj = cls.init(ret[\'name\']) 158 while True: 159 for id, item in enumerate(cls.operate_lst, 1): 160 print(id, item[0]) 161 func_str = cls.operate_lst[int(input(\'>>\'))-1][1] 162 print(func_str) 163 if hasattr(obj, func_str): 164 getattr(obj, func_str)() 165 else: 166 print(\'登录失败\')