Title

阶段测评'选课系统'

'''
角色:学校、学生、课程、讲师
要求:
  1. 创建北京、上海 2 所学校
  2. 创建linux , python , go 3个课程 , linux\py在北京开,go在上海开
  3. 管理员创建学校 ,老师,课程
  4. 学校包含学校名称,地址等属性
  5. 学生注册登录后,可以选择学校,选择课程,查看成绩
  6. 学生只能选择一所学校,从校区中选择一门课程,课程绑定给学生。
  7. 老师登录后,可以查看教授课程,选择想要教授的课程,查看课程下的学生,修改学生成绩等

最终分为以下视图和功能:
学生视图
        1、注册
        2、登录
        3、选择校区
        4、选择课程
        5、查看成绩

老师视图
        1、登录
        2、查看教授课程
        3、选择教授课程
        4、查看课程下学生
        5、修改学生成绩

管理视图,创建讲师, 创建班级,创建课程
        1、注册
        2、登录
        3、创建学校
        4、创建老师
        5、创建课程
'''


'''
程序的架构一共分为三层:

    - 1.用户视图层

    - 2.接口层

    - 3.数据层
         - models ---> 用于把数据封装在对象中
         - db_handler ---> 把对象通过pickle的形式进行存储
'''
'''
conf放置配置信息setting
core:放置用户层视图
db:数据操作层py文件和以文件形式保存的数据,通过pickle把数据序列化保存到文件里。
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启动文件

总共分三个视图:
    管理员视图:
        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
'''

具体项目程序

bin/start

import os
import sys
from core import src

sys.path.append(
    os.path.dirname(__file__)
)


print([i ** i for i in range(3)])

if __name__ == '__main__':

    src.run()

conf/settings

# 配置储存文件的地址

import os

DATE_PATH = os.path.dirname(os.path.dirname(__file__))
# 拼接db地址
DB_PATH = os.path.join(DATE_PATH, 'db')

core/src/admin_view/student_view/teacher_view

# src
"""
总视图
"""
from core import admin_view
from core import student_view
from core import teacher_view

func_dic = {
    "1": admin_view.view,
    "2": student_view.view,
    "3": teacher_view.view,
}


def run():
    while True:
        print('''
        =====欢迎来到老男孩选课系统=====
        1.管理员界面
        2.学生界面
        3.老师界面
        4.退出界面(q)
        ''')
        choice = input('请输入相对应编号进入操作界面').strip()
        if choice == 'q':
            break
        if choice not in func_dic:
            print('编号输入有误,请重新输入')
            continue
        func_dic.get(choice)()


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

admin_info = {
    'user_name': None
}


# 注册功能
def register():
    while True:
        username = input('请输入管理员用户名:').strip()
        password = input('请输入管理员密码:').strip()
        re_password = input('请确认管理员密码:').strip()  # 校验两次密码是否一致
        if password == re_password:
            # 调用管理员注册接口
            flag, msg = admin_interface.register_interface(username, password)
            if flag:
                print(msg)
                choice = input('输入q退出注册或任意字符继续注册').strip()
                if choice == 'q':
                    break
                else:
                    print('继续注册')
                continue
            else:
                print(msg)
        else:
            print('两次密码不一致')

# 登陆功能
def login():
    while True:
        username = input('请输入管理员用户名:').strip()
        password = input('请输入管理员密码:').strip()

        # 调用公共登陆接口
        flag, msg = common_interface.login_interface(username, password, 'admin')
        if flag:
            admin_info['user_name'] = username
            print(msg)
            break
        else:
            print(msg)
            choice = input('q退出或任意字符重新登陆').strip()
            if choice == 'q':
                break
            else:
                print('重新登陆')

# 转公共方法设置公共登陆认证


