选课系统程序(tank)

作业要求:选课系统
角色:学校、学生、课程、讲师 ----四个类定义
要求:

1. 创建北京、上海 2 所学校
    -----创建学校功能,School学校类产生学校对象
        1)学校包含学校名称,地址等属性
        ----------学校类属性-对象自定义属性
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
    -----课程类产生课程对象,三个课程对象
        2) 课程包含课程名称(周期,价格等属性)
        ----------课程类属性-对象自定义属性
管理员视图:3. 管理员创建学校,老师,课程
    		-----管理员功能,控制对象产生
学生视图:4. 可以注册,学生注册登录后,可以选择学校,选择课程,查看成绩
		 ----------学生对象绑定学校和课程
老师视图:5. 老师登录后,可以查看教授课程,选择想要教授的课程,查看课程下的学生,修改学生成绩等
		 ----------老师对象绑定学校和课程,修改学生成绩功能

上面的操作产生的数据都通过pickle序列化保存到文件里,可以帮我们保存对象。 


1.需求分析
    管理视图,创建讲师, 创建班级,创建课程
        1、注册
        2、登录
        3、创建学校
        4、创建老师
        5、创建课程(先选择学校)
    学生视图
        1、注册
        2、登录
        3、选择校区
        4、选择课程
            学生选择课程,课程选择学生,双向选择。
        5、查看成绩
    老师视图
        1、登录
        2、查看教授课程
        3、选择教授课程
        4、查看课程下学生
        5、修改学生成绩
2.程序的架构设计
    -三层架构
        -用户视图层(web框架:MVC,MVVT) 
            用于与用户进行交互
            小的逻辑判断,比如注册功能中两次密码是否一致的校验
            core
                -src.py 主视图
                -admin视图
                -student视图
                -teacher视图
        -逻辑接口层
            核心业务逻辑处理
            interface
                -admin.py
                -student.py
                -teacher.py
        -做数据处理,比如数据的增、删、查、改
            db
            -db_handler.py
            -models.py(存放所有类)

3.分任务开发
4.测试
5.线上

总共分三个视图:
    管理员视图:
        def admin_register():
            pass
        def admin_login():
            pass
        def creat_school():
            pass
        def creat_teacher():
            pass
        def creat_course():
            pass
    老师视图:
        def teacher_login():
            pass
        def check_course():
            pass
        def choose_course():
            pass
        def check_student():
            pass
        def modify_score():
            pass
    学生视图:
        def student_register():
            pass
        def student_login():
            pass
        def choose_school():
            pass
        def choose_course():
            pass
        def check_score():
            pass


conf放置配置信息setting
core:放置用户层视图
db:数据操作层py文件和以文件形式保存的数据
interface:放置接口相关信息,有管理员接口,老师接口,学校接口,学生接口和公共接口
lib:放置公共方法


用户功能层:src下:
                src:主视图,
                admin:管理员视图,
                student:学生视图
                teacher:老师视图

接口层:interface下:
                  admin_interface管理员的接口
                  common_interface公共的接口
                  school_interface学校的接口
                  student_interface学生的接口
                  teacher_interface老师的接口
数据层:db目录下:
                db_handler,文件操作相关的方法
                models:各种类及类方法的定义

                其它目录:admin,course,school,student,teacher是自动生成的目录,用来存放数据信息

start.py启动文件

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200817111944966.png#pic_center
1.start.py

import os
import sys

sys.path.append(os.path.dirname(__file__))
from core import src

if __name__ == '__main__':
    src.run()

2.src.py

'''
这是用户视图层主视图
'''
from core import admin, student, teacher

func_dic = {
    '1': admin.admin_view,
    '2': student.student_view,
    '3': teacher.teacher_view,
}


def run():
    while True:
        print('''
        =======欢迎来到选课系统=======
               1.管理员功能
               2.学生功能
               3.老师功能
        ============end============''')
        choice = input('请输入功能编号:').strip()

        if choice not in func_dic:
            print('输入有误,请重新输入:')
            continue
        func_dic[choice]()

3.admin.py

