学员选课系统(进阶)

从“学生选课系统” 这几个字就可以看出来,我们最核心的功能其实只有 选课。
角色:
    学生、管理员
功能:
    登陆 : 管理员和学生都可以登陆,且登陆之后可以自动区分身份
    选课 : 学生可以自由的为自己选择课程
    创建用户 : 选课系统是面向本校学生的,因此所有的用户都应该由管理员完成
    查看选课情况 :每个学生可以查看自己的选课情况,而管理员应该可以查看所有学生的信息
工作流程:
    登陆 :用户输入用户名和密码
    判断身份 :在登陆成果的时候应该可以直接判断出用户的身份 是学生还是管理员

    学生用户 :对于学生用户来说,登陆之后有三个功能
        1、查看所有课程
        2、选择课程
        3、查看所选课程
        4、退出程序
    管理员用户:管理员用户除了可以做一些查看功能之外,还有很多创建工作
        1、创建课程
        2、创建学生学生账号
        3、查看所有课程
        4、查看所有学生
        5、查看所有学生的选课情况
        6、退出程序
'''直接运行即可,注意细节'''
'''注意管理员为自动创建,user=admin, pass=123,直接登录即可'''

import os
import json


class User:
    def __init__(self, name):  # 传入用户名
        self.name = name

    dic = {"查看课程": 'User_see', '选择课程': 'Choice_course', "查看所选课程": 'Selected', "退出": 'Exit'}

    def User_see(self):  # 查看所有课程
        with open('class_all.txt', encoding='utf-8') as file:
            tmp = {}  # 通过字典添加值
            for index, i in enumerate(file.read().split('|')[:-1], 1):
                print(index, i)
                tmp.setdefault(str(index), i)  # 把得到的结果放入到tmp中
            return tmp  # 把返回值return出去

    def Choice_course(self):  # 选择课程
        tmp = self.User_see()  # 调用查看课程的方法显示
        Choice = input('请输入你选择的课程序号')
        if Choice in tmp:  # 判断选的课在不在列表里
            with open('choice_class.txt', encoding='utf-8') as file:
                chice_class = json.load(file)  # 把chice_class.txt序列化出来,得到字典
                if chice_class.get(self.name):  # 判断用户和课程里有没有那个用户
                    chice_class.get(self.name).append(tmp[Choice])  # 添加到字典中
                else:
                    chice_class.setdefault(self.name, [tmp[Choice]])
            with open('choice_class.txt', encoding='utf-8', mode='w') as file:
                json.dump(chice_class, file, ensure_ascii=False)  # 再把chice_class值放入到文件中
        else:
            print('不在范围内')

    def Selected(self):  # 查看所选课程
        with open('choice_class.txt', encoding='utf-8') as file:
            user_course = json.load(file)  # 把chice_class.txt序列化出来,得到字典
            print(user_course.get(self.name))

    def Exit(self):  # 退出
        exit('欢迎下次再来。。。')


class Admin:
    dic = {"创建课程": 'Create_course', '创建学生学生账号': 'Create_user',
           "创建讲师账号": 'Create_teacher', "为讲师指定班级": "Appoint_class",
           "为学生指定班级": "Student_class", "查看所有课程": 'Select_all_course',
           "创建班级": "Create_class", "查看所有学生": 'Select_user_all',
           "查看所有学生的选课情况": 'Select_course_user', '退出程序': 'Exit'}

    def __init__(self, name):
        self.name = name

    def Create_course(self):  # 创建课程
        Choice = input('输入创建课程名称')
        with open('class_all.txt', encoding='utf-8', mode='a') as file:
            file.write(Choice + '|')
        print('创建{}课程成功'.format(Choice))

    def Create_user(self):  # 创建学生账号
        stu_name = input('请输入学生账号:').strip()
        stu_pwd = input('请输入学生密码:').strip()
        with open('user.txt', encoding='utf-8', mode='a') as file:
            file.write('\n{}|{}|student'.format(stu_name, stu_pwd))
        print('{}同学创建成功'.format(stu_name))

    def Create_teacher(self):  # 创建讲师账号
        stu_name = input('请输入讲师账号:').strip()
        stu_pwd = input('请输入讲师密码:').strip()
        with open('user.txt', encoding='utf-8', mode='a') as file:
            file.write('\n{}|{}|Teacher'.format(stu_name, stu_pwd))
        with open('teacher.txt', encoding='utf-8', mode='a') as file:  # 创建完成后把name写入teacher.txt文件中
            file.write(stu_name + '|')
        print('{}讲师创建成功'.format(stu_name))

    def Appoint_class(self):  # 为讲师指定班级
        with open('Create_class.txt', encoding='utf-8') as file:
            p1 = json.load(file)  # 把班级文件序列化出来
        tmp1 = []
        if os.path.exists('teacher.txt'):  # 判断文件是否存在
            with open('teacher.txt', encoding='utf-8', mode='r') as file:
                for i in file.readlines():
                    tmp1 = i.strip().split('|')[:-1]  # 把值添加到tmp1列表中
            for i, index in enumerate(tmp1, 1):  # 显示老师名称
                print(i, index)
            for i, index in enumerate(p1, 1):  # 显示班级名称
                print(i, index)
            choice_tracher = int(input('输入你选择的讲师')) - 1
            with open('teacher_class.txt', encoding='utf-8', mode='r') as file:
                l1 = json.load(file)
            if p1 == []:  # 判断是否有班级存在
                print('如果要添加则请先创建班级')
            else:
                choice_class = int(input('输入你选择的班级')) - 1
                if l1.get(tmp1[choice_tracher]):  # 判断l1字典中是否为新用户
                    l1.get(tmp1[choice_tracher]).append(p1[choice_class])  # 追加到后面list中
                else:
                    l1.setdefault(tmp1[choice_tracher], [p1[choice_class]])  # 单个key value
                l1[tmp1[choice_tracher]] = list(set(l1[tmp1[choice_tracher]]))  # 去重
                with open('teacher_class.txt', encoding='utf-8', mode='w') as file:
                    json.dump(l1, file, ensure_ascii=False)  # 写入文件
                print('{}老师指定{}成功'.format(tmp1[choice_tracher], p1[choice_class]))
        else:
            print('清先创建讲师')

    def Student_class(self):  # 为学生指定班级
        p1 = self.Select_user_all()  # 调用Select_user_all方法,查看出有哪些学生,p1为列表
        if p1 == []:  # 是否有学生存在
            print('清先创建学生后在来添加')
        else:
            if os.path.exists('Create_class.txt'):
                print('所有班级为:')
                with open('Create_class.txt', encoding='utf-8') as file:
                    tmp1 = json.load(file)
                    for i, index in enumerate(tmp1, 1):
                        print(i, index)
                user = int(input('输入你添加的学生序号')) - 1
                student = int(input('输入你添加的班级序号')) - 1
                with open('student_class.txt', encoding='utf-8', mode='r') as file:
                    l1 = json.load(file)

                if l1.get(tmp1[student]):  # 判断l1中key是否有此用户
                    l1.get(tmp1[student]).append(p1[user])
                else:
                    l1.setdefault(tmp1[student], [p1[user]])
                l1[tmp1[student]] = list(set(l1[tmp1[student]]))  # 去重
                with open('student_class.txt', encoding='utf-8', mode='w') as file:
                    json.dump(l1, file, ensure_ascii=False)
                print('{}添加{}学生成功'.format(tmp1[student], p1[user]))

            else:
                print('请先创建班级后再来添加')

    def Create_class(self):  # 创建班级
        Test_class = input('输入你创建班级的名称如(-年级-班)')
        if os.path.exists('Create_class.txt'):  # 判断文件是否存在
            with open('Create_class.txt', encoding='utf-8') as file:
                p1 = json.load(file)
                p1.append(Test_class)  # 添加班级

        else:
            with open('Create_class.txt', encoding='utf-8', mode='w') as file:
                file.write('[]')  # 创建文件,添加 []
            with open('Create_class.txt', encoding='utf-8') as file:
                p1 = json.load(file)
                p1.append(Test_class)

        with open('Create_class.txt', encoding='utf-8', mode='w') as file:
            json.dump(p1, file, ensure_ascii=False)  # 写入文件
        print('创建{}成功'.format(Test_class))
        return p1  # 把列表返回出去

    def Select_all_course(self):  # 查看所有课程
        print('查看的课程为')
        with open('class_all.txt', encoding='utf-8') as f:
            tmp = {}
            for index, i in enumerate(f.read().split('|')[:-1], 1):
                print(index, i, )
                tmp.setdefault(str(index), i)
            return tmp  # 方便后面方法使用

    def Select_user_all(self):  # 查看所有学生
        student = []
        with open('user.txt', encoding='utf-8') as file:
            print('学生用户为:')
            for i, index in enumerate(file.readlines()):
                if index.strip().split('|')[-1] == 'student':  # 取出学生
                    print(i, index.strip().split('|')[0])
                    student.append(index.strip().split('|')[0])
        return student

    def Select_course_user(self):  # 查看所有学生的选课情况
        if os.path.exists('choice_class.txt'):
            with open('choice_class.txt', encoding='utf-8') as file:
                for i in file.readlines():  # 列出文件的每行类容
                    print(i)
        else:
            print('清先登录学生账号添加课程后查看')

    def Exit(self):  # 退出
        exit('欢迎下次再来。。。')