# 创建学校功能
@common.login_auth('admin')
def creat_school():
    while True:
        # 管理员输入 学校名称 与 学校地址
        school_name = input('请输入学校名称:').strip()
        school_addr = input('请输入学校地址:').strip()

        # 调用学校接口,并传入 学校名称和 学校地址, 以及管理员民称(管理员名称是为了获取管理员对象
        # 并调用管理员类的创建学校方法)

        flag, msg = admin_interface.creat_school_interface(
            school_name, school_addr, admin_info.get('user_name'))

        if flag:
            print(msg)
            bank = input('请输入q返回界面或任意字符继续创建:').strip()
            if bank == 'q':
                break
            continue
        else:
            print(msg)


# 创建课程功能
@common.login_auth('admin')
def creat_course():
    while True:
        # 先获取所有的学校,让管理员选择
        # 判断是否有学校
        school_list = common_interface.check_school_interface()
        if not school_list:
            print('没有可选择的学校,请先创建学')
            choice = input('输入y创建学校,任意键退出:').strip()
            if choice == 'y':
                return creat_school
            else:
                break
        # 拿到列表元素的序号和名字
        for index, school_name in enumerate(school_list):
            print(index, school_name)
        choice = input('请输入选择的学校编号: ').strip()
        if not choice.isdigit():
            print('输入编号有误')
            continue
        choice = int(choice)
        if choice not in range(len(school_list)):
            print('输入编号有误')
            continue
        school_name = school_list[choice]
        # 选择完学校后,输入课程名字
        course_name = input('请输入课程名称: ').strip()
        # 调用创建课程接口,保存课程对象
        flag, msg = admin_interface.creat_course(school_name, course_name, admin_info.get('user_name'))
        if flag:
            print(msg)
            choose = input('输入y继续添加课程,任意字符退出:').strip()
            if choose == 'y':
                continue
            break
        else:
            print(msg)


# 创建老师功能
@common.login_auth('admin')
def creat_teacher():
    while True:
        teacher_name = input('请输入老师名称:').strip()
        # 调用创建接口,保存老师信息
        flag, msg = admin_interface.create_teacher_interface(
            teacher_name, admin_info.get('user_name'))
        if flag:
            print(msg)
            bank = input('请输入q返回界面或任意字符继续添加老师:')
            if bank == 'q':
                break
            continue
        else:
            print(msg)

func_dic = {
    '1': register,
    '2': login,
    '3': creat_school,
    '4': creat_course,
    '5': creat_teacher,
}


def view():
    while True:
        print('''
         =====欢迎来到管理员系统=====
         1、注册
         2、登录
         3、创建学校
         4、创建课程
         5、创建老师
         6、退出界面(q)
         ''')
        choice = input('请输入相对应编号进入操作界面').strip()
        if choice == 'q':
            break
        if choice not in func_dic:
            print('编号输入有误,请重新输入')
            continue
        func_dic.get(choice)()
        

        
# student_view
'''
学生视图
'''
from interface import common_interface

from interface import student_interface
from lib import common

student_info = {
    'user_name': None
}


# 注册功能
def register():
    while True:
        username = input('请输入学生用户名:').strip()
        password = input('请输入学生密码:').strip()
        re_password = input('请确认学生密码:').strip()  # 校验两次密码是否一致
        if password == re_password:
            # 调用学生注册接口
            flag, msg = student_interface.register_interface(username, password)
            if flag:
                print(msg)
                choose = input('继续输入请按y,任意键退出').strip()
                if choose == 'y':
                    continue
                break
            else:
                print(msg)
        else:
            print('两次密码不一致')


# 登陆功能
def login():
    while True:
        # 先输入用户名和密码
        username = input('请输入用户名: ').strip()
        password = input('请输入登陆密码: ').strip()
        # 调用公共登陆接口
        flag, msg = common_interface.login_interface(username, password, 'student')
        if flag:
            student_info['user_name'] = username
            print(msg)
            break
        else:
            print(msg)
            print('不想登陆可以选择q退出')
            choose = input('选择q退出')
            if choose == 'q':
                break
            else:
                print('请重新输入用户名和密码')


