raygor
# 作业详细要求见:
# 景女神的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(\'\n\')
                    print(\'Save success.\n\' + 10 * \'-\')
                    return
            else:
                print(\'Illegal input.\n\' + 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.\n\' + 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()

分类:

技术点:

相关文章: