zoukankan      html  css  js  c++  java
  • 学生选课小程序

    # -*- coding: utf-8 -*-
    # @Time    : 18-10-7 上午11:45
    # @Author  : Felix Wang
    
    '''
    选课系统开发 系统登录需要有三类用户:学生、管理员、讲师,针对不同用户提供不
    同功能:
    学生用户 :对于学生用户来说,登陆之后有三个功能
    1、查看所有课程
    2、选择课程
    3、查看所选课程
    4、删除已选课程
    管理员用户:管理员用户除了可以做一些查看功能之外,还有很多创建工作。
    1、创建课程
    2、创建学生学生账号
    3、查看所有课程
    4、查看所有学生
    5、查看所有学生的选课情况
    讲师用户:
    1、查看所有课程
    2、选择所教课程
    3、查看所教课程
    4、删除所教课程
    '''
    from hashlib import md5
    import shelve  # 用来存储对象
    import logging  # 记录日志
    
    STUDENTOBJ = 'stu_obj'
    ADMINOBJ = 'admin_obj'
    TEACHEROBJ = 'teacher_obj'
    COURSEOBJ = 'course_obj'
    
    
    # 用来存储操作日志
    def my_log(logfile, partName, level):
        """
        :param logfile: 日志文件名
        :param partName: 项目名称,模块名称或者其他日志使用者
        :param level: 日志等级
        :return: logger object
    
        # CRITICAL = 50
        # FATAL = CRITICAL
        # ERROR = 40
        # WARNING = 30
        # WARN = WARNING
        # INFO = 20
        # DEBUG = 10
        # NOTSET = 0
        """
        # 多文件日志处理
        # 创建⼀个操作⽇志的对象logger(依赖FileHandler)
        file_handler = logging.FileHandler(logfile, 'a', encoding='utf-8')
        # 设置日志文件内容的格式
        file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s"))
        logger = logging.Logger(partName, level=level)
        logger.addHandler(file_handler)
        return logger
    
    
    # 用来将密码加密
    def encryption(pwd):
        """
        :param pwd: 密码
        :return: 密码加密后得到的md5值
        """
        flag = bytes('@#$%', encoding='utf8')
        if type(pwd) == type(str()):
            byte1 = flag + bytes(pwd, encoding='utf8') + flag
        # print(str(byte,'utf8'))
        elif type(pwd) == type(bytes()):
            byte1 = flag + pwd + flag
        else:
            raise Exception('必须是字符串或者字节')
        return md5(byte1).hexdigest()
    
    
    # 将对象存储
    def saveObj(filename, obj):
        """
        :param filename: 对象存储的文件名
        :param obj: 对象
        :return:
        """
        with shelve.open(filename) as f:
            if hasattr(obj, 'userName'):
                f[obj.userName] = obj
            elif hasattr(obj, 'name'):
                f[obj.name] = obj
    
    
    # 获取对象
    def getObj(filename, keyvalue=None):
        """
        :param filename: 对象存储的文件名
        :param keyvalue: 对象存的键
        :return: 如果keyvalue为None,以字典形式返回文件中所有对象,如果keyvalue不为None,返回文件中对应的对象,如果不存在,返回None
        """
        if keyvalue == None:
            dic = {}
            with shelve.open(filename) as f:
                for key in f:
                    dic[key] = f[key]
            return dic
        else:
            with shelve.open(filename) as f:
                if keyvalue in f:
                    return f[keyvalue]
                else:
                    return None
    
    
    class Person:
        def __init__(self, userName, pwd):
            self.userName = userName
            self.__pwd = encryption(pwd)
    
        def login(self, userName, pwd):
            if self.userName == userName and self.__pwd == encryption(pwd):
                return True
            return False
    
        def showAllCourses(self):
            return getObj(COURSEOBJ)
    
        def __repr__(self):
            return self.userName
    
    
    class Student(Person):
        def __init__(self, userName, pwd):
            super().__init__(userName, pwd)
            self.courses = []
    
        def __repr__(self):
            return '学生用户名:{}'.format(self.userName)
    
        # 查看选择的课程
        def showCourses(self):
            return self.courses
    
        # 选择课程
        def selectCourse(self, course):
            self.courses.append(course)
    
        # 删除课程
        def removeCourse(self, course):
            self.courses.remove(course)
    
    
    class Admin(Person):
        # 创建学生
        def createStudent(self, name, pwd):
            newStu = Student(name, pwd)
            saveObj(STUDENTOBJ, newStu)
            return True
    
        # 创建课程
        def createCourse(self, name):
            course = Course(name)
            saveObj(COURSEOBJ, course)
            return True
    
        # 查看所有学生
        def showAllStudents(self):
            return getObj(STUDENTOBJ)
    
    
    class Teacher(Person):
        def __init__(self, userName, pwd):
            super().__init__(userName, pwd)
            self.courses = []
    
        # 选择要教课程
        def selectCourse(self, course):
            self.courses.append(course)
            c = getObj(COURSEOBJ, course)
            c.setTeacher(self.userName)
            saveObj(COURSEOBJ, c)  # 更新
    
        # 查看所教的课程
        def showCourses(self):
            return self.courses
    
        # 删除所教课程
        def removeCourse(self, course):
            self.courses.remove(course)
            c = getObj(COURSEOBJ, course)
            c.setTeacher(None)
            saveObj(COURSEOBJ, c)  # 更新
    
    
    class Course:
        def __init__(self, name):
            self.name = name
            self.teacher = None
    
        def setTeacher(self, teacher):
            self.teacher = teacher
    
        def __repr__(self):
            return '课程名:{},讲师:{}'.format(self.name, self.teacher if self.teacher else '')
    
    # 主程序
    def main():
        print('欢迎来到felix选课系统!')
        while True:
            while True:
                num1 = input('请选择用户类型:1:学生  2:管理员  3:讲师  q:退出
    :')
                if num1 in ['1', '2', '3', 'q', 'Q']:
                    break
                else:
                    print('输入有误,请重新输入')
            if num1 == '1':
                while True:
                    while True:
                        numStu = input('欢迎进入学生系统:请选择要执行的操作(1,登录  2、注册  b、返回上一级)
    :').strip()
                        if numStu in ['1', '2', 'b', 'B']:
                            break
                        else:
                            print('输入有误,请重新输入')
                    if numStu == '2':
                        print('正在注册...')
                        while True:
                            userName = input('请输入用户名:')
                            if userName in getObj(STUDENTOBJ).keys():
                                print('用户名已存在,请重新输入')
                                continue
                            pwd = input('请输入密码:')
                            break
                        newStu = Student(userName, pwd)
                        saveObj(STUDENTOBJ, newStu)
                        print('注册成功')
                    elif numStu == '1':
                        print('正在登录...')
                        userName = input('请输入用户名:')
                        pwd = input('请输入密码:')
                        stu = getObj(STUDENTOBJ, userName)
                        if stu and stu.login(userName, pwd):
                            print('登录成功')
                            stulog = my_log('操作日志.log', 'stu-' + userName, 2)
                            stulog.log(2, '学生{}登录'.format(userName))
                            while True:
                                print('请选择需要执行的操作:')
                                while True:
                                    numlogin = input('1、查看所有课程  2、选择课程  3、查看所选课程  4、删除已选课程  b、返回上一级
    :')
                                    if numlogin in ['1', '2', '3', '4', 'b', 'B']:
                                        break
                                    else:
                                        print('输入有误,请重新输入')
                                if numlogin == '1':
                                    all_courses = stu.showAllCourses()
                                    print('当前的全部课程:{}'.format('' if all_courses else ''))
                                    for k, v in all_courses.items():
                                        print(v)
                                    stulog.log(2, '查看所有课程')
                                elif numlogin == '2':
                                    all_courses = stu.showAllCourses()
                                    print('目前有如下课程:{}'.format('' if all_courses else ''))
                                    if all_courses:
                                        for k, v in all_courses.items():
                                            print(v)
                                        else:
                                            print()
                                        while True:
                                            courseName = input('请输入您要选择的课程名:').strip()
                                            if courseName not in all_courses.keys():
                                                print('您输入的课程名不存在,请重新输入')
                                            else:
                                                break
                                        if courseName not in stu.showCourses():
                                            stu.selectCourse(courseName)
                                            saveObj(STUDENTOBJ, stu)  # 更新
                                            print('课程选择成功')
                                            stulog.log(2, '选择了{}课程'.format(courseName))
                                        else:
                                            print('课程已存在,不要重复选择')
                                    else:
                                        print('当前没有课程,不能选择')
                                elif numlogin == '3':
                                    print('当前已选择的课程有:{}'.format('' if stu.showCourses() else ''))
                                    for course in stu.showCourses():
                                        c = getObj(COURSEOBJ, course)
                                        print(c)
                                    stulog.log(2, '查看了已经选择的课程')
                                elif numlogin == '4':
                                    print('当前已选课程:{}'.format('' if stu.showCourses() else ''))
                                    if stu.showCourses():
                                        for course in stu.showCourses():
                                            print(course, end='    ')
                                        else:
                                            print()
                                        while True:
                                            delCourseName = input('请输入需要删除的课程名:').strip()
                                            if delCourseName in stu.showCourses():
                                                break
                                            else:
                                                print('您没有选择该课程,请重新输入')
                                        stu.removeCourse(delCourseName)
                                        saveObj(STUDENTOBJ, stu)  # 更新
                                        print('删除成功')
                                        stulog.log(2, '删除了{}课程'.format(delCourseName))
                                    else:
                                        print('当前没有选择课程,不能删除')
    
                                        # /////
                                elif numlogin.upper() == 'B':
                                    stulog.log(2, '学生退出')
                                    break
                        else:
                            print('账号或密码错误')
                    elif numStu.upper() == 'B':
                        break
            elif num1 == '2':
                while True:
                    while True:
                        numStu = input('欢迎进入管理员系统:请选择要执行的操作(1,登录  2、注册  b、返回上一级)
    :')
                        if numStu in ['1', '2', 'b', 'B']:
                            break
                        else:
                            print('输入有误,请重新输入')
                    if numStu == '2':
                        print('正在注册...')
                        while True:
                            userName = input('请输入用户名:')
                            if userName in getObj(ADMINOBJ).keys():
                                print('用户名已存在,请重新输入')
                                continue
                            pwd = input('请输入密码:')
                            break
                        newAdmin = Admin(userName, pwd)
                        saveObj(ADMINOBJ, newAdmin)
                        print('注册成功')
                    elif numStu == '1':
                        print('正在登录...')
                        userName = input('请输入用户名:')
                        pwd = input('请输入密码:')
                        admin = getObj(ADMINOBJ, userName)
                        if admin and admin.login(userName, pwd):
                            print('登录成功')
                            adminlog = my_log('操作日志.log', 'admin-' + userName, 2)
                            adminlog.log(2, '管理员{}登录'.format(userName))
                            while True:
                                print('请选择要执行的操作:')
                                while True:
                                    numlogin = input('1、创建课程  2、创建学生学生账号  3、查看所有课程  4、查看所有学生  5、查看所有学生的选课情况  b、返回上一级
    :')
                                    if numlogin in ['1', '2', '3', '4', '5', 'b', 'B']:
                                        break
                                    else:
                                        print('输入有误,请重新输入')
                                if numlogin == '1':
                                    while True:
                                        courseName = input('请输入课程名称:')
                                        if courseName in getObj(COURSEOBJ).keys():
                                            print('课程已存在,请重新输入')
                                            continue
                                        break
                                    admin.createCourse(courseName)
                                    print('课程创建成功')
                                    adminlog.log(2, '创建了{}课程'.format(courseName))
                                elif numlogin == '2':
                                    print('正在创建学生账号...')
                                    while True:
                                        userName = input('请输入学生用户名:')
                                        if userName in getObj(STUDENTOBJ).keys():
                                            print('用户名已存在,请重新输入')
                                            continue
                                        pwd = input('请输入密码:')
                                        break
                                    admin.createStudent(userName, pwd)
                                    print('学生账号创建成功')
                                    adminlog.log(2, '创建了{}学生'.format(userName))
                                elif numlogin == '3':
                                    all_courses = admin.showAllCourses()
                                    print('当前的全部课程:{}'.format('' if all_courses else ''))
                                    for k, v in all_courses.items():
                                        print(v)
                                    adminlog.log(2, '查看了当前的全部课程')
                                elif numlogin == '4':
                                    all_student = admin.showAllStudents()
                                    for k, v in all_student.items():
                                        print(v)
                                    adminlog.log(2, '查看了当前全部学生')
                                elif numlogin == '5':
                                    all_student = admin.showAllStudents()
                                    for k, v in all_student.items():
                                        print('学生用户名:{},选择的课程:{}'.format(str(k),
                                                                         str(v.showCourses() if v.showCourses() else '')))
                                    adminlog.log(2, '查看了全部学生的选课信息')
                                elif numlogin.upper() == 'B':
                                    adminlog.log(2, '管理员退出')
                                    break
                        else:
                            print('账号或密码错误')
                    elif numStu.upper() == 'B':
                        break
            elif num1 == '3':
                while True:
                    while True:
                        numStu = input('欢迎进入讲师系统:请选择要执行的操作(1,登录  2、注册  b、返回上一级)
    :')
                        if numStu in ['1', '2', 'b', 'B']:
                            break
                        else:
                            print('输入有误,请重新输入')
                    if numStu == '2':
                        print('正在注册...')
                        while True:
                            userName = input('请输入用户名:')
                            if userName in getObj(TEACHEROBJ).keys():
                                print('用户名已存在,请重新输入')
                                continue
                            pwd = input('请输入密码:')
                            break
                        newTeacher = Teacher(userName, pwd)
                        saveObj(TEACHEROBJ, newTeacher)
                        print('注册成功')
                    elif numStu == '1':
                        print('正在登录...')
                        userName = input('请输入用户名:')
                        pwd = input('请输入密码:')
                        teacher = getObj(TEACHEROBJ, userName)
                        if teacher and teacher.login(userName, pwd):
                            print('登录成功')
                            teacherlog = my_log('操作日志.log', 'teacher-' + userName, 2)
                            teacherlog.log(2, '讲师{}登录'.format(userName))
                            while True:
                                print('请选择需要执行的操作:')
                                while True:
                                    numlogin = input('1、查看所有课程  2、选择所教课程  3、查看所教课程  4、删除所教课程  b、返回上一级
    :')
                                    if numlogin in ['1', '2', '3', '4', 'b', 'B']:
                                        break
                                    else:
                                        print('输入有误,请重新输入')
                                if numlogin == '1':
                                    all_courses = teacher.showAllCourses()
                                    print('当前的全部课程:{}'.format('' if all_courses else ''))
                                    for k, v in all_courses.items():
                                        print(v)
                                    teacherlog.log(2, '查看了所有课程')
                                elif numlogin == '2':
                                    all_courses = teacher.showAllCourses()
                                    print('目前有如下课程:{}'.format('' if all_courses else ''))
                                    if all_courses:
                                        for k, v in all_courses.items():
                                            print(v)
                                        else:
                                            print()
                                        while True:
                                            courseName = input('请输入您要教的课程名:').strip()
                                            if courseName not in all_courses.keys():
                                                print('您输入的课程名不存在,请重新输入')
                                            else:
                                                break
                                        if courseName not in teacher.showCourses():
                                            teacher.selectCourse(courseName)
                                            saveObj(TEACHEROBJ, teacher)  # 更新
                                            print('课程选择成功')
                                            teacherlog.log(2, '选择了教{}课程'.format(courseName))
                                        else:
                                            print('您已选择该课程,不能重复选择')
                                    else:
                                        print('当前没有课程,无法选择')
                                elif numlogin == '3':
                                    print('当前已选择的课程有:{}'.format('' if teacher.showCourses() else ''))
                                    for course in teacher.showCourses():
                                        c = getObj(COURSEOBJ, course)
                                        print(c)
                                    teacherlog.log(2, '查看了当前选择的课程')
                                elif numlogin == '4':
                                    print('当前已选课程:{}'.format('' if teacher.showCourses() else ''))
                                    if teacher.showCourses():
                                        for course in teacher.showCourses():
                                            print(course, end='    ')
                                        else:
                                            print()
                                        while True:
                                            delCourseName = input('请输入需要删除的课程名:').strip()
                                            if delCourseName in teacher.showCourses():
                                                break
                                            else:
                                                print('您没有选择该课程,请重新输入')
                                        teacher.removeCourse(delCourseName)
                                        saveObj(STUDENTOBJ, teacher)  # 更新
                                        print('删除成功')
                                        teacherlog.log(2, '取消了教{}课程'.format(delCourseName))
                                    else:
                                        print('当前没有教的课程,不能删除')
                                elif numlogin.upper() == 'B':
                                    teacherlog.log(2, '讲师退出')
                                    break
                        else:
                            print('账号或密码错误')
                    elif numStu.upper() == 'B':
                        break
            elif num1.upper() == 'Q':
                print('感谢使用felix选课系统,欢迎下次使用!')
                break
    
    
    if __name__ == '__main__':
        try:
            main()
        except Exception as e:
            print('发生未知错误,请联系管理员改进')
  • 相关阅读:
    vue源码中的检测方法
    Node.js中Streams
    5_PHP数组_3_数组处理函数及其应用_6_数组检索函数
    5_PHP数组_3_数组处理函数及其应用_8_数组与数据结构
    5_PHP数组_3_数组处理函数及其应用_7_数组排列函数
    5_PHP数组_3_数组处理函数及其应用_1_快速创建数组的函数
    5_PHP数组_3_数组处理函数及其应用_2_数组统计函数
    5_PHP数组_3_数组处理函数及其应用_3_数组指针函数
    5_PHP数组_3_数组处理函数及其应用_4_数组和变量间的转换函数
    4_PHP流程控制语句_3_程序跳转和终止语句
  • 原文地址:https://www.cnblogs.com/felixwang2/p/9755757.html
Copyright © 2011-2022 走看看