# 选择学校功能
@common.login_auth('student')
def choose_school():
    while True:
        # 获取所有学校的一个列表,并且打印出来
        school_list = common_interface.check_school_interface()
        # 判断是否有学校,没有则退出
        if not school_list:
            print('没有可选择的学校,请先创建学校')
            break
        # 有则通过enumerate打印出序号和名字
        for index, school_name in enumerate(school_list):
            print(index, school_name)
        # 选择学校编号
        choice = input('请输入学校编号(q退出)').strip()
        if choice == 'q':
            break
        if not choice.isdigit():
            print('输入格式有误')
            continue
        choice = int(choice)
        if choice not in range(len(school_list)):
            print('输入格式有误,请重新输入')
            continue
        # 得到选择的学校名
        school_name = school_list[choice]
        # 调用学生接口中的 选择学校接口
        flag, msg = student_interface.choose_school_interface(
            school_name, student_info.get('user_name'))
        if flag:
            print(msg)
            break
        else:
            print(msg)


# 选择课程功能
@common.login_auth('student')
def choose_course():
    while True:
        # 通过获取课程接口,获取当前对象的 学校中 所有课程列表或 没有课程的返回信息
        flag, course_list_or_msg = student_interface.get_all_course_interface(student_info.get('user_name'))
        if not flag:
            print(course_list_or_msg)
            break
        # 如果有课程,选择课程名称,通过enumerate
        for index, course_name in enumerate(course_list_or_msg):
            print(index, course_name)
        choice = input('请输入选择的课程编号(q退出): ').strip()
        if choice == 'q':
            break
        if not choice.isdigit():
            print('输入有误,请重新输入')
            continue
        choice = int(choice)
        if choice not in range(len(course_list_or_msg)):
            print('输入有误,请重新输入')
            continue
        course_name = course_list_or_msg[choice]

        # 调用学生选择课程接口
        flag, msg = student_interface.choose_courser_interface(
            course_name, student_info.get('user_name'))
        if flag:
            print(msg)
            break
        else:
            print(msg)


# 查看分数功能
@common.login_auth('student')
def check_score():
    score_dic = student_interface.check_score_interface(student_info.get('user_name'))
    print(score_dic)


func_dic = {
    '1': register,
    '2': login,
    '3': choose_school,
    '4': choose_course,
    '5': check_score,
}


def view():
    while True:
        print('''
         =====欢迎来到学员系统=====
         1、注册
         2、登录
         3、选择校区
         4、选择课程
         5、查看成绩
         6、退出界面(q)
         ''')
        choice = input('请输入相对应编号进入操作界面').strip()
        if choice == 'q':
            break
        if choice not in func_dic:
            print('编号输入有误,请重新输入')
            continue
        func_dic.get(choice)()

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

teacher_info = {
    'user_name': None
}


# 登陆功能

def login():
    while True:
        # 先输入用户名和密码
        username = input('请输入用户名: ').strip()
        password = input('请输入登陆密码: ').strip()
        # 调用公共登陆接口
        flag, msg = common_interface.login_interface(username, password, 'teacher')
        if flag:
            teacher_info['user_name'] = username
            print(msg)
            break
        else:
            print(msg)
            print('不想登陆可以选择q退出')
            choose = input('选择q退出')
            if choose == 'q':
                break
            else:
                print('请重新输入用户名和密码')


# 查看教授课的课程
@common.login_auth('teacher')
def check_course():
    while True:
        # 调用查看课程列表接口
        flag, course_list_or_msg = teacher_interface.check_course_interface(teacher_info['user_name'])
        if flag:
            print(course_list_or_msg)
            break
        else:
            print(course_list_or_msg)
            break


