Python 文件操作 —— 师生信息管理系统(三系统)


# 三系统师生信息管理系统(文件版)
"""
思考:
    1、请问如何实现文件内容增、删、改、查?
    2、如何避免使用全局变量?
    3、全局变量在函数里如何修改?
    4、如何捕获异常为我所用?

介绍:
    1、管理系统在生活中处处可见,把单一的功能集合到一起就能组成一个系统。本系统是在学生信息管理系统
    改进而来,升级了的有:可以存储信息,多系统操作。

    2、多系统操作,共分为管理员、教师端、学生端。
    3、管理员默认账号:123456 默认密码:123456
    4、隐藏功能:数字0,是返回(为了美观,而牺牲的功能)

知识点:
    1、文件操作:增、删、改、查
    2、类的继承:多继承,单继承
    3、类与对象:类方法、公共属性
    4、循环语句、条件语句、跳转语句
    重点:with语句、旗帜、函数封装

不足:
    1、由于split()函数无法分割'\n',所以本程序采用追加空格加换行' \n'的格式写入文件
    所以当输入信息时,有空格,会导致空格后面的信息缺失。
    2、界面太丑,提示语不够丰富,有待改善。
    3、本程序还不够精简,代码注释较少,对基础较弱的道友不太友好,有待改善

创新:
    1、输入信息时,可以限制输入字符类型,以达到规避出现BUG,例如:不可以输入空格。
    2、文字显示太丑,可以改为图形化界面。
    3、功能局限,可以适当添加。

"""
  1 # 三系统师生信息管理系统(文件版)
  2 
  3 
  4 
  5 # 全局变量类 ==========================================================================
  6 class Global:
  7 
  8     # 设置归属地(默认:220703)
  9     home_location = '220703'
 10     # 设置随机位数
 11     rand_digit = 4
 12 
 13     # 设置重置密码
 14     default_password = '123'
 15 
 16     # 管理员工号
 17     admin_id = '123456'
 18     # 管理员密码
 19     admin_password = '123456'
 20 
 21     # 一级目录
 22     one_dir = 'system data'
 23     one_dir += '/'
 24     # 二级目录
 25     two_dir = 'info data'
 26     two_dir += '/'
 27     # 路径拼接
 28     path_dir = one_dir + two_dir
 29 
 30 
 31 # 菜单界面类 ==========================================================================
 32 class UI(Global):
 33 
 34     # 通用标题
 35     @classmethod
 36     def show_title(cls, info, space=0, num=9):
 37         print(' '*space + '='*num + info + '='*num)
 38 
 39     # 初始界面
 40     @classmethod
 41     def login_ui(cls):
 42         cls.show_title(info='欢迎来到师生信息管理系统', num=3)
 43         print(' '*3 + '1.注册\t\t2.登录')
 44 
 45     # 身份确认(学生/教师)
 46     @classmethod
 47     def regist_type_ui(cls):
 48         cls.show_title(info='欢迎来到注册账号管理系统', num=3)
 49         print('1.学生注册\t\t2.教师注册')
 50 
 51     # 学生端菜单界面
 52     @classmethod
 53     def stu_ui(cls):
 54         cls.show_title(info='学生信息管理系统(学生端)', num=4)
 55         print('1.查看学生信息\t2.修改学生信息')
 56         print('3.修改学生密码\t0.退出')
 57 
 58     # 教师端菜单界面
 59     @classmethod
 60     def teach_ui(cls):
 61         cls.show_title(info='学生信息管理系统(教师端)', num=4)
 62         print('1.查看教师信息\t2.修改教师信息')
 63         print('3.修改教师密码\t4.重置学生密码')
 64         print('5.查找学生信息\t6.遍历学生信息')
 65         print('7.注销学生账号\t0.退出')
 66 
 67     # 管理员菜单界面
 68     @classmethod
 69     def admin_ui(cls):
 70         cls.show_title(info='学生信息管理系统(管理员)', num=4)
 71         print('1.重置师生密码\t2.修改管理员密码')
 72         print('3.查找师生信息\t4.设置账号归属地')
 73         print('5.遍历师生信息\t6.设置随机数位数')
 74         print('7.注销师生账号\t8.设置默认密码')
 75         print('0.退出')
 76 
 77     # 重置密码界面
 78     @classmethod
 79     def reset_password_ui(cls):
 80         cls.show_title(info='欢迎来到重置密码管理系统', num=4)
 81         print('1.重置学生密码\t2.重置教师密码')
 82 
 83     # 遍历学生/教师信息
 84     @classmethod
 85     def output_info_ui(cls):
 86         cls.show_title(info='欢迎来到遍历信息管理系统', num=4)
 87         print('1.遍历学生信息\t2.遍历教师信息')
 88 
 89     # 注销学生/教师账号
 90     @classmethod
 91     def logout_account_ui(cls):
 92         cls.show_title(info='欢迎来到注销账号管理系统', num=4)
 93         print('1.注销学生账号\t2.注销教师账号')
 94 
 95 
 96 # 菜单功能选择类(单继承)  ===============================================================
 97 class Menu_option(UI):
 98 
 99     num_list = list()  # 定义全局变量(如果报错就把这行放在函数外面)