'''
管理员视图
'''
from interface import admin_interface
from interface import common_interface
from lib import common

admin_info = {
    'user': None
}


def register():
    while True:
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        repassword = input('请确认密码:').strip()
        if password == repassword:
            flag, msg = admin_interface.admin_register_interface(username, password)
            if flag:
                print(msg)
                break
            else:
                print(msg)
        else:
            print('两次密码不一致,请重新输入!')


def login():
    while True:
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        flag, msg = common_interface.login_interface(
            username, password,user_type='admin')
        if flag:
            print(msg)
            admin_info['user'] = username
            break
        else:
            print(msg)


@common.auth('admin')
def create_school():
    while True:
        school_name = input('请输入学校名称:').strip()
        school_addr = input('请输入学校地址:').strip()
        flag, msg = admin_interface.create_school_interface(
            school_name, school_addr, admin_info['user'])
        if flag:
            print(msg)
            break
        else:
            print(msg)


@common.auth('admin')
def create_course():
    while True:
        flag, school_list_or_msg = common_interface.get_all_school_interface()
        if not flag:
            print(school_list_or_msg)
            break
        for index, school_name in enumerate(school_list_or_msg):
            print(f'编号:{index}     学校名:{school_name}')
        choice = input('请输入学校编号:').strip()
        if not choice.isdecimal():
            print('请输入数字')
            continue
        choice = int(choice)
        if choice not in range(len(school_list_or_msg)):
            print('请输入正确编号!')
        school_name = school_list_or_msg[choice]
        course_name = input('请输入需要创建的课程名称:').strip()
        flag, msg = admin_interface.create_course_interface(school_name, course_name, admin_info['user'])
        if flag:
            print(msg)
            break
        else:
            print(msg)


@common.auth('admin')
def create_teacher():
    while True:
        teacher_name = input('请输入老师的名字:').strip()
        flag, msg = admin_interface.create_teacher_interface(
            teacher_name, admin_info['user']
        )
        if flag:
            print(msg)
            break
        else:
            print(msg)


func_dic = {
    '1': register,
    '2': login,
    '3': create_school,
    '4': create_course,
    '5': create_teacher,
}


def admin_view():
    while True:
        print('''
        1、注册
        2、登录
        3、创建学校
        4、创建课程
        5、创建老师
        ''')
        choice = input('请输入功能编号:').strip()
        if choice == 'q':
            break
        if choice not in func_dic:
            print('输入有误,请重新输入:')
            continue
        func_dic[choice]()

4.admin_interface.py

'''
管理员注册接口
'''
from db import model


def admin_register_interface(username, password):
    admin_obj = model.Admin.select(username)
    if admin_obj:
        return False, '用户已存在!'
    else:
        admin_obj = model.Admin(username, password)
        admin_obj.save()
        return True, '用户注册成功!'

#修改为通用接口
# def admin_login_interface(username, password):
#     admin_obj = model.Admin.select(username)
#     if not admin_obj:
#         return False, '用户不存在!'
#     if password == admin_obj.password:
#         return True, '登录成功!'
#     else:
#         return False, '密码错误!'


def create_school_interface(school_name, school_addr, admin_info):
    school_obj = model.School.select(school_name)
    admin_obj = model.Admin.select(admin_info)
    if school_obj:
        return False, '学校已存在!'
    else:
        school_obj = admin_obj.create_school(school_name, school_addr)
        school_obj.save()
        return True, f'{school_name}学校建立成功!'


def create_course_interface(school_name, course_name, admin_name):
    school_obj = model.School.select(school_name)
    if course_name in school_obj.course_list:
        return False, '当前课程已存在!'
    admin_obj = model.Admin.select(admin_name)
    admin_obj.create_course(school_obj, course_name)
    return True, f'{course_name}课程创建成功,绑定给{school_name}校区'


def create_teacher_interface(teacher_name, admin_name, teacher_pwd=123):
    teacher_obj = model.Teacher.select(teacher_name)
    if teacher_obj:
        return False, '老师已存在!'
    admin_obj = model.Admin.select(admin_name)
    admin_obj.create_teacher(teacher_name, teacher_pwd)
    return True, f'{teacher_name}老师创建成功!'