# 选择教授的课程
@common.login_auth('teacher')
def choose_course():
    while True:
        # 先获取所有的学校,选择学校
        # 获取所有学校的一个列表,并且打印出来
        school_list = common_interface.check_school_interface()
        # 判断是否有学校,没有则退出
        if not school_list:
            print('没有可选择的学校,请先创建学校')
            break
        # 有则通过enumerate打印出序号和名字
        for index, school_name in enumerate(school_list):
            print(index, school_name)
        # 选择学校编号
        choice = input('请输入学校编号(q退出)').strip()
        if choice == 'q':
            break
        if not choice.isdigit():
            print('输入格式有误')
            continue
        choice = int(choice)
        if choice not in range(len(school_list)):
            print('输入格式有误,请重新输入')
            continue
        # 得到选择的学校名

        school_name = school_list[choice]

        # 通过学校获取所有课程,再选择课程
        flag, course_list_or_msg = common_interface.check_course_from_school(school_name)
        if not flag:
            print(course_list_or_msg)
            break
        # 如果有课程,选择课程名称,通过enumerate
        for index, course_name in enumerate(course_list_or_msg):
            print(index, course_name)
        choice = input('请输入选择的课程编号(q退出): ').strip()
        if choice == 'q':
            break
        if not choice.isdigit():
            print('输入有误,请重新输入')
            continue
        choice = int(choice)
        if choice not in range(len(course_list_or_msg)):
            print('输入有误,请重新输入')
            continue
        course_name = course_list_or_msg[choice]
        # 调用选择教授课程的接口
        flag, msg = teacher_interface.choose_course_interface(
            course_name, teacher_info.get('user_name'))
        if flag:
            print(msg)
            break
        else:
            print(msg)


# 查看教授课程下的学生
@common.login_auth('teacher')
def check_student():
    while True:
        # 获取老师中所有的课程
        flag, course_list_or_msg = teacher_interface.check_course_interface(
            teacher_info.get('user_name'))
        if not flag:
            print(course_list_or_msg)
            break
        # 通过课程查看课程下所有的学生
        for index, course_name in enumerate(course_list_or_msg):
            print(index, course_name)
        choice = input('请输入课程编号: ').strip()
        if not choice.isdigit():
            print('输入错误,请重新输入')
            continue
        choice = int(choice)
        if choice not in range(len(course_list_or_msg)):
            print('输入错误,请重新输入')
            continue
        course_name = course_list_or_msg[choice]

        # 调用查看课程中所有学生的接口
        flag, student_list_or_msg = teacher_interface.check_student_interface(
            course_name, teacher_info.get('user_name'))
        if flag:
            print(student_list_or_msg)
            break
        else:
            print(student_list_or_msg)
            break


# 修改成绩功能
@common.login_auth('teacher')
def change_score():
    while True:
        # 获取老师中所有的课程
        flag, course_list_or_msg = teacher_interface.check_course_interface(
            teacher_info.get('user_name'))
        if not flag:
            print(course_list_or_msg)
            break
        # 通过课程查看课程下所有的学生
        for index, course_name in enumerate(course_list_or_msg):
            print(index, course_name)
        choice = input('请输入课程编号: ').strip()
        if not choice.isdigit():
            print('输入错误,请重新输入')
            continue
        choice = int(choice)
        if choice not in range(len(course_list_or_msg)):
            print('输入错误,请重新输入')
            continue
        course_name = course_list_or_msg[choice]
        # 调用查看课程中所有学生的接口
        flag, student_list_or_msg = teacher_interface.check_student_interface(
            course_name, teacher_info.get('user_name'))
        if not flag:
            print(student_list_or_msg)
            break
        # 循环打印所有的学生, 并选择学生编号,获取学生名字
        for index, student_name in enumerate(student_list_or_msg):
            print(index, student_name)

        choice2 = input('请输入学生编号: ').strip()
        if not choice2.isdigit():
            print('输入格式有误')
            continue
        choice2 = int(choice2)
        if choice2 not in range(len(student_list_or_msg)):
            continue

        # 获取学生名字
        student_name = student_list_or_msg[choice2]

        # 让老师输入修改课程的分数
        score = input('请输入修改分数').strip()
        if not score.isdigit():
            print('输入格式有误')
            continue
        # 调用修改学生分数的接口
        flag, msg = teacher_interface.change_score_interface(
            student_name, course_name, score, teacher_info.get('user_name'))
        if flag:
            print(msg)
            break


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