class Teacher:
    def __init__(self, name):
        self.name = name

    dic = {'查看所有课程': 'Select_choice', '查看所教班级': 'Select_student',
           '查看班级中的学生': 'Select_class_student', '退出': 'Exit'}

    def Select_choice(self):  # 查看所有课程
        if os.path.exists('class_all.txt'):  # 判断课程是否存在
            with open('class_all.txt', encoding='utf-8') as file:
                for i in file.readlines():
                    print(i.strip().split('|')[:-1])

        else:
            print('请先登录管理员创建课程')

    def Select_student(self):  # 查看所教班级
        if os.path.exists('teacher_class.txt'):
            with open('teacher_class.txt', encoding='utf-8') as file:
                tmp1 = json.load(file).get(self.name)
                print(tmp1)
                return tmp1
        else:
            print('目前暂无,请登录管理员添加')

    def Select_class_student(self):  # 查看班级中的学生
        if os.path.exists('teacher_class.txt') and os.path.exists('student_class.txt'):
            tmp = self.Select_student()  # 先调用Select_student方法查看,tmp得到返回值
            with open('student_class.txt', encoding='utf-8') as file:
                student = json.load(file)
            if tmp == None:
                print('当前老师班级没有学生')
            else:
                for i in tmp:
                    if student.get(i):
                        print(i, student[i])

        else:
            print('目前暂无,请登录管理员添加')

    def Exit(self):  # 退出
        exit('欢迎下次再来。。。')


class login_Test:  # 判断登录账户
    print('欢迎来到学员管理系统')

    def __init__(self, username, password):
        self.username = username
        self.password = password

    def login(self):
        with open('user.txt', encoding='utf-8') as file:
            for i in file.readlines(): # 取出每一行
                '''判断用户密码是否正确'''
                if self.username == i.strip().split('|')[0] and self.password == i.strip().split('|')[1]:
                    if i.strip().split('|')[-1] == 'admin':
                        return 'admin'
                    elif i.strip().split('|')[-1] == 'student':
                        return 'student'
                    elif i.strip().split('|')[-1] == 'Teacher':
                        return 'teacher'
            else:
                print('用户名密码错误')


def log_status():  # 方便后面调用
    tmp = []
    username = input('请输入用户名')
    password = input('请输入密码')
    p1 = login_Test(username, password)
    tmp.append(username)
    tmp.append(p1.login())
    return tmp


def func(class_func):
    tmp = {}
    while 1:
        for index, i in enumerate(class_func.dic, 1):
            print(index, i)
            tmp.setdefault(str(index), class_func.dic[i])
        p2 = input("输入你选择的序号")
        getattr(class_func, tmp[p2])()

'''用于文件创建'''
if os.path.exists('user.txt') == False:
    with open('user.txt', encoding='utf-8', mode='w') as file:
        file.write('admin|123|admin')
if os.path.exists('teacher_class.txt') == False:
    with open('teacher_class.txt', encoding='utf-8', mode='w') as file:
        file.write('{}')
if os.path.exists('choice_class.txt') == False:
    with open('choice_class.txt', encoding='utf-8', mode='w') as file:
        file.write('{}')
if os.path.exists('Create_class.txt') == False:
    with open('Create_class.txt', encoding='utf-8', mode='w') as file:
        file.write('[]')
if os.path.exists('class_all.txt') == False:
    with open('class_all.txt', encoding='utf-8', mode='w') as file:
        pass
if os.path.exists('student_class.txt') == False:
    with open('student_class.txt', encoding='utf-8', mode='w') as file:
        file.write('{}')
login_status = log_status()  # class_all.txt
while True:
    if login_status[1] == 'student':
        p1 = User(login_status[0])
        func(p1)

    elif login_status[1] == 'admin':
        p1 = Admin(login_status[0])
        func(p1)
    elif login_status[1] == 'teacher':
        p1 = Teacher(login_status[0])
        func(p1)
    else:
        break

 



posted @ 2018-11-22 17:56  金元  阅读(345)  评论(0编辑  收藏  举报