1 #!usr/bin/env python
2 #-*-coding:utf-8-*-
3 #Author calmyan
4 importos ,sys,pickle,uuid,hashlib,time5
6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
7 sys.path.append(BASE_DIR)#增加环境变量
8 from cfg importconfig9 from core importclass_main10 from core importlog_file11
12
13 #id生成
14 defid_uu():15 returnstr(uuid.uuid1())16 #id生成
17 defid_md5():18 id_i=hashlib.md5()19 id_i.update(bytes(str(time.time()),encoding='utf8'))20 return id_i.hexdigest()#返回用时间创建 的ID
21
22 #初始化检测
23 def file_char(name):#24 if not os.path.exists(name):#检测相关文件是否不存在
25 #info={'北京':[],'上海':[]}
26 #file_pick(name,info)#进行初始化
27 returnTrue28 else:29 returnFalse30
31 #初始化管理员
32 definitialize_admin():33 print('系统正在初始化....')34 try:35 user = input('请输入初始化用户名:')36 pwd = input('请输入初始化密码:')37 obj =class_main.Admin(user, pwd)38 obj.save()39 with open(config.ADMIN_USER_FILE,'w') as f:40 f.write('yes')#应文件用来确认初始化
41 returnTrue42 exceptException as e:43 print(e)44
45 #创建学校函数
46 defcar_school():47 try:48 print('提示: B/b 返回上级!')49 names=input('请输入您要添加的学校名字:').strip()50 if names=='b' or names=='B':51 return
52 addrs=input('请输入学校所在地址:').strip()53 if addrs=='b' or addrs=='B':54 return
55 school_name_list=[(obj.NAME,obj.ADDR) for obj in class_main.SchoolName.open_file_list()]#进行学校校区重名检测用,返回列表
56 if (names,addrs) inschool_name_list:57 print('\033[41;1m[%s] [%s]校区 已经存在,不可重复创建\033[0m' %(names,addrs))58 return
59 else:60 obj=class_main.SchoolName(names,addrs)#创建学校
61 obj.save()#pickle序列化保存到文件
62 print('\033[32;1m创建[%s] 学校,[%s]校区成功!\033[0m'%(names,addrs))63 return
64 exceptException as e:65 print(e)66
67 #查看学校
68 defshow_school():69 for obj inclass_main.SchoolName.open_file_list():70 #amo=obj.get_amount()
71 print('\033[32;1m学校[%s] 地址[%s] 总收入[%s] 创建日期[%s] \033[0m'.center(60,'-') %(obj.NAME,obj.ADDR,obj.amount,obj.create_time))72
73 #创建课程函数
74 defcar_course():75 print('\033[36;1m创建课程\033[0m'.center(60,'='))76 school_list=class_main.SchoolName.open_file_list()#打开学校列表
77 try:78 #while True:
79 print('\033[33;1m提示: B/b 返回上级!\033[0m')80 fon=input('===============其他键确认开始创建课程:')81 if fon=='b' or fon=='B':82 return
83 for k,obj inenumerate(school_list):84 print('\033[35;1m学校编号:%s,学校名称:%s,校区:%s\033[0m'%(k,obj,obj.ADDR))85 sch_name=int(input('请选择学校:'))86 school_obj=school_list[sch_name]#用数字选定学校
87 #print(school_list[sch_name])
88 #print(school_obj.ID.ID)
89 course_name=input('请输入要创建的课程名:').strip()90 price=input('请输入课程价格:').strip()91 period=input('请输入课程周期:').strip()92 course_name_list=[(obj.NAME,obj.SCHOOL_ID.ID) for obj in class_main.Course.open_file_list()]#返回所有课程是名字,对应的学校列表
93 if (course_name,school_obj.ID.ID) in course_name_list:#查课程名,与学校名是否存
94 print('\033[43;1m课程[%s] 已经存在,不能重复创建\033[0m' %(course_name))95 return
96 else:97 obj=class_main.Course(course_name,period,price,school_obj.ID)98 obj.save()99 print('\033[33;1m课程[%s] 价格[%s] 周期[%s]创建成功\033[0m' %(obj.NAME,obj.FEES,obj.CYCLE))100 return
101 exceptException as e:102 return print('选择有误,请重新选择')103
104 #查看课程
105 defshow_course():106 for obj in class_main.Course.open_file_list():#调用ID类中的方法
107 print('\033[32;1m[%s] [%s]校区 [%s]课程 价格[%s] 周期[%s]\033[0m'.center(60,'-')%(obj.SCHOOL_ID.get_id_file().NAME,obj.SCHOOL_ID.get_id_file().ADDR,obj.NAME,obj.FEES,obj.CYCLE))108
109 #创建讲师函数
110 defcar_teacher():111 print('\033[36;1m创建讲师\33[0m'.center(60,'='))112 school_list=class_main.SchoolName.open_file_list()#打开学校列表
113 try:114 #while True:
115 print('\033[33;1m提示: B/b 返回上级!\033[0m')116 fon=input('===============其他键确认开始创建讲师:')117 if fon=='b' or fon=='B':118 return
119 for k,obj inenumerate(school_list):120 print('\033[35;1m学校编号:%s,学校名称:%s,校区:%s\033[0m'%(k,obj,obj.ADDR))121 sch_name=int(input('请选择学校:'))122 school_obj=school_list[sch_name]#用数字选定学校
123 uname=input('请输入要创建的讲师名字:').strip()124 upwd=input('请输入讲师登陆密码:').strip()125 uleve=input('请输入讲师级别:').strip()126 uage=input('请输入年龄:').strip()127 usex=input('请输入性别:').strip()128 uname_list=[(obj.NAME,obj.SCHOOL_ID.ID) for obj in class_main.Teacher.open_file_list()]#返回所有讲师是名字,对应的学校列表
129 if (uname,school_obj.ID.ID) in uname_list:#查讲师名,与学校名是否存
130 print('\033[43;1m讲师[%s] 已经存在,不能重复创建\033[0m' %(uname))131 return
132 else:133 obj=class_main.Teacher(uname,upwd,uage,usex,uleve,school_obj.ID)134 obj.save()135 print('\033[33;1m[%s] [%s]校区 讲师[%s] 创建成功\033[0m' %(obj.SCHOOL_ID.get_id_file().NAME,obj.SCHOOL_ID.get_id_file().ADDR,obj.NAME))136 return
137 exceptException as e:138 return print('选择有误,请重新选择')139
140 #查看讲师
141 defshow_teacher():142 for obj in class_main.Teacher.open_file_list():#调用ID类中的方法
143 print('\033[32;1m[%s] [%s]校区 [%s]讲师 性别:[%s] 级别[%s] 创建时间[%s]\033[0m'.center(60,'-')%(obj.SCHOOL_ID.get_id_file().NAME,obj.SCHOOL_ID.get_id_file().ADDR,obj.NAME,obj.SEX,obj.LEVE,obj.create_time))144
145 #创建班级函数
146 defcar_classes():147 print('\033[36;1m创建班级\33[0m'.center(60,'='))148 school_list=class_main.SchoolName.open_file_list()#打开学校列表
149 try:150 #while True:
151 print('\033[33;1m提示: B/b 返回上级!\033[0m')152 fon=input('===============其他键确认开始创建班级:')153 if fon=='b' or fon=='B':154 return
155 for k,obj inenumerate(school_list):156 print('\033[35;1m学校编号:%s,学校名称:%s,校区:%s\033[0m'%(k,obj,obj.ADDR))157 sch_name=int(input('请选择学校:'))158 school_obj=school_list[sch_name]#用数字选定学校
159 uname=input('请输入要创建的班级名:').strip()160 uname_list=[(obj.NAME,obj.SCHOOL_ID.ID) for obj in class_main.Class_leven.open_file_list()]#返回所有班级是名字,对应的学校列表
161 if (uname,school_obj.ID.ID) in uname_list:#查课程名,与学校名是否存
162 print('\033[43;1m[%s] [%s]校区 ,[%s]班级 已经存在,不能重复创建\033[0m' %(school_obj.ID.get_id_file().NAME,school_obj.ID.get_id_file().ADDR,uname))163 return
164 else:165 teac_to_cour_list=class_main.Teac_to_cour.open_file_list()#打关联列表
166 for k ,obj inenumerate(teac_to_cour_list):167 if str(school_obj.ID)==str(obj.SCHOOL_ID.ID):168 print('\033[35;1m课程编号:%s,关联的讲师:%s\033[0m'%(k,obj))169 coures_name=int(input('请选择讲师与课程'))170 teac_to_cour_obj=teac_to_cour_list[coures_name]171 obj=class_main.Class_leven(school_obj.ID,uname,teac_to_cour_obj.ID)172 obj.save()173 print('\033[33;1m[%s] [%s]校区 [%s]班级 创建成功\033[0m' %(obj.SCHOOL_ID.get_id_file().NAME,obj.SCHOOL_ID.get_id_file().ADDR,obj.NAME))174 return
175 exceptException as e:176 return print('选择有误,请重新选择')177
178 #查看班级
179 defshow_classes():180 for obj in class_main.Class_leven.open_file_list():#调用ID类中的方法 学校ID 老师到课程ID
181 print('\033[32;1m[%s] [%s]校区 [%s]班 所开课程:[%s] 讲师:[%s]\033[0m'.center(60,'-')%(obj.SCHOOL_ID.get_id_file().NAME,\182 obj.SCHOOL_ID.get_id_file().ADDR,\183 obj.NAME,\184 obj.TEAC_TO_LSIT_ID.get_id_file().COURSE_NAME,obj.TEAC_TO_LSIT_ID.get_id_file().TEACHER_NAME))185
186 #关联课程
187 defassociated_course():188 try:189 #while True:
190 school_list=class_main.SchoolName.open_file_list()#打开学校列表
191 print('课程关联'.center(60,'='))192 for k,obj inenumerate(school_list):193 print('\033[35;1m学校编号:%s,学校名称:%s,校区:%s\033[0m'%(k,obj,obj.ADDR))194 sch_name=int(input('请选择学校:'))195 school_obj=school_list[sch_name]#用数字选定学校
196 course_list=class_main.Course.open_file_list()#打开课程列表
197 for k,obj inenumerate(course_list):198 if str(obj.SCHOOL_ID.ID)==str(school_obj.ID):#判断学校名是否相同
199 print('\033[35;1m课程编号:%s,课程名称:%s\033[0m'%(k,obj))200 cou_name=int(input('请选择课程:'))201 course_obj=course_list[cou_name]#用数字选定课程
202 teacher_list=class_main.Teacher.open_file_list()#打开讲师列表
203 for k,obj inenumerate(teacher_list):204 if str(obj.SCHOOL_ID.ID)==str(school_obj.ID):#判断学校名是否相同
205 print('\033[35;1m讲师编号:%s,讲师姓名:%s\033[0m'%(k,obj))206 teach_name=int(input('请选择讲师:'))207 teach_obj=teacher_list[teach_name]#用数字选定老师
208 uname_list=[(obj.COURSE_NAME,obj.TEACHER_NAME,obj.SCHOOL_ID.ID) for obj in class_main.Teac_to_cour.open_file_list()]#返回所有关联课程列表
209 if (course_obj.NAME,teach_obj.NAME,school_obj.ID.ID) in uname_list:#查课程名,与学校名是否存
210 print('\033[43;1m[%s] [%s]校区 ,课程[%s]与[%s] 已经关联,不能重复关联\033[0m' %(school_obj.ID.get_id_file().NAME,school_obj.ID.get_id_file().ADDR,course_obj.NAME,teach_obj.NAME))211 return
212 else:213 obj=class_main.Teac_to_cour(course_obj.NAME,teach_obj.NAME,school_obj.ID)214 obj.save()215 print('\033[33;1m[%s] [%s]校区 ,课程[%s]与[%s] 关联成功\033[0m' %(obj.SCHOOL_ID.get_id_file().NAME,obj.SCHOOL_ID.get_id_file().ADDR,obj.COURSE_NAME,obj.TEACHER_NAME))216 return
217 exceptException as e:218 return print('选择有误,请重新选择')219
220 #查看课程关联
221 defshow_teac_to_cour():222 for obj inclass_main.Teac_to_cour.open_file_list():223 print('\033[32;1m[%s] [%s]校区 课程:[%s] 讲师:[%s]\033[0m'.center(60,'=')%(obj.SCHOOL_ID.get_id_file().NAME,\224 obj.SCHOOL_ID.get_id_file().ADDR,\225 obj.COURSE_NAME,obj.TEACHER_NAME))226
227 #学员自动注册
228 defstud_alize():229 print('\033[36;1m学员自助注册\33[0m'.center(60,'='))230 school_list=class_main.SchoolName.open_file_list()#打开学校列表
231 try:232 #while True:
233 print('\033[33;1m提示: B/b 返回上级!\033[0m')234 fon=input('===============其他键确认开始注册:')235 if fon=='b' or fon=='B':236 return
237 for k,obj inenumerate(school_list):238 print('\033[35;1m学校编号:%s,学校名称:%s,校区:%s\033[0m'%(k,obj,obj.ADDR))239 sch_name=int(input('请选择您要注册的学校:'))240 uname_list=[(obj.NUM,obj.PHONE) for obj in class_main.Students.open_file_list()]#返回所有学员的名字,对应的学校,电话号码列表
241 school_obj=school_list[sch_name]#用数字选定学校
242 unum=int(input('请输入您要的学号:').strip())243 if (unum)in uname_list:#查学号是否存
244 print('\033[43;1m学号[%s] 已经存在,不能重复创建\033[0m' %(unum))245 return
246 uname=input('请输入注册名字:').strip()247 upwd=input('请输入登陆密码:').strip()248 uphone=input('请输入电话号码:').strip()249 uage=input('请输入年龄:').strip()250 usex=input('请输入性别:').strip()251 if (uphone) in uname_list:#查电话是否存
252 print('\033[43;1m学员[%s] 电话号码已经存在,不能重复创建\033[0m' %(uname))253 return
254 else:255 class_list=class_main.Class_leven.open_file_list()#打开班级
256 for k,obj inenumerate(class_list):257 if str(obj.SCHOOL_ID.ID)==str(school_obj.ID):#判断学校名是否相同
258 print('\033[35;1m班级编号:%s, [%s]\033[0m'%(k,obj))259 uclass_name=int(input('请选择班级:'))260 class_name_obj=class_list[uclass_name]#261 obj=class_main.Students(unum,uname,upwd,uage,usex,school_obj.ID,class_name_obj.ID,uphone)262 obj.save()263 print('\033[33;1m[%s] [%s]校区 学员[%s] 注册成功\033[0m' %(obj.SCHOOL_ID.get_id_file().NAME,obj.SCHOOL_ID.get_id_file().ADDR,obj.NAME))264 return
265 exceptException as e:266 return print('输入有误,请重新选择')267
268
269 #创建学员
270 defcar_students():271 print('\033[36;1m创建学员\33[0m'.center(60,'='))272 school_list=class_main.SchoolName.open_file_list()#打开学校列表
273 try:274 #while True:
275 print('\033[33;1m提示: B/b 返回上级!\033[0m')276 fon=input('===============其他键确认开始创建学员:')277 if fon=='b' or fon=='B':278 return
279 for k,obj inenumerate(school_list):280 print('\033[35;1m学校编号:%s,学校名称:%s,校区:%s\033[0m'%(k,obj,obj.ADDR))281 sch_name=int(input('请选择学校:'))282 uname_list=[(obj.NUM,obj.PHONE) for obj in class_main.Students.open_file_list()]#返回所有学员的名字,对应的学校,电话号码列表
283 school_obj=school_list[sch_name]#用数字选定学校
284 unum=int(input('请输入要创建学员学号:').strip())285 if (unum)in uname_list:#查学号是否存
286 print('\033[43;1m学号[%s] 已经存在,不能重复创建\033[0m' %(unum))287 return
288 uname=input('请输入要创建学员名字:').strip()289 upwd=input('请输入学员登陆密码:').strip()290 uphone=input('请输入电话号码:').strip()291 uage=input('请输入年龄:').strip()292 usex=input('请输入性别:').strip()293 if (uphone) in uname_list:#查电话是否存
294 print('\033[43;1m学员[%s] 电话号码已经存在,不能重复创建\033[0m' %(uname))295 return
296 else:297 class_list=class_main.Class_leven.open_file_list()#打开班级
298 for k,obj inenumerate(class_list):299 if str(obj.SCHOOL_ID.ID)==str(school_obj.ID):#判断学校名是否相同
300 print('\033[35;1m班级编号:%s, [%s]\033[0m'%(k,obj))301 uclass_name=int(input('请选择班级:'))302 class_name_obj=class_list[uclass_name]#303 obj=class_main.Students(unum,uname,upwd,uage,usex,school_obj.ID,class_name_obj.ID,uphone)304 obj.save()305 print('\033[33;1m[%s] [%s]校区 学员[%s] 创建成功\033[0m' %(obj.SCHOOL_ID.get_id_file().NAME,obj.SCHOOL_ID.get_id_file().ADDR,obj.NAME))306 return
307 exceptException as e:308 return print('输入有误,请重新选择')309
310 #查看学员
311 defshow_students():312 for obj inclass_main.Students.open_file_list():313 print('\033[32;1m[%s] [%s]校区 学员编号:[%s] 学员姓名:[%s] 年龄:[%s] 性别:[%s] 电话:[%s] 所在班级:[%s]\033[0m'.center(60,'=')%(obj.SCHOOL_ID.get_id_file().NAME,\314 obj.SCHOOL_ID.get_id_file().ADDR,obj.NUM,\315 obj.NAME,obj.AGE,obj.SEX,obj.PHONE,obj.CLASS_ID.get_id_file().NAME))316
317
318
319 #学员个人信息查看
320
321 defshow_info(obj):322 info='''\033[34;1m323 学号:{NUM}\t\t\t姓名:{NAME}\t\t\t年龄:{AGE}\t\t\t性别:{SEX}\t\t\t电话:{PHONE}324
325 学校:{SCHOOL}\t\t\t校区:{SCHOOL_}\t\t\t班级:{CLASS}\t\t\t学费:{FEES}\t\t\t分数:{SCORE}326
327 \033[0m'''.format(NUM=str(obj.NUM),NAME=obj.NAME,AGE=obj.AGE,SEX=obj.SEX,PHONE=obj.PHONE,\328 SCHOOL=obj.SCHOOL_ID.get_id_file().NAME,SCHOOL_=obj.SCHOOL_ID.get_id_file().ADDR,\329 CLASS=obj.CLASS_ID.get_id_file().NAME,FEES=str(obj.FEES),SCORE=obj.SCORE.score_dict)330
331 print(info)332
333 #讲师个人信息查看
334
335 defshow_teach_info(obj):336 info='''\033[34;1m337 姓名:{NAME}\t\t\t年龄:{AGE}\t\t\t性别:{SEX}\t\t\t338
339 学校:{SCHOOL}\t\t\t校区:{SCHOOL_}\t\t\t级别:{LEVE}\t\t\t收入:{amount}340
341 \033[0m'''.format(NAME=obj.NAME,AGE=obj.AGE,SEX=obj.SEX,\342 SCHOOL=obj.SCHOOL_ID.get_id_file().NAME,SCHOOL_=obj.SCHOOL_ID.get_id_file().ADDR,\343 LEVE=obj.LEVE,amount=str(obj.amount))344
345 print(info)346
347 #讲师操作相关函数
348 defteacher_char_l(obj_teach):349 class_teach_list=[]#讲师的班级列表
350 for obj in class_main.Class_leven.open_file_list():#打开班级列表
351 if obj_teach.NAME==obj.TEAC_TO_LSIT_ID.get_id_file().TEACHER_NAME:#查询对应的课程老师
352 class_teach_list.append(obj)#加入列表
353 return class_teach_list#讲师的班级列表
354
355 #讲师操作相关函数查看学生
356 defteacher_char_class(class_teach_list):357 whileTrue:358 for k,obj inenumerate(class_teach_list):359 print('\033[32;1m班级编号:%s 班级名称:[%s]\033[0m'%(k,obj))360 try:361 sart_class=int(input('请选择您要查看的学员班级编号:'))362 sart_class_obj=class_teach_list[sart_class]#用数字选定班级
363 for obj in class_main.Students.open_file_list():#查看学生
364 if str(obj.CLASS_ID.get_id_file().NAME)==str(sart_class_obj.NAME):#查看对应班级
365 print('\033[34;1m学号:[%s] 姓名:[%s]\033[0m'%(obj.NUM,obj.NAME))366 return
367 exceptException as e:368 print('选择有误,请重新选择')369 else:370 print('\033[31;1m对不起,您还没有分配班级与课程,请与校方联系!\033[0m')371
372
373 #讲师操作相关函数学员成绩
374 defteacher_char_class_students(class_teach_list):375 whileTrue:376 for k,obj inenumerate(class_teach_list):377 print('\033[32;1m班级编号:%s 班级名称:[%s]\033[0m'%(k,obj))378 try:379 sart_class=int(input('请选择您要查看的学员班级编号:'))380 sart_class_obj=class_teach_list[sart_class]#用数字选定班级
381 students_list=[]382 for obj in class_main.Students.open_file_list():#查看学习
383 if str(obj.CLASS_ID.get_id_file().NAME)==str(sart_class_obj.NAME):#查看对应班级
384 #print('\033[34;1m学号:[%s] 姓名:[%s]\033[0m'%(obj.NUM,obj.NAME))
385 students_list.append(obj)#返回当前班级学员列表
386 returnstudents_list387 exceptException as e:388 print('选择有误,请重新选择')389 else:390 print('\033[31;1m对不起,您还没有分配班级与课程,请与校方联系!\033[0m')391
392
393 #获取学生上课课程函数
394 defstudnts_class(class_name):395 for obj in class_main.Course.open_file_list():#返回所有课程的名字
396 if class_name==str(obj.NAME):397 returnobj398
399
400 #交学费
401 defjxf(file_dir,user):402 obj=pickle.load(open(file_dir,'rb'))403 money=input('请输入学费金额:')404 if money.isdigit():#是否为整数
405 obj.FEES=obj.FEES+int(money)406 obj.save()#进行保存
407 print("交费成功,金额:\033[32;1m%s\033[0m"%money)408 file_dir=os.path.join(config.SCHOOL_DIR,str(obj.SCHOOL_ID.get_id_file().ID))##拼接文件路径
409 school_obj=pickle.load(open(file_dir,'rb'))#反序列化,追加到文件
410 school_obj.amount+=int(money)411 school_obj.save()#进行保存
412 info_str='%s 学员进行交费,金额:[%s]'%(user,money)413 log_file.user_opert(info_str)414 else:415 print('请正确输入整数!')