100 
101     # 自然数列表
102     @classmethod
103     def char_list(cls):
104         cls.num_list = list()
105         for i in range(10):
106             cls.num_list.append(str(i))
107 
108     # 输入编号(整数)
109     @classmethod
110     def input_num(cls, max, menu, min=0,):
111 
112         cls.char_list()                 # 存入自然数字符
113 
114         buf = '请选择功能:'
115         while True:
116             flag_not_num = 0    # 非整数旗帜
117             num = input(buf)
118 
119             # 保证字符串是整数
120             for i in num:
121                 if i not in cls.num_list:
122                     flag_not_num = 1
123                     break
124 
125             # 在范围内返回整数
126             if not flag_not_num:
127                 # 捕获异常
128                 try:
129                     if min <= int(num) <= max:  # 等价于 int(num) >= min and int(num) <= max
130                         return int(num)
131                 except:
132                     return -1
133 
134             buf = '请重新选择功能(整数):'
135 
136             # 打印菜单
137             if menu == 1:
138                 cls.login_ui()
139             elif menu == 2:
140                 cls.regist_type_ui()
141             elif menu == 3:
142                 cls.stu_ui()
143             elif menu == 4:
144                 cls.teach_ui()
145             elif menu == 5:
146                 cls.admin_ui()
147             elif menu == 6:
148                 cls.reset_password_ui()
149             elif menu == 7:
150                 cls.output_info_ui()
151             elif menu == 8:
152                 cls.logout_account_ui()
153 
154 
155 # 文件操作类 ==========================================================================
156 class File_handle:
157 
158     # 创建一个空目录
159     @classmethod
160     def mkdir(cls, dir_name):
161         import os
162         # 判断目录是否存在,不存在立即创建
163         if os.path.exists(path=dir_name) is False:
164             os.mkdir(path=dir_name)
165 
166     # 创建一个txt文件
167     @classmethod
168     def mkfile(cls, file_name):
169         import os
170         # 判断文件是否存在,不存在立即创建
171         if os.path.exists(path=file_name) is False:
172             with open(file=file_name, mode='w', encoding='utf-8'):
173                 pass
174 
175 
176 # 特殊功能类 ==========================================================================
177 class Special_func(Global, File_handle):
178 
179     # 随机产生多位数字
180     @classmethod
181     def produce_rand_num(cls, digit=4):
182         num = ''
183         import random
184         for i in range(digit):
185             num += str(random.choice(seq=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
186         return num
187 
188     # 把全局变量写入文件
189     @classmethod
190     def write_the_message(cls):
191 
192         # 把全局变量写入文件
193         with open(file=f'{cls.one_dir}admin.txt', mode='w', encoding='utf-8') as file:
194             file.writelines([cls.home_location+' ',str(cls.rand_digit)+' ',cls.default_password+' ',cls.admin_password])
195 
196     # 读取全局变量文件
197     @classmethod
198     def read_the_message(cls):
199 
200         # 判断文件是否存在
201         import os
202         if os.path.exists(path=f'{cls.one_dir}admin.txt') is False:
203             # 创建目录
204             cls.mkdir(dir_name=cls.one_dir)
205             cls.mkdir(dir_name=cls.path_dir)
206             return
207 
208         # 读取文件信息
209         with open(file=f'{cls.one_dir}admin.txt', mode='r', encoding='utf-8') as file:
210             admin_info = file.readlines()
211 
212             # 赋值
213             cls.home_location = admin_info[0].split()[0]
214             cls.rand_digit = int(admin_info[0].split()[1])
215             cls.default_password = admin_info[0].split()[2]
216             cls.admin_password = admin_info[0].split()[3]
217 
218 
219 # 菜单功能实现类(单继承)  ===============================================================
220 class Menu_realizes(Menu_option, Special_func, File_handle):
221 
222     # 随机生成学号/工号(不重复)
223     @classmethod
224     def random_id(cls):
225         # 随机产生数字
226         num = cls.produce_rand_num(digit=cls.rand_digit)
227 
228         # 判断账号是否重复(在目录里查找)
229         import os
230         # 1.创建一个管理系统目录
231         cls.mkdir(dir_name=cls.one_dir)
232         # 2.创建一个学生信息系统目录
233         cls.mkdir(dir_name=cls.path_dir)
234         # 3.把学生信息目录的文件存入列表
235         stu_info = os.listdir(cls.path_dir)
236         # 4.拼接学号文件
237         stu_id = cls.home_location + num + '.txt'
238 
239         # 判断此学号是否存在
240         if stu_id in stu_info:
241             cls.random_id()
242             return cls.buf
243 
244         cls.buf = cls.home_location + num   # 此变量是在作用域在方法内
245         return cls.buf
246 
247     # 录入信息到管理系统
248     @classmethod
249     def input_info(cls, file_path, job):
250 
251         data = ''
252 
253         # 获取学号/工号
254         account = file_path.split('/')[2].split('.')[0]
255         if job == '学生':
256             print(f'您的学号是:{account}')
257         else:
258             print(f'您的工号是:{account}')
259 
260         # 输入数据
261         while True:
262             password = input('请设置密码:') + '@)@@)&)#'
263             if password != '@)@@)&)#':
264                 password = password.split('@)@@)&)#')[0]
265                 break
266         while True:
267             name = input(f'请输入{job}姓名:') + '@)@@)&)#'
268             if name != '@)@@)&)#':
269                 name = name.split('@)@@)&)#')[0]
270                 break
271         while True:
272             phone_num = input(f'请输入{job}手机号:') + '@)@@)&)#'
273             if phone_num != '@)@@)&)#':
274                 phone_num = phone_num.split('@)@@)&)#')[0]
275                 break
276 
277         while True:
278             addr = input(f'请输入{job}家庭地址:') + '@)@@)&)#'
279             if addr != '@)@@)&)#':
280                 addr = addr.split('@)@@)&)#')[0]
281                 break
282 
283         # 保存数据
284         data += account + ' \n'
285         data += password + ' \n'
286         data += name + ' \n'
287         data += phone_num + ' \n'
288         data += addr + ' \n'
289         data += job + ' \n'
290 
291         with open(file=file_path, mode='r+', encoding='utf-8') as file:
292             file.writelines(data)
293 
294     # 打印信息
295     @classmethod
296     def output_info(cls, file_path, flag=False):
297         with open(file=file_path, mode='r+', encoding='utf-8') as file:
298 
299             info_txt = file.readlines()
300 
301             if info_txt[-1].split()[0] == '学生':
302                 job = '学号:'
303             else:
304                 job = '工号:'
305 
306             # 打印信息
307             for i in range(6):
308                 if i == 0:
309                     print(f'{job}{info_txt[i].split()[0]}', end='\t')
310                 elif i == 1:
311                     print(f'密码:{info_txt[i].split()[0]}', end='\t')
312                 elif i == 2:
313                     print(f'姓名:{info_txt[i].split()[0]}', end='\t')
314                 elif i == 3:
315                     print(f'手机号:{info_txt[i].split()[0]}', end='\t')
316                 elif i == 4:
317                     print(f'家庭地址:{info_txt[i].split()[0]}', end='\t')
318 
319                 if flag and i == 5:
320                     print(f'职业:{info_txt[i].split()[0]}', end='\t')
321             print()
322 
323     # 注册
324     @classmethod
325     def regist_account(cls, job):
326         import os
327 
328         # 随机生成学号/工号
329         account = cls.random_id()
330 
331         # 文件路径拼接
332         file_name = os.path.join(cls.path_dir, account + '.txt')
333         # 创建一个txt文件,用于存储信息
334         cls.mkfile(file_name=file_name)
335 
336         # 打开txt文件,开始存入信息
337         cls.input_info(file_path=file_name, job=job)
338 
339         # 打印学生信息
340         cls.output_info(file_path=file_name)
341 
342         # 确认是否保存信息
343         while True:
344             is_save = input('请确认是否保存信息(y/n):')
345             if is_save == 'n' or is_save == 'N':
346                 os.remove(path=file_name)
347                 print('注册失败!')
348                 break
349             elif is_save == 'y' or is_save == 'Y':
350                 print('注册成功!')
351                 break
352 
353     # 判断账号密码是否正确,并返回职业
354     @classmethod
355     def check_account_password(cls, account, password):
356 
357         # 判断是否为管理员
358         if account == cls.admin_id and password == cls.admin_password:
359             return '管理员'
360 
361         # 字符串拼接
362         account += '.txt'
363 
364         # 获取目录文件名
365         import os
366         person = os.listdir(cls.path_dir)
367 
368         # 判断账号是否存在
369         if account not in person:
370             if account == cls.admin_id + '.txt':
371                 print('密码输入错误!')
372                 return None
373             print('学号/工号不存在!')
374             return None
375 
376         # 判断密码是否正确
377         with open(file=cls.path_dir + account, encoding='utf-8') as file:
378             if password != file.readlines()[1].split()[0]:
379                 print('输入密码错误!')
380                 return False
381 
382             # 调整读写位置
383             file.seek(0, 0)
384             # print(file.readlines())
385 
386             # 判断账号是学生还是教师
387             if '学生' == file.readlines()[-1].split()[0]:
388                 return '学生'
389             else:
390                 return '教师'
391 
392     # 修改个人信息
393     @classmethod
394     def change_info(cls, file_name):
395         while True:
396             new_name = input('请输入新的姓名:') + '@)@@)&)#'
397             if new_name != '@)@@)&)#':
398                 new_name = new_name.split('@)@@)&)#')[0]
399                 break
400         while True:
401             new_phone_num = input('请输入新的手机号:') + '@)@@)&)#'
402             if new_phone_num != '@)@@)&)#':
403                 new_phone_num = new_phone_num.split('@)@@)&)#')[0]
404                 break
405 
406         while True:
407             new_addr = input('请输入新的家庭地址:') + '@)@@)&)#'
408             if new_addr != '@)@@)&)#':
409                 new_addr = new_addr.split('@)@@)&)#')[0]
410                 break
411 
412         # 字符串拼接
413         new_name += ' \n'
414         new_phone_num += ' \n'
415         new_addr += ' \n'
416 
417         # 获取个人信息,并修改
418         with open(file=file_name, mode='r', encoding='utf-8') as file:
419             data = file.readlines()
420             data[2] = new_name
421             data[3] = new_phone_num
422             data[4] = new_addr
423 
424         # 确认是否修改信息
425         while True:
426             buf = input('请确认是否保存信息(y/n):')
427             if buf == 'y' or buf == 'Y':
428                 print('已成功修改信息')
429                 break
430             elif buf == 'n' or buf == 'N':
431                 print('已放弃修改信息')
432                 return
433 
434         # 保存更新修改后的信息
435         with open(file=file_name, mode='w', encoding='utf-8') as file:
436             file.writelines(data)
437 
438     # 修改个人密码
439     @classmethod
440     def change_password(cls, file_name):
441         old_password = input('请输入旧密码:')
442         while True:
443             new_password = input('请输入新密码:') + '@)@@)&)#'
444             if new_password != '@)@@)&)#':
445                 new_password = new_password.split('@)@@)&)#')[0]
446                 break
447 
448         # 读取文件数据
449         with open(file=file_name, encoding='utf-8') as file:
450             data = file.readlines()
451 
452         # 校对旧密码,是否正确
453         if data[1].split()[0] != old_password:
454             print('旧密码输入有误!')
455             return
456 
457         # 确认是否修改密码
458         while True:
459             buf = input('请确认是否修改密码(y/n):')
460             if buf == 'y' or buf == 'Y':
461                 print('已成功修改密码')
462                 break
463             elif buf == 'n' or buf == 'N':
464                 print('已放弃修改密码')
465                 return
466 
467         # 替换旧密码
468         new_password += ' \n'
469         data[1] = new_password
470 
471         # 重写到文件里
472         with open(file=file_name, mode='w', encoding='utf-8') as file:
473             file.writelines(data)
474 
475     # 重置登录密码
476     @classmethod
477     def reset_password(cls, job):
478 
479         # 确认身份
480         if job == '学生':
481             account = input('请输入学号:')
482         else:
483             account = input('请输入工号:')
484         name = input(f'请输入{job}姓名:')
485 
486         # 获取目录信息
487         import os
488         dir_info = os.listdir(cls.path_dir)
489 
490         # 判断账号是否存在
491         if f'{account}.txt' not in dir_info:
492             if job == '学生':
493                 print('学号输入有误!')
494             else:
495                 print('工号输入有误!')
496             return
497 
498         # 获取文件信息
499         with open(file=f'{cls.path_dir + account}.txt', encoding='utf-8') as file:
500             file_info = file.readlines()
501 
502         # 判断账号是否为学生/教师
503         if file_info[-1] != f'{job} \n':
504             if job == '学生':
505                 print('此学号不存在!')
506             else:
507                 print('此工号不存在!')
508             return
509 
510         # 校对输入姓名
511         if name + ' \n' != file_info[2]:
512             print(f'{job}姓名输入有误!')
513             return
514 
515         # 确认是否重置密码
516         while True:
517             buf = input('请确认是否重置密码(y/n):')
518             if buf == 'y' or buf == 'Y':
519                 print('已成功重置密码')
520                 break
521             elif buf == 'n' or buf == 'N':
522                 print('已放弃重置密码')
523                 return
524 
525         # 修改密码
526         file_info[1] = f'{cls.default_password} \n'
527 
528         # 写入文件信息
529         with open(file=f'{cls.path_dir + account}.txt', mode='w', encoding='utf-8') as file:
530             file.writelines(file_info)
531 
532     # 查找个人信息
533     @classmethod
534     def find_info(cls, job=None, flag=False):
535         flag_none = 0
536         name = input(f'请输入需要查找姓名:')
537 
538         # 获取目录信息
539         import os
540         dir_info = os.listdir(cls.path_dir)
541 
542         # 遍历查找
543         for i in dir_info:
544             # 获取文件信息
545             with open(file=cls.path_dir + i, encoding='utf-8') as file:
546                 file_info = file.readlines()
547                 if file_info[2] == name + ' \n':
548                     if not flag_none:
549                         cls.show_title(info=f'查找的信息如下')
550                         flag_none = 1
551 
552                     if str(job) + ' \n' == file_info[-1]:
553                         cls.output_info(file_path=cls.path_dir + i, flag=flag)
554 
555                     elif not job:
556                         cls.output_info(file_path=cls.path_dir + i, flag=flag)
557 
558         if not flag_none:
559             print(f'姓名输入有误!')
560 
561     # 打印所有学生/教师信息
562     @classmethod
563     def output_all_info(cls, job):
564 
565         flag_none = 0
566 
567         # 获取目录信息
568         import os
569         dir_info = os.listdir(cls.path_dir)
570 
571         # 校对信息,并打印
572         for i in dir_info:
573             with open(file=cls.path_dir + i, encoding='utf-8') as file:
574                 if file.readlines()[-1] == job + ' \n':
575                     cls.output_info(file_path=cls.path_dir + i)
576                     flag_none = 1
577 
578         if not flag_none:
579             print('\n\t\t  暂无数据\n')
580 
581     # 注销学号/工号
582     @classmethod
583     def logout_account(cls, job):
584 
585         # 确认身份
586         if job == '学生':
587             account = input('请输入学号:')
588         else:
589             account = input('请输入工号:')
590         name = input(f'请输入{job}姓名:')
591 
592         # 获取目录信息
593         import os
594         dir_info = os.listdir(cls.path_dir)
595 
596         # 判断账号是否存在
597         if f'{account}.txt' not in dir_info:
598             if job == '学生':
599                 print('学号输入有误!')
600             else:
601                 print('工号输入有误!')
602             return
603 
604         # 获取文件信息
605         with open(file=f'{cls.path_dir + account}.txt', encoding='utf-8') as file:
606             file_info = file.readlines()
607 
608         # 判断账号是否为学生/教师
609         if file_info[-1] != f'{job} \n':
610             if job == '学生':
611                 print('此学号不存在!')
612             else:
613                 print('此工号不存在!')
614             return
615 
616         # 校对输入姓名
617         if name + ' \n' != file_info[2]:
618             print(f'{job}姓名输入有误!')
619             return
620 
621         # 改变赋值
622         if job == '学生':
623             job = '学号'
624         else:
625             job = '工号'
626 
627         # 确认是否注销学号/工号
628         while True:
629             buf = input(f'请确认是否注销{job}(y/n):')
630             if buf == 'y' or buf == 'Y':
631                 print(f'已成功注销{job}')
632                 break
633             elif buf == 'n' or buf == 'N':
634                 print(f'已放弃注销{job}')
635                 return
636 
637         # 删除文件
638         os.remove(path=f'{cls.path_dir + account}.txt')
639 
640     # 修改管理员密码
641     @classmethod
642     def change_admin_password(cls):
643         old_password = input('请输入旧密码:')
644         while True:
645             new_password = input('请输入新密码:') + '@)@@)&)#'
646             if new_password != '@)@@)&)#':
647                 new_password = new_password.split('@)@@)&)#')[0]
648                 break
649 
650         # 校验旧密码
651         if old_password != cls.admin_password:
652             print('旧密码输入错误!')
653             return
654 
655         # 确认是否修改密码
656         while True:
657             buf = input('请确认是否修改管理员密码(y/n):')
658             if buf == 'y' or buf == 'Y':
659                 print(f'已成功修改管理员密码')
660                 break
661             elif buf == 'n' or buf == 'N':
662                 print('已放弃修改管理员密码')
663                 return
664 
665         # 修改密码
666         cls.admin_password = new_password
667 
668         # 写入文件
669         cls.write_the_message()
670 
671     # 归属地设置
672     @classmethod
673     def set_home_location(cls):
674         while True:
675             new_home_location = input('请输入新归属地:') + '@)@@)&)#'
676             if new_home_location != '@)@@)&)#':
677                 new_home_location = new_home_location.split('@)@@)&)#')[0]
678                 break
679 
680         # 确认是否修改归属地
681         while True:
682             buf = input('请确认是否修改归属地(y/n):')
683             if buf == 'y' or buf == 'Y':
684                 print(f'已成功修改归属地')
685                 break
686             elif buf == 'n' or buf == 'N':
687                 print('已放弃修改归属地')
688                 return
689 
690         # 修改归属地
691         cls.home_location = new_home_location
692 
693         # 写入文件
694         cls.write_the_message()
695 
696     # 设置随机数位数
697     @classmethod
698     def set_rand_digit(cls):
699         while True:
700             new_rand_digit = input('请输入新随机数位数:') + '@)@@)&)#'
701             if new_rand_digit != '@)@@)&)#':
702                 new_rand_digit = new_rand_digit.split('@)@@)&)#')[0]
703                 break
704 
705         # 确认是否修改随机数位数
706         while True:
707             buf = input('请确认是否修改归属地(y/n):')
708             if buf == 'y' or buf == 'Y':
709                 print(f'已成功修改随机数位数')
710                 break
711             elif buf == 'n' or buf == 'N':
712                 print('已放弃修改随机数位数')
713                 return
714 
715         # 修改随机数位数
716         cls.rand_digit = new_rand_digit
717 
718         # 写入文件
719         cls.write_the_message()
720 
721     # 设置默认密码
722     @classmethod
723     def set_default_password(cls):
724         while True:
725             new_default_password = input('请输入新默认密码:') + '@)@@)&)#'
726             if new_default_password != '@)@@)&)#':
727                 new_default_password = new_default_password.split('@)@@)&)#')[0]
728                 break
729 
730         # 确认是否修改默认密码
731         while True:
732             buf = input('请确认是否修改默认密码(y/n):')
733             if buf == 'y' or buf == 'Y':
734                 print(f'已成功修改默认密码')
735                 break
736             elif buf == 'n' or buf == 'N':
737                 print('已放弃修改默认密码')
738                 return
739 
740         # 修改默认密码
741         cls.default_password = new_default_password
742 
743         # 写入文件
744         cls.write_the_message()
745 
746 
747 # 菜单功能框架类(单继承)  ===============================================================
748 class Menu_bar(Menu_realizes):
749 
750     # 注册 or 登录
751     @classmethod
752     def login_option(cls, num):
753         # 注册 # 选择注册类型(学生/教师)
754         if num == 1:
755             while True:
756                 cls.regist_type_ui()
757                 num = cls.input_num(max=2, min=0, menu=2)
758                 if num == 0:
759                     print('已返回')
760                     break
761                 elif num == -1:
762                     continue
763 
764                 Menu_bar.regist_option(num=num)
765                 break
766 
767         # 登录
768         elif num == 2:
769             account = input('请输入学号/工号:')
770             password = input('请输入密码:')
771 
772             # 检查账号密码是否正确
773             job = cls.check_account_password(account=account, password=password)
774 
775             # 进入不同的系统
776             # 学生系统
777             if job == '学生':
778                 while True:
779                     cls.stu_ui()
780                     num = cls.input_num(max=3, menu=3)
781                     if num == 0:
782                         print('已返回')
783                         return
784                     cls.stu_option(num=num, account=account)
785 
786             # 教师系统
787             elif job == '教师':
788                 while True:
789                     cls.teach_ui()
790                     num = cls.input_num(max=7, menu=4)
791                     if num == 0:
792                         print('已返回')
793                         return
794                     cls.teach_option(num=num, account=account)
795 
796             # 管理员系统
797             elif job == '管理员':
798                 while True:
799                     cls.admin_ui()
800                     num = cls.input_num(max=8, menu=5)
801                     if num == 0:
802                         print('已返回')
803                         return
804                     cls.admin_option(num=num)
805 
806     # 选择学生注册 or 教师注册
807     @classmethod
808     def regist_option(cls, num):
809         # 学生注册
810         if num == 1:
811             cls.show_title('学生注册')
812             cls.regist_account(job='学生')
813 
814         # 教师注册
815         elif num == 2:
816             cls.show_title('教师注册')
817             cls.regist_account(job='教师')
818 
819     # 选择学生功能
820     @classmethod
821     def stu_option(cls, num, account):
822         # 文件拼接
823         file_name = cls.path_dir + account + '.txt'
824 
825         # 1.查看学生信息
826         if num == 1:
827             cls.show_title(info='查看学生信息')
828             cls.output_info(file_path=file_name)
829 
830         # 2.修改学生信息
831         elif num == 2:
832             cls.show_title(info='修改学生信息')
833             cls.change_info(file_name=file_name)
834 
835         # 3.修改学生密码
836         elif num == 3:
837             cls.show_title(info='修改学生密码')
838             cls.change_password(file_name=file_name)
839 
840     # 选择教师功能
841     @classmethod
842     def teach_option(cls, num, account):
843         # 文件路径拼接
844         file_name = cls.path_dir + account + '.txt'
845 
846         # 1.查看教师信息
847         if num == 1:
848             cls.show_title(info='查看教师信息')
849             cls.output_info(file_path=file_name)
850 
851         # 2.修改教师信息
852         elif num == 2:
853             cls.show_title(info='修改教师信息')
854             cls.change_info(file_name=file_name)
855 
856         # 3.修改教师密码
857         elif num == 3:
858             cls.show_title(info='修改教师密码')
859             cls.change_password(file_name=file_name)
860 
861         # 4.重置学生密码
862         elif num == 4:
863             cls.show_title(info='重置学生密码')
864             cls.reset_password(job='学生')
865 
866         # 5.查找学生信息
867         elif num == 5:
868             cls.show_title(info='查找学生信息')
869             cls.find_info(job='学生')
870 
871         # 6.遍历学生信息
872         elif num == 6:
873             cls.show_title(info='遍历学生信息')
874             cls.output_all_info(job='学生')
875 
876         # 7.注销学生账号
877         elif num == 7:
878             cls.show_title(info='注销学生账号')
879             cls.logout_account(job='学生')
880 
881     # 选择管理员功能
882     @classmethod
883     def admin_option(cls, num):
884 
885         # 1.重置师生密码
886         if num == 1:
887             while True:
888                 cls.reset_password_ui()
889                 num = cls.input_num(max=2, menu=6)
890                 if num == 0:
891                     print('已返回')
892                     break
893                 elif num == 1:
894                     cls.show_title(info='重置学生密码')
895                     cls.reset_password(job='学生')
896                     break
897                 elif num == 2:
898                     cls.show_title(info='重置教师密码')
899                     cls.reset_password(job='教师')
900                     break
901 
902         # 2.修改管理员密码
903         elif num == 2:
904             cls.show_title(info='修改管理员密码')
905             cls.change_admin_password()
906 
907         # 3.查找师生信息
908         elif num == 3:
909             cls.show_title(info='查找师生信息')
910             cls.find_info(flag=True)
911 
912         # 4.设置账号归属地
913         elif num == 4:
914             cls.show_title(info='设置账号归属地')
915             cls.set_home_location()
916 
917         # 5.遍历师生信息
918         elif num == 5:
919             while True:
920                 cls.output_info_ui()
921                 num = cls.input_num(max=2, menu=7)
922                 if num == 0:
923                     print('已返回')
924                     break
925                 elif num == 1:
926                     cls.show_title(info='遍历学生信息')
927                     cls.output_all_info(job='学生')
928                     break
929                 elif num == 2:
930                     cls.show_title(info='遍历教师信息')
931                     cls.output_all_info(job='教师')
932                     break
933 
934         # 6.设置随机数位数
935         elif num == 6:
936             cls.show_title(info='设置随机数位数')
937             cls.set_rand_digit()
938 
939         # 7.注销师生账号
940         elif num == 7:
941             while True:
942                 cls.logout_account_ui()
943                 num = cls.input_num(max=2, menu=8)
944                 if num == 0:
945                     print('已返回')
946                     break
947                 elif num == 1:
948                     cls.show_title(info='注销学生账号')
949                     cls.logout_account(job='学生')
950                     break
951                 elif num == 2:
952                     cls.show_title(info='注销教师账号')
953                     cls.logout_account(job='教师')
954                     break
955 
956         # 8.设置默认密码
957         elif num == 8:
958             cls.show_title(info='设置默认密码')
959             cls.set_default_password()
960 
961 
962 # 功能实现区(相当于C语言的主函数) =======================================================
963 while True:
964 
965     # 读取文件
966     Menu_bar.read_the_message()
967 
968     Menu_bar.login_ui()                     # 注册 or 登录界面
969 
970     num = Menu_bar.input_num(max=2, min=0, menu=1)  # 选择菜单功能编号
971 
972     if num == 0:
973         Menu_bar.show_title(info='已退出管理系统', num=7)
974         Menu_bar.write_the_message()    # 写入文件
975         break
976 
977     Menu_bar.login_option(num=num)          # 实现菜单功能

运行结果:

===欢迎来到师生信息管理系统===
1.注册 2.登录
请选择功能:2
请输入学号/工号:123456
请输入密码:123456
====学生信息管理系统(管理员)====
1.重置师生密码 2.修改管理员密码
3.查找师生信息 4.设置账号归属地
5.遍历师生信息 6.设置随机数位数
7.注销师生账号 8.设置默认密码
0.退出
请选择功能:0
已返回
===欢迎来到师生信息管理系统===
1.注册 2.登录
请选择功能:1
===欢迎来到注册账号管理系统===
1.学生注册 2.教师注册
请选择功能:1
=========学生注册=========
您的学号是:2207039778
请设置密码:123456
请输入学生姓名:周华
请输入学生手机号:10086
请输入学生家庭地址:广州
学号:2207039778 密码:123456 姓名:周华 手机号:10086 家庭地址:广州
请确认是否保存信息(y/n):y
注册成功!
===欢迎来到师生信息管理系统===
1.注册 2.登录
请选择功能:0
=======已退出管理系统=======

Process finished with exit code 0