def view():
    while True:
        print('''
         =====欢迎来到教师系统=====
          1、登陆功能         
          2、查看教授课程
          3、选择教授课程
          4、查看课程下学生
          5、修改学生成绩
          6、退出界面(q)
         ''')
        choice = input('请输入相对应编号进入操作界面').strip()
        if choice == 'q':
            break
        if choice not in func_dic:
            print('编号输入有误,请重新输入')
            continue
        func_dic.get(choice)()
        

interface/ student_interface/teacher_interface/admin_interface

/common_interface

# admin_interface
'''
管理员接口
'''
from db import models

'''
atm是在接口创建字典,而选课系统是通过创建管理员对象,让db_handler保存
'''
# 管理员接口


# 管理员注册接口
def register_interface(username, password):
    # 查看该管理员用户 对象 是否已经存在
    # 调用db模块中的models来查看对象obj or None
    obj = models.Admin.select_obj_by_name(username)
    if not obj:
        # 若查不到对象,开始创建对象并保留数据
        admin_obj = models.Admin(username, password)  # 会触发Admin中的__init__
        admin_obj.save_obj()
        return True, f'用户{username}注册成功!'

    return False, '用户已存在'


# 管理员创建学校接口
def creat_school_interface(school_name, school_addr, admin_name):
    # 检验学校是否存在,若存在则返回"学校已经存在"
    school_obj = models.School.select_obj_by_name(school_name)
    if school_obj:
        return False, '学校已存在'

    # 若不存在,获取管理员对象来创建
    admin_obj = models.Admin.select_obj_by_name(admin_name)

    # 通过管理员对象来调用创建学校的方法
    admin_obj.creat_school(school_name, school_addr)
    return True, '学校创建成功'

# 管理员创建课程接口
def creat_course(school_name, course_name, admin_name):
    # 先获取学校对象,判断用户输入的课程是否已经存在学校对象
    school_obj = models.School.select_obj_by_name(school_name)
    if course_name in school_obj.course_list:
        return False, '该课程已经存在'  # 需要在课程类中提前加一个空列表

    # 如果没有,获取管理员对象,通过管理员对象调用创建课程的方法
    admin_obj = models.Admin.select_obj_by_name(admin_name)
    # 创建一个创建课程的方法
    admin_obj.creat_course(school_name, course_name)
    return True, '该课程创建成功'


# 创建老师接口:老师密码默认为123
def create_teacher_interface(teacher_name, admin_name, pwd='123'):
    # 检验老师是否存在, 通过老师对象查看
    teacher_obj = models.Teacher.select_obj_by_name(teacher_name)
    if teacher_obj:
        return False, '该老师已经存在,不需要重复添加'
    # 若不存在该老师, 调用管理员对象创建老师
    admin_obj = models.Admin.select_obj_by_name(admin_name)
    admin_obj.create_teacher(teacher_name, pwd)
    return True, '老师信息创建成功'








# student_interface
'''
学生接口
'''
from db import models
# 学生注册接口
def register_interface(username, password):
    # 首先查看学生对象是否存在
    obj = models.Student.select_obj_by_name(username)

    if not obj:
        student_obj = models.Student(username, password)
        student_obj.save_obj()
        return True, f"用户{username}注册成功"
    return False, f"用户{username}已存在"

# 学生选择学校接口
def choose_school_interface(
            school_name, student_name):
    # 获取学校对象
    student_obj = models.Student.select_obj_by_name(student_name)

    # 判断学生是否已经选择学校了
    if student_obj.school:
        return False, '已经选择过学校!'
    # 若没有选择学校, 调用学生对象中的 选择学校方法, 添加学校
    student_obj.add_school(school_name)
    return True, f'学生{student_name}选择学校{school_name}成功'


# 获取学生当前学校所有课程接口
def get_all_course_interface(student_name):
    # 获取学生对象
    student_obj = models.Student.select_obj_by_name(student_name)
    # 获取学校名字
    school_name = student_obj.school
    # 判断学生是否已经选择学校了
    if not school_name:
        return False, '请先选择学校'

    # 获取学校对象, 获取学校对象中的课程列表
    school_obj = models.School.select_obj_by_name(school_name)
    course_list = school_obj.course_list
    if course_list:
        return True, course_list
    else:
        return False, '学校中没有课程'