5.model.py

'''
用于存放类 学校类、学员类、课程类、讲师类、管理员类
'''
from db import db_handler


class Base:
    @classmethod
    def select(cls, username):
        obj = db_handler.select_data(cls, username)
        return obj

    def save(self):
        db_handler.save_data(self)


class Admin(Base):
    def __init__(self, username, password):
        self.user = username
        self.password = password

    def create_school(self, school_name, school_addr):
        school_obj = School(school_name, school_addr)
        return school_obj

    def create_course(self, school_obj, course_name):
        course_obj = Course(course_name)
        course_obj.save()
        school_obj.course_list.append(course_name)
        school_obj.save()

    def create_teacher(self, teacher_name, teacher_pwd):
        teacher_obj = Teacher(teacher_name, teacher_pwd)
        teacher_obj.save()


class School(Base):
    def __init__(self, school_name, school_addr):
        self.user = school_name
        self.addr = school_addr
        self.course_list = []


class Student(Base):
    def __init__(self, username, password):
        self.user = username
        self.password = password
        self.school = None
        self.course_list = []
        self.score_dict = {}

    def add_school(self, school_name):
        self.school = school_name
        self.save()

    def add_course(self, course_name):
        self.course_list.append(course_name)
        self.score_dict[course_name] = 0
        self.save()
        course_obj = Course.select(course_name)
        course_obj.student_list.append(self.user)
        course_obj.save()


class Course(Base):
    def __init__(self, course_name):
        self.user = course_name
        self.student_list = []


class Teacher(Base):
    def __init__(self, teacher_name, teacher_pwd):
        self.user = teacher_name
        self.password = teacher_pwd
        self.course_list = []

    def show_course(self):
        return self.course_list

    def add_course(self, course_name):
        self.course_list.append(course_name)
        self.save()

    def get_student(self, course_name):
        course_obj = Course.select(course_name)
        return course_obj.student_list

    def change_score(self,course_name,student_name,score):
        student_obj = Student.select(student_name)
        student_obj.score_dict[course_name]=score
        student_obj.save()


6.db_handler.py

import pickle
import os
from conf import settings


def save_data(obj):
    class_name = obj.__class__.__name__
    user_dir_path = os.path.join(
        settings.db_path, class_name
    )
    if not os.path.exists(user_dir_path):
        os.mkdir(user_dir_path)
    user_path = os.path.join(user_dir_path, obj.user)
    with open(user_path, mode='wb')as f:
        pickle.dump(obj, f)


def select_data(cls, username):
    class_name = cls.__name__
    user_dir_path = os.path.join(
        settings.db_path, class_name
    )
    if not os.path.exists(user_dir_path):
        os.mkdir(user_dir_path)
    user_path = os.path.join(user_dir_path, username)
    if os.path.exists(user_path):
        with open(user_path, mode='rb')as f:
            obj = pickle.load(f)
            return obj
    return None

7.settings

import os
import sys

base_path = os.path.dirname(os.path.dirname(__file__))
db_path = os.path.join(base_path, 'db')

8.common

'''
公共方法
'''


# 登录认证装饰器

def auth(role):
    '''
    :param role: 角色:管理员、老师,学生
    :return:
    '''
    from core import admin, teacher, student
    def login_auth(func):
        def wrapper(*args, **kwargs):
            if role == 'admin':
                if admin.admin_info['user']:
                    res = func(*args, **kwargs)
                    return res
                else:
                    admin.login()
            elif role == 'student':
                if student.student_info['user']:
                    res = func(*args, **kwargs)
                    return res
                else:
                    student.login()
            elif role == 'teacher':
                if teacher.teacher_info['user']:
                    res = func(*args, **kwargs)
                    return res
                else:
                    teacher.login()
            else:
                print('当前视图没有权限!')
        return wrapper

    return login_auth

9.student

'''
学生视图
'''
from lib import common
from interface import student_interface
from interface import common_interface

student_info = {
    'user': None
}


