# 作业详细要求见:
# 景女神的blog https://www.cnblogs.com/Eva-J/articles/9235899.html
import pickle
import sys
class User:
def __init__(self, username, password, permission):
self.username = username
self.password = password
self.permission = permission
def view_all_course(self):
with open(COURSE_PATH, mode='rb') as file_handler:
for i in range(1, INF):
try:
ret = pickle.load(file_handler)
print(i, ret.name, ret.cycle, ret.teacher)
except EOFError:
print('-' * 10)
break
@staticmethod
def my_exit():
global Login_user
Login_user = False
REGISTER_PATH = 'register'
COURSE_PATH = 'course'
CHOOSE_PATH = 'choose'
INF = 0x7FFFFFFF
Login_user = User(None, None, None)
class Course:
def __init__(self, name, cycle, teacher):
self.name = name
self.cycle = cycle
self.teacher = teacher
@staticmethod
def Num():
num = 0
with open(COURSE_PATH, mode='rb') as file_handler:
for i in range(INF):
try:
pickle.load(file_handler)
num += 1
except EOFError:
return num
class Student(User):
Ins = [('查看所有课程', 'view_all_course'), ('选择课程', 'choose_course'),
('查看所选课程', 'view_chosen_course'), ('退出程序', 'my_exit')]
def __init__(self, user, password, permission):
super().__init__(user, password, permission)
self.course = []
def choose_course(self):
while True:
self.view_all_course()
choose_course = input('choose ur course (input Q or q to exit). >>>')
if choose_course.isdecimal():
if int(choose_course) > 0 and int(choose_course) <= Course.Num():
with open(COURSE_PATH, mode='rb') as file_handler:
for i in range(int(choose_course)):
ret = pickle.load(file_handler)
self.course.append(ret)
elif choose_course.upper() == 'Q':
with open(CHOOSE_PATH, encoding='utf-8', mode='a') as file_handler:
file_handler.write(self.username)
for c in self.course:
file_handler.write(' ' + c.name)
file_handler.write('
')
print('Save success.
' + 10 * '-')
return
else:
print('Illegal input.
' + 10 * '-')
def view_chosen_course(self):
with open(CHOOSE_PATH, encoding='utf-8', mode='r') as file_handler:
flag = False
for line in file_handler:
if self.username in line:
print(line.strip())
print(10 * '-')
flag = True
if flag == False: print('No course.
' + 10 * '-')
@staticmethod
def get_student_list():
student_list = []
with open(REGISTER_PATH, mode='rb') as file_handler:
for i in range(INF):
try:
ret = pickle.load(file_handler)
if ret.permission == 'student':
student_list.append(ret)
except EOFError:
return student_list
class Administrator(User):
Ins = [('创建课程', 'new_course'), ('创建学生学生账号', 'new_stu'), ('查看所有课程', 'view_all_course'),
('查看所有学生', 'view_all_stu'), ('查看所有学生选课情况', 'view_course_selection'), ('退出程序', 'my_exit')]
def new_course(self):
course_name = input('new course name. >>>')
course_cycle = input('new course cycle. >>>')
course_teacher = input('new course teacher. >>>')
new_cour = Course(course_name, course_cycle, course_teacher)
with open(COURSE_PATH, mode='ab') as file_handler:
pickle.dump(new_cour, file_handler)
print('-' * 10)
@staticmethod
def new_stu():
new_user('Student')
def view_all_stu(self):
with open(REGISTER_PATH, mode='rb') as file_handler:
for i in range(INF):
try:
ret = pickle.load(file_handler)
if ret.permission == 'Student':
print(i, ret.username)
except EOFError:
print('-' * 10)
break
@staticmethod
def view_course_selection():
with open(CHOOSE_PATH, encoding='utf-8', mode='r') as file_handler:
for line in file_handler:
print(line.strip())
print('-' * 10)
def check_admin():
with open(REGISTER_PATH, mode='rb') as file_handler:
for i in range(INF):
try:
ret = pickle.load(file_handler)
if ret.permission == 'Administrator':
return True
except EOFError:
return False
def new_user(permission):
while True:
flag = True
user_username = input('new student username. >>>')
user_password = input('new student password. >>>')
with open(REGISTER_PATH, mode='rb') as file_handler:
for i in range(INF):
try:
ret = pickle.load(file_handler)
if ret.username == user_username:
print('Username Exist.')
print('-' * 10)
flag = False
except EOFError:
break
if flag == True:
break
if permission == 'Student':
new_u = Student(user_username, user_password, permission)
with open(REGISTER_PATH, mode='ab') as file_handler:
pickle.dump(new_u, file_handler)
print('Create success.')
print('-' * 10)
elif permission == 'Administrator':
new_u = Administrator(user_username, user_password, permission)
with open(REGISTER_PATH, mode='ab') as file_handler:
pickle.dump(new_u, file_handler)
print('Create success.')
print('-' * 10)
else:
return False
def login():
for i in range(3):
username = input('username:')
password = input('password:')
with open(REGISTER_PATH, mode='rb') as file_handler:
for i in range(INF):
try:
ret = pickle.load(file_handler)
if ret.username == username and ret.password == password:
global Login_user
Login_user = ret
print(f'welcome {Login_user.username} Permission: {Login_user.permission}')
print('-' * 10)
return True
except EOFError:
break
print('Incorrect account or password.')
print('-' * 10)
return False
def run():
if check_admin() == False:
print('NO found Administrator, we have to create a new Administrator.')
new_user('Administrator')
if not login():
return
if hasattr(sys.modules['__main__'], Login_user.permission):
if callable(getattr(sys.modules['__main__'], Login_user.permission)):
while Login_user:
for i, choose in enumerate(getattr(sys.modules['__main__'], Login_user.permission).Ins, 1):
print(f'{i}、{choose[0]}')
ins = input('choose ins. >>>')
if hasattr(Login_user, getattr(sys.modules['__main__'], Login_user.permission).Ins[int(ins) - 1][1]):
if callable(getattr(Login_user,
getattr(sys.modules['__main__'], Login_user.permission).Ins[int(ins) - 1][1])):
getattr(Login_user,
getattr(sys.modules['__main__'], Login_user.permission).Ins[int(ins) - 1][1])()
return
if __name__ == '__main__':
run()