# 学生选择课程接口
def choose_courser_interface(course_name, student_name):
    # 获取学生对象, 获取学生课程列表
    student_obj = models.Student.select_obj_by_name(student_name)
    course_list = student_obj.course_list

    # 判断当前课程是否存在于 学生对象的课程列表中
    if course_name in course_list:
        return False, '该课程已经存在'
    # 若不存在,则添加到课程列表中, 调用学生对象添加课程方法, (注意添加初始分数)
    student_obj.add_course(course_name)
    return True, '添加课程成功'

# 学生查看分数接口
def check_score_interface(student_name):
    # 获取学生对象
    student_obj = models.Student.select_obj_by_name(student_name)
    return student_obj.score





# teacher_interface
'''
teacher
'''
from db import models
# 查看老师名下所有课程接口
def check_course_interface(teacher_name):
    # 获取老师对象
    teacher_obj = models.Teacher.select_obj_by_name(teacher_name)
    # 由老师对象调用查看课程方法
    course_list = teacher_obj.check_all_course()
    if not course_list:
        return False, f'{teacher_name}老师没有课程'
    return True, course_list


# 老师选择课程接口
def choose_course_interface(course_name, teacher_name):
    # 获取老师对象
    taecher_obj = models.Teacher.select_obj_by_name(teacher_name)
    teacher_course_list= taecher_obj.course_list
    # 判断该课程是否存在
    if course_name in teacher_course_list:
        return False, '该课程已经存在'

    # 若不存在,则将课程添加进去
    taecher_obj.add_course(course_name)
    return True, f'{course_name}已添加成功'


# 老师查看课程名下所有学生的接口
def check_student_interface(course_name, teacher_name):
    # 获取老师对象
    teacher_obj = models.Teacher.select_obj_by_name(teacher_name)
    # 通过老师对象调取查看所有学生方法
    student_list = teacher_obj.cheak_student_from_course(course_name)
    if not student_list:
        return False, f'{course_name}中没有学生'
    else:
        return True, student_list

# 老师修改分数接口
def change_score_interface(
            student_name, course_name, score, teacher_name):
    # 获取老师对象
    teacher_obj = models.Teacher.select_obj_by_name(teacher_name)
    # 通过老师对象来调用修改分数方法
    teacher_obj.change_score(student_name, course_name, score)
    return True, f'{student_name}的成绩已修改为{score}'




#common_interface
'''
公共接口
'''
# 查看学校中所有课程的接口
def check_course_from_school(school_name):
    # 获取学校对象
    school_obj = models.School.select_obj_by_name(school_name)

    # 通过学校对象,调用查看学校所有课程的方法,返回一个列表
    course_list = school_obj.check_all_course()
    if course_list:
        return True, course_list
    else:
        return False, f'{school_name}没有课程!'

db/handler/models

# handler
'''
数据的保存和取用
'''
from conf import settings
import pickle
import os
# 保存数据
def save(obj):  # 将models的对象接收并保存
    # 保存对象
    # 拼接文件保存路径, 为了避免名字有重复,将当前的类当作文件夹, 以对象的名称作为文件名
    # admin_obj.__class__ 可以获得对象的Admin类名,--->Admin.__name__可以获得'Admin'类名字符串
    cls_name = obj.__class__.__name__
    # 再获取类名所在文件夹地址(可以放在配置文件中)
    cls_path = os.path.join(settings.DB_PATH, cls_name)
    # 判断cls_path 是否存在
    if not os.path.exists(cls_path):
        # 不存在直接创建
        os.mkdir(cls_path)

    # 若存在,拼接用户绝对路径
    user_path = os.path.join(cls_path, obj.name)

    # 将obj对象写入pickle文件中
    with open(user_path, 'wb') as f:
        pickle.dump(obj, f)
        f.flush()