def register():
    while True:
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        repassword = input('请确认密码:').strip()
        if password == repassword:
            flag, msg = student_interface.student_register_interface(username, password)
            if flag:
                print(msg)
                break
            else:
                print(msg)
        else:
            print('两次密码不一致,请重新输入!')


def login():
    while True:
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        flag, msg = common_interface.login_interface(
            username, password, user_type='student')
        if flag:
            print(msg)
            student_info['user'] = username
            break
        else:
            print(msg)
            break

@common.auth('student')
def choice_school():
    while True:
        flag, school_list_or_msg = common_interface.get_all_school_interface()
        if not flag:
            print(school_list_or_msg)
            break
        for index, school_name in enumerate(school_list_or_msg):
            print(f'编号:{index}     学校名:{school_name}')
        choice = input('请输入学校编号:').strip()
        if not choice.isdecimal():
            print('请输入数字')
            continue
        choice = int(choice)
        if choice not in range(len(school_list_or_msg)):
            print('请输入正确编号!')
            continue
        school_name = school_list_or_msg[choice]
        flag, msg = student_interface.add_school_interface(
            school_name, student_info['user'])
        if flag:
            print(msg)
            break
        else:
            print(msg)
            break


@common.auth('student')
def choice_course():
    while True:
        flag, course_list = student_interface.get_course_list_interface(student_info['user'])
        if not flag:
            print(course_list)
            break
        for index, school_name in enumerate(course_list):
            print(f'编号:{index}     课程名:{school_name}')
        choice = input('请输入课程编号:').strip()
        if not choice.isdecimal():
            print('请输入数字')
            continue
        choice = int(choice)
        if choice not in range(len(course_list)):
            print('请输入正确编号!')
            continue
        course_name = course_list[choice]
        flag, msg = student_interface.add_course_interface(
            course_name, student_info['user'])
        if flag:
            print(msg)
            break
        else:
            print(msg)
            break


@common.auth('student')
def check_score():
    score_dict= student_interface.check_score_interface(
        student_info['user'])
    if not score_dict:
        print('没有选择课程!')
    print(score_dict)

func_dic = {
    '1': register,
    '2': login,
    '3': choice_school,
    '4': choice_course,
    '5': check_score,
}


def student_view():
    while True:
        print('''
        1、注册
        2、登录
        3、选择校区
        4、选择课程
        5、查看成绩
        ''')
        choice = input('请输入功能编号:').strip()
        if choice == 'q':
            break
        if choice not in func_dic:
            print('输入有误,请重新输入:')
            continue
        func_dic[choice]()

10.student_interface

'''
学生接口层
'''
from db import model


def student_register_interface(username, password):
    student_obj = model.Student.select(username)
    if student_obj:
        return False, '学生用户已存在!'
    else:
        student_obj = model.Student(username, password)
        student_obj.save()
        return True, '用户注册成功!'


# 修改为通用接口
# def student_login_interface(username, password):
#     student_obj = model.Student.select(username)
#     if not student_obj:
#         return False, '用户不存在!'
#     if password == student_obj.password:
#         return True, '登录成功!'
#     else:
#         return False, '密码错误!'

def add_school_interface(school_name, student_name):
    student_obj = model.Student.select(student_name)
    if student_obj.school:
        return False, '当前学生已经选择过学校!!'
    else:
        student_obj.add_school(school_name)
        return True, '选择学校成功!'


def get_course_list_interface(student_name):
    student_obj = model.Student.select(student_name)
    school_name = student_obj.school
    if student_obj.school:
        school_obj = model.School.select(school_name)
        if school_obj.course_list:
            return True, school_obj.course_list
        else:
            return False, '没有课程,请先联系管理员创建'
    else:
        return False, '没有学校,请先选择学校!'


def add_course_interface(course_name, student_name):
    student_obj = model.Student.select(student_name)
    if course_name in student_obj.course_list:
        return False, '当前学生已经选择过该课程!!'
    else:
        student_obj.add_course(course_name)
        return True, f'课程{course_name}添加成功!'


def check_score_interface(student_name):
    student_obj = model.Student.select(student_name)
    if student_obj.score_dict:
        return student_obj.score_dict

11.teacher

'''
老师视图
'''
from lib import common
from interface import common_interface
from interface import teacher_interface

teacher_info = {
    'user': None
}


def login():
    while True:
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        flag, msg = common_interface.login_interface(
            username, password, user_type='teacher')
        if flag:
            print(msg)
            teacher_info['user'] = username
            break
        else:
            print(msg)


@common.auth('teacher')
def check_course():
    flag, course_list = teacher_interface.check_course_interface(
        teacher_info['user'])
    if flag:
        print(course_list)
    else:
        print(course_list)


@common.auth('teacher')
def choose_course():
    while True:
        flag, school_list_or_msg = common_interface.get_all_school_interface()
        if not flag:
            print(school_list_or_msg)
            break
        for index, school_name in enumerate(school_list_or_msg):
            print(f'编号:{index}     学校名:{school_name}')
        choice = input('请输入学校编号:').strip()
        if not choice.isdecimal():
            print('请输入数字')
            continue
        choice = int(choice)
        if choice not in range(len(school_list_or_msg)):
            print('请输入正确编号!')
            continue
        school_name = school_list_or_msg[choice]
        flag2, course_list = common_interface.get_course_in_school_interface(school_name)
        if not flag2:
            print(course_list)
            break
        for index2, course_name in enumerate(course_list):
            print(f'编号:{index2}     课程名:{course_name}')
        choice2 = input('请输入课程编号:').strip()
        if not choice2.isdecimal():
            print('请输入数字')
            continue
        choice2 = int(choice2)
        if choice2 not in range(len(course_list)):
            print('请输入正确编号!')
            continue
        course_name = course_list[choice2]
        flag3, msg = teacher_interface.add_course_interface(course_name, teacher_info['user'])
        if flag3:
            print(msg)
            break
        else:
            print(msg)


@common.auth('teacher')
def check_student():
    while True:
        flag, course_list = teacher_interface.check_course_interface(
            teacher_info['user'])
        if not flag:
            print(course_list)
            break
        for index, course_name in enumerate(course_list):
            print(f'编号:{index}     课程名:{course_name}')
        choice = input('请输入课程编号:').strip()
        if not choice.isdecimal():
            print('请输入数字')
            continue
        choice = int(choice)
        if choice not in range(len(course_list)):
            print('请输入正确编号!')
            continue
        course_name = course_list[choice]
        flag2, student_list = teacher_interface.get_student_interface(course_name, teacher_info['user'])
        if flag2:
            print(student_list)
            break
        else:
            print(student_list)
            break


@common.auth('teacher')
def change_score():
    while True:
        flag, course_list = teacher_interface.check_course_interface(
            teacher_info['user'])
        if not flag:
            print(course_list)
            break
        for index, course_name in enumerate(course_list):
            print(f'编号:{index}     课程名:{course_name}')
        choice = input('请输入课程编号:').strip()
        if not choice.isdecimal():
            print('请输入数字')
            continue
        choice = int(choice)
        if choice not in range(len(course_list)):
            print('请输入正确编号!')
            continue
        course_name = course_list[choice]
        flag2, student_list = teacher_interface.get_student_interface(course_name, teacher_info['user'])
        if not flag2:
            print(student_list)
            break
        for index2, student_list in enumerate(student_list):
            print(f'编号{index2}  学生名:{student_list}')

        choice2 = input('请输入学生编号:').strip()
        if not choice2.isdecimal():
            print('请输入数字')
            continue
        choice2 = int(choice2)
        if choice2 not in range(len(student_list)):
            print('请输入正确编号!')
            continue
        student_name = student_list[choice2]
        score = input('请输入需要修改的成绩:').strip()
        if not score.isdecimal():
            continue
        score = int(score)
        flag3, msg = teacher_interface.change_score_interface(
            course_name, student_name, score, teacher_info['user'])
        if flag3:
            print(msg)
            break


func_dic = {
    '1': login,
    '2': check_course,
    '3': choose_course,
    '4': check_student,
    '5': change_score,
}