# 查看数据
def select(cls, name):
    # 保存对象
    # 拼接文件保存路径, 为了避免名字有重复,将当前的类当作文件夹, 以对象的名称作为文件名
    # admin_obj.__class__ 可以获得对象的Admin类名,--->Admin.__name__可以获得'Admin'类名字符串
    cls_name = cls.__name__
    # 再获取类名所在文件夹地址(可以放在配置文件中)
    cls_path = os.path.join(settings.DB_PATH, cls_name)
    # 判断cls_path 是否存在
    if not os.path.exists(cls_path):
        # 不存在直接创建
        os.mkdir(cls_path)

    # 若存在,拼接用户绝对路径
    user_path = os.path.join(cls_path, name)
    # 若文件路径存在则查找对象
    if os.path.exists(user_path):
        # 将文件对象读取出来
        with open(user_path, 'rb') as f:
            obj = pickle.load(f)
            return obj


        
        
#models
'''
类库
'''
'''
存放一个个的类:

管理员对象、学生对象、老师对象、课程对象、学校对象

所有类的父类:
    - Class Base:

    - 技能:
        - 保存数据
        - 查看数据

课程对象(课程类):
    - 特征(属性):
        - 课程名字
        - 学校
        - 学生列表

    - 技能(方法)
        - 保存数据(课程)
        - 查看数据(课程)

        - 添加学校
            self.学校 = 上海校区

        - 添加学生
            self.学生列表.append(学生)


学生对象(学生类):
    - class Student(Base):
        - 特征(属性):
            - 名字
            - 密码
            - 学校
            - 课程列表
            - 分数字典: {'课程名字': 课程分数, '课程名字2': 课程分数,}

        - 技能(方法)
            - 保存数据(注册):
                - 调用学生类,实例化得到一个学生对象,并将学生对象保存成pickle文件。

            - 查看数据(登录):
                - 从pickle文件中读出相应的对象。

            - 选择校区
                学校 = oldboy

            - 选择课程
                self.课程列表.append(课程)

            - 查看成绩
                for line in self.分数字典:
                    print(line)


老师对象(老师类):
    class Teacher(Base):
        - 特征(属性):
            - 名字
            - 密码
            - 课程列表

        - 技能(方法)

            - 保存数据(老师)

            - 查看数据 (登录)

            - 查看教授课程
                self.课程列表

            - 选择教授课程
                课程列表.append(课程名字)

            - 查看课程下学生
                课程列表.课程---》 获取课程对象.学生列表

            - 修改学生成绩
                课程列表.课程----> 获取课程对象.学生列表.学生 ----> 获取学生对象.分数字典[课程]  = 100


管理员对象(管理员类):
    - class Admin(Base):
        - 特征(属性):
            - 名字
            - 密码

        - 技能(方法)
            - 保存数据 (注册)
                - 调用管理员类,实例化得到一个管理员对象,并将管理员对象保存成pickle文件。

            - 查看数据 (登录)

            - 创建学校
                - 调用学校类,实例化得到一个学校对象,并将学校对象保存成pickle文件。

            - 创建老师
                - 调用老师类,实例化得到一个老师对象,并将老师对象保存成pickle文件。

            - 创建课程
                - 调用课程类,实例化得到一个课程对象,并将课程对象保存成pickle文件。


学校对象(学校类):
    - class School(Base):
        - 特征(属性):
            - 学校名称
            - 学校地址
            - 课程列表
            -

        - 技能(方法)
            - 查看数据(学校)
            - 保存数据(学校)

            - 添加课程
                self.课程列表.append(课程)

'''
from db import db_handler


# 父类
class Base:

    # 保存 数据(对象) 的方法
    def save_obj(self):
        # 调用db _handler中的save将对象保存到pickle文件中
        db_handler.save(self)  # 将产生的对象传入db_handler中保存

    # 查看 通过传入名字查看数据(对象)的方法
    @classmethod
    def select_obj_by_name(cls, name):
        obj = db_handler.select(cls, name)

        return obj