def teacher_view():
    while True:
        print('''
        1、登录
        2、查看教授课程
        3、选择教授课程
        4、查看课程学生
        5、修改学生成绩
        ''')
        choice = input('请输入功能编号:').strip()
        if choice == 'q':
            break
        if choice not in func_dic:
            print('输入有误,请重新输入:')
            continue
        func_dic[choice]()

12.teacher_interface

'''
老师接口层
'''
from db import model


def check_course_interface(teacher_name):
    teacher_obj = model.Teacher.select(teacher_name)
    # course_list = teacher_obj.course_list
    course_list = teacher_obj.show_course()
    if not course_list:
        return False, '老师没有选择课程'
    return True, course_list


def add_course_interface(course_name, teacher_name):
    teacher_obj = model.Teacher.select(teacher_name)
    course_list = teacher_obj.course_list
    if course_name in course_list:
        return False, '该课程已存在!'
    teacher_obj.add_course(course_name)
    return True, '添加课程成功!'


def get_student_interface(course_name, teacher_name):
    teacher_obj = model.Teacher.select(teacher_name)
    student_list = teacher_obj.get_student(course_name)
    if not student_list:
        return False,'学生没有选择该课程!'
    return True,student_list

def change_score_interface(
        course_name,student_name,score,teacher_name):
    teacher_obj = model.Teacher.select(teacher_name)
    teacher_obj.change_score(course_name,student_name,score)
    return True,'修改分数成功!'

13.common_interface

'''
公共接口
'''
import os
from conf import settings
from db import model


def get_all_school_interface():
    school_dir = os.path.join(settings.db_path, 'School')
    if not os.path.exists(school_dir):
        return False, '没有学校,请先联系管理员!'
    school_list = os.listdir(school_dir)
    return True, school_list


def login_interface(username, password, user_type):
    if user_type == 'admin':
        obj = model.Admin.select(username)
    elif user_type == 'student':
        obj = model.Student.select(username)
    elif user_type == 'teacher':
        obj = model.Teacher.select(username)
    else:
        return False, '登录角色不对,请输入正确的角色'
    if obj:
        if password == obj.password:
            return True, '登录成功!'
        else:
            return False, '密码错误!'
    else:
        return False, '用户不存在!'


def get_course_in_school_interface(school_name):
    school_obj = model.School.select(school_name)
    course_list = school_obj.course_list
    if not course_list:
        return False, '该学校没有课程!'
    return True, course_list

//需求分析:写一个较为严谨的学生选课系统,实现学生可以选择多门选课课程,并将有效选课结果保存到数据库。学生需要登录后,才能选课。让学生可以在选课系统通过多种方式查询到要选的课程信息。 //选课规则:1、每个学生可以选多门课程,多次选课的总学分不能超过6学分;2、不能重复选择一门课程;3、每一门课程的选课人数都有数量限制,当某门课程的选课名额满时,则应另选课程。4、凭用户名和密码登录,通过提交某一课程号来选课 //总体设计方案:建立三个类:登录类register,选课类studentChooseCourse,数据库工具类JDBCUtil;一个SQL脚本文件用于生成数据库表结构和初始记录,以搭建数据库环境。 登录类register类,负责对用户的身份进行验证;工具类JDBCUtil用于实现连接,你可调用JDBCUtil的getConnection()方法等到链接。 选课类studentChooseCourse用于,实现选课功能。其中包括几个主要方法: 1、actionPerformed(ActionEvent) 用于监听用户“查询”和“提交”操作,并负责调用各种方法对其进行处理 2、createSearchCourse()用于产生图形用户界面 3、processBeforeCommit()用于对用户的“提交”查找进行验证,剔除无效的用户操作 4、tryCommit()负责对有效的“提交”操作,进一步处理,并将有效的操作结果时时保存到数据库,并更新数据库原有信息 //本程序用到的知识点:数据库连接JDBC;SQL建表、插入输入、动态查询;图形用户界面的产生以及处理查询结果集并较好显示;程序设计基础知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值