# 管理类
class Admin(Base):
    def __init__(self, name, pwd):
        self.name = name
        self.pwd = pwd

    # 管理员创建学校的方法
    def creat_school(self, school_name, school_addr):
        # 方法一
        # school_obj = School(school_name, school_addr)
        # school_obj.save_obj()
        # 方法二
        School(school_name, school_addr)

    # 创建课程的方法
    def creat_course(self, school_name, course_name):
        # 调用课程类,创建课程对象
        Course(school_name, course_name)
        # 获取学校对象,为学校对象中的课程列表添加课程(一个学校有多个课程)
        school__obj = School.select_obj_by_name(school_name)
        school__obj.course_list.append(course_name)
        # 保存
        school__obj.save_obj()

    # 创建老师的方法
    def create_teacher(self, teacher_name, teacher_pwd):
        Teacher(teacher_name, teacher_pwd)


# 学生类
class Student(Base):
    def __init__(self, student_name, student_pwd):
        self.name = student_name
        self.pwd = student_pwd
        # 一个学生只能选择一个学校
        self.school = None
        self.course_list = []
        self.score = {}
        self.save_obj()

    # 学生添加学校方法
    def add_school(self, school_name):
        self.school = school_name
        self.save_obj()

    # 学生添加课程方法
    def add_course(self, course_name):
        self.course_list.append(course_name)
        # 为新添加的课程添加初始分数
        self.score[course_name] = 0
        self.save_obj()
        # 获取课程对象,让课程对象调用添加学生方法
        course_obj = Course.select_obj_by_name(course_name)
        # 调用添加学生的方法,将课程和学生绑定
        course_obj.add_student(self.name)


# 老师类
class Teacher(Base):
    def __init__(self, teacher_name, teacher_pwd):
        self.name = teacher_name
        self.pwd = teacher_pwd
        self.course_list = []  # 提前建一个空课程列表,老师允许有多门课程
        self.save_obj()

    # 老师查看所有课程的方法
    def check_all_course(self):
        return self.course_list

    # 老师添加课程的方法
    def add_course(self, course_name):
        self.course_list.append(course_name)
        self.save_obj()

    # 老师查看课程下所有学生的方法
    def cheak_student_from_course(self, course_name):
        # 获取课程对象
        course_obj = Course.select_obj_by_name(course_name)
        # 通过课程对象获取课程下学生列表
        student_list = course_obj.check_all_student()
        return student_list

    # 老师修改分数方法
    def change_score(self, student_name, course_name, score):
        # 获取学生对象
        student_obj = Student.select_obj_by_name(student_name)

        # 直接修改学生分数属性
        student_obj.score[course_name] = score
        student_obj.save_obj()



# 学校类
class School(Base):
    def __init__(self, school_name, school_addr):
        self.name = school_name
        self.addr = school_addr
        self.course_list = []
        self.save_obj()

    # 查看所有课程的方法
    def check_all_course(self):
        return self.course_list


# 课程类
class Course(Base):
    '''
      - 课程名字
      - 学校
      - 学生列表
      '''

    def __init__(self, school_name, course_name):
        self.school_name = school_name
        self.name = course_name
        self.student_list = []
        self.save_obj()

    # 课程添加学生的方法
    def add_student(self, student_name):
        self.student_list.append(student_name)
        self.save_obj()

    # 课程对象获取所有学生方法
    def check_all_student(self):
        return self.student_list

lib/common

# 登陆认证装饰器, 以及权限认证

def login_auth(role):
    def outer(func):
        def inner(*args, **kwargs):
            # 权限认定
            if role == 'admin':
                from core import admin_view
                if admin_view.admin_info.get('user_name'):
                    res = func(*args, **kwargs)
                    return res
                else:
                    admin_view.login()
            elif role == 'student':
                from core import student_view
                if student_view.student_info.get('user_name'):

                    res = func(*args, **kwargs)
                    return res
                else:
                    student_view.login()
            elif role == 'teacher':
                from core import teacher_view
                if teacher_view.teacher_info.get('user_name'):
                    res = func(*args, **kwargs)
                    return res
                else:
                    teacher_view.login()
            else:
                print('该用户无此权限')

        return inner
    return outer

posted @ 2019-12-04 11:09  Mr江  阅读(123)  评论(0编辑  收藏  举报