"""1. 创建北京、上海 2 所学校   学校类对象   属性:名字,地址   行为:

2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含,周期,价格,通过学校创建课程     课程类对象        属性:名字,价格,周期        行为:4. 通过学校创建班级, 班级关联课程、讲师(初始没有设置为空)   班级对象   属性:名字, 课程名称

   讲师对象   属性:名字,密码,校区名称,课程名称

5. 创建学员时,选择学校,关联班级   学生对象:   属性:名字,密码 ,学校名称,班级名称,成绩6. 创建讲师角色时要关联学校 

7. 提供三个角色接口   6.1 学员视图, 可以注册,登陆, 交学费, 选择班级,查看成绩

   6.2 讲师视图,登陆,(注册没有 由管理员来分配账号), 查看班级学员列表 , 修改所管理的学员的成绩 ,修改密码

   6.3 管理视图,登陆,创建学校,创建讲师, 创建班级,创建课程,给老师指定班级

8. 上面的操作产生的数据都通过pickle序列化保存到文件里

实现的顺序管理员  老师  学员

"""1.模块的界面

2.管理员代码层

# 管理员代码输入层

# 管理员视图层
from lib import common
from interface import admin_inerface
current_info = None

def register():

    name = input('输入管理员姓名:').strip()
    password = input('输入密码:').strip()
    if name and password:
        flag, msg = admin_inerface.register_interface(name, password)
        if flag:
            print(msg)
        else:
            print(msg)

def login():
    global current_info
    name = input('输入管理员姓名:').strip()
    password = input('输入密码:').strip()
    if name and password:
        flag, msg = admin_inerface.login_interface(name, password)
        if flag:
            print(msg)
            current_info = name
        else:
            print(msg)

def create_school():
    """
    1.输入创建学校所需要的属性 名字和地址
    2.调用接口层判断 接口层拿到数据 到数据处理层处理
    3.返回的到接口层 有则返回F 没有则创建
    4,返回到界面 打印输出

    :return:
    """
    school_name= input('输入学校的名字').strip()

    school_addr = input('输入学校的地址:').strip()
    if school_name and school_addr :
        flag, msg = admin_inerface.create_school_interface(current_info, school_name, school_addr)
        if flag:
            print(msg)
        else:
            print(msg)

def create_teacher():
    """
    1.先选择学校(老师是在学校下面的) 可以封装获取所有学校学校
    2.输入老师的名字和默认密码
     创建老师管理员调用接口层实列化
    :return:
    """
    sc_names_list = admin_inerface.get_schools_interface()
    # print(sc_names_list,'3333')  # ['bj_old', 'sh_old'] 3333

    # 把字在通过索引的形式展现给界面层 >>>封装抽取一个独立函数
    sc_name = common.get_name(sc_names_list, '校区名')
    # 拿到学校的名字 判断 是否存在 在下一步 输入老师的信息
    if not sc_name:
        return
    #  有该学习
    te_name = input('输入老师的名字:').strip()
    pwd = input('输入默认密码:').strip()

    if te_name and pwd:
        # 调用接口层
        flag, msg = admin_inerface.create_teacher_interface(te_name, sc_name,pwd)
        if flag:
            print(msg)
        else:
            print(msg)

def create_classes():  # 先创建课程 课程下添加班级
    """
    1.选择校区
    2.选择课程
    3.输入班级名称
    4.调用接口
    5.展示结果
    :return:
    """
    sc_names = admin_inerface.get_schools_interface()
    # 拿到学校名字
    sc_name = common.get_name(sc_names,'校区名字')
    if not sc_names:
        return False, '学校未创建'

    # 获取课程列表
    c_course_list = admin_inerface.get_course_interface(sc_name)
    # print(c_course_list,'c_course_list')
    c_name = common.get_name(c_course_list,'课程名字')
    if not c_name:
        return False, '课程还没有创建'

    # 有的话 在选择班级
    cl_name = input('输入要创建的班级:').strip()
    flag, msg = admin_inerface.create_classes_interface(sc_name,c_name,cl_name)
    if flag:
        print(msg)
    else:
        print(msg)

def create_course():
    """
     选择校区就可以
     你的现获取所有学校
     选好学校 在改学校下创建课程
    :return:
    """
    sc_names = admin_inerface.get_schools_interface()  # 设计列表 面向对象思想 存的都是对象
    sc_name = common.get_name(sc_names, '校区名字')  # 封装

    # 判断返回的校区名是否存在
    if not sc_name:
        return
    # 有则添加课程信息
    course_name = input('输入课程名字:').strip()
    price = input('输入课程价格:').strip()
    cycle = input('输入课程周期:').strip()

    # 调用接口层 传值要设计好是位置参数
    flag, msg = admin_inerface.create_course_interface(sc_name, course_name, price, cycle)
    if flag:
        print(msg)
    else:
        print(msg)

# 给老师添加课程  是给老师的所在班级添加课程呢  最后式老师班级
def add_course_to_teacher():
    """
    明确输入层要干嘛 给老师加课程
    1、选择学校
    2、选择一个老师
    3、选择一个课程
    4、选择一个班级
    5、将校区名字 老师名字 课程名字 班级名字 传给接口称

    :return:
    """

    # 获取学校名字
    sc_names = admin_inerface.get_schools_interface()
    sc_name = common.get_name(sc_names,'学校名字')
    if not sc_name:
        return

    #  获取一会老师的 老师选择课程  课程之后才有班级
    te_names = admin_inerface.get_teacher_interface(sc_name)  # 取所有老师的名字 不需要传参
    te_name = common.get_name(te_names, '老师的名字')  # te_name = list[choice] 取值
    if not te_name:
        return

    #
     # 获取课程名字 班级也创建好了
    c_names = admin_inerface.get_course_interface(sc_name)
    c_name = common.get_name(c_names,'课程名字')
    if not c_name:
        return

    # 获取班级名字

    # 1.去接口层
    cl_names = admin_inerface.get_classes_interface(sc_name)  # 取所有

    # 调用公共方法报道名字
    cl_name = common.get_name(cl_names, '班级名字')

    # 判断
    if not cl_name:
        return

    # 调用接口层 发送数数据  >>>> 接收结果

    flag, msg = admin_inerface.add_course_to_teacher_interface(sc_name,c_name,te_name,cl_name)
    if flag:
        print(msg)
    else:
        print(msg)

func_dic = {
    ":register,
    ":login,
    ":create_school,
    ":create_teacher,
    ":create_classes,
    ":create_course,
    ":add_course_to_teacher,
}

def admin_views():
    msg = (""" -----欢迎 登录管理员功能层-----
    0.注册
    1、登录
    2、创建学校
    3、创建老师
    4、创建班级
    5、创建课程
    6、选择老师课程及班级
    q、退出

    """)
    common.select_func(func_dic, msg)

管理员接口层代码

# 管理员注册接口层层
# from db.models import *
from db import models,db_handels

def register_interface(name, password):
    """

    :param name: 管理员名字
    :param password: 管理员密码
    :return: 返回是bool  和字符串提示信息

    思路:
        1. 直接用类名 通过models select()方法  返回是一个对象 再判断 在返回False
        2.先判断名字是否存在

        3.不在直接创建利用Admin 直接创建

    """
    admin_obj = models.Admin.select(name)
    print(admin_obj)
    if admin_obj:
        return False, "用户已存在"
    res = models.Admin(name, password)
    res.save()
    return True, '注册成功'

# 用户登录接口
def login_interface(name,pwd):
    """

    :param name:
    :param pwd:
    :return: bool + str
    1.用类调取名对象
    2.判断对象是否存在
    3.不在则返回return
    4.在判断密码
    输入的和存的一样则返回正确

    """
    admin_obj = models.Admin.select(name)
    print(admin_obj,'admin_obj')
    if not admin_obj:
        return False, '用户不存在'
    if pwd == admin_obj.pwd:
        return True, '登录成功'

# 创建学校
def create_school_interface(current_info, school_name, school_addr):
    """

    :param current_info: 当前登录的名字:
    :param school_name: 学校可名
    :param school_addr: 学校地址
    :return: T /F
    思路:
        1。调用接口层
    """
    school_obj = models.School.select(school_name)
    if school_obj:
        return False, '学校已存在'
    # 实列化学校
    models.School(school_name, school_addr)

    return True, '学校创建成功'

# 创建学校
def create_teacher_interface(te_name,sc_name, pwd ):
    """

    :param te_name: 老师的名字
    :param pwd: 老师的密码
    :return: 返回值
    1、调用接口层将数据传输到数据处理层
    2、存在则直接返回 不存在者直接实列化
    3、将处理的结果都返回给用层界面
    """
    te_obj = models.Teacher.select(sc_name+te_name)
    ')
    if te_obj:
        return False, "老师已存在"
    models.Teacher(sc_name+te_name, sc_name, pwd)

    return True, "创建老师成功"

# 获取所有学校
def get_schools_interface():

    """
     # 获取的所有学校称
        1.通过学校这个类获取所有学校对象
        2.拿到一个返回值 是一个列表对象
        3.for循环拿出每一个对象
        4.通过点语法获取名字
        5.产生一个新列表 (学校名字)

    :return:
    """
    sc_list_obj = models.School.get_all()  # 可以将这个当一个类方法使用 可吧帮我们获取对象文件的列表

    res = []
    for i in sc_list_obj:
        res.append(i.name)
    return res

# 接口层创建学校
def create_course_interface(sc_name, course_name, price, cycle):
    course_name_obj = models.Course.select(sc_name+course_name)  # 存储式拼接的格式

    if course_name_obj:
        return False, '课程已存在'
    models.Course(sc_name+course_name, price, cycle,sc_name)  # 位置参数必须一一对应
    return True, '课程创建成功'

# 获取课程列表
def get_course_interface(sc_name):
    c_course_list = models.Course.get_all()
    print('c_course_list',c_course_list)

    # 拿到课程名字
    res = []
    for a in c_course_list:
        if a.sc_name == sc_name:

            res.append(a.name[len(sc_name):])
    return res

# 管理员创建班级
def create_classes_interface(sc_name,c_name,cl_name):
    """

    :param sc_name: 学校名
    :param c_name: 课程名
    :param cl_name: 班级名
    :return: 返回结果
    1.调接口层 班级 moles
    2.判断是否存在
    3、创建
    4、返回界面

    """
    cl_obj = models.Classes.select(sc_name+cl_name)
    if cl_obj:
        return False, '班级已经创建'

    # =无则创建
    models.Classes(sc_name+cl_name, c_name, sc_name)
    return True, '班级创建成功'

# 获取老师的所有名字
def get_teacher_interface(sc_name):
    """
    老师已经创建好了
    te_names = models.Teacher.get_all()
    # 拿到 返回的一个老帅 对象列表
    # 循环取值 获取老师 >>> 获取老师名字
    :return:返回一个对象列表

    """
    res = []  # 123kk names
    te_names = models.Teacher.get_all()

    for a in te_names:
        if a.sc_name == sc_name:
            res.append(a.name[len(sc_name):])
    return res

# 接口层获取班级列表 get_all 方法
def get_classes_interface(sc_name):  #

    cl_names = models.Classes.get_all()

    # 在接口层给他遍历
    res = []
    for a in cl_names:
        if a.sc_name == sc_name:
            res.append(a.name[len(sc_name):])
    return res

# 加课程接口层逻辑处理  >>>> 将接收的数据调用数据处理层 >>>返回结果
def add_course_to_teacher_interface(sc_name, c_name, te_name, cl_name):
    # 用models 获取数据
    # c_obj = models.Classes.select(sc_name+c_name)
    # if not c_obj:
    #     return False, '课程已存在'
    #
    # # 创建
    # models.Classes(sc_name+c_name, te_name, cl_name)  # models
    # return True, '创建成功'

    """

    :param sc_name: 学校名称
    :param c_name: 课程名称
    :param te_name: 老师名称
    :param cl_name: 班级名称
    :return:
    1.找到老师设置他的课程
    2.找到对应的班级 设置老师

    """
    te_obj = models.Teacher.select(sc_name+te_name)
    # 将当前课程绑定给当前老师
    te_obj.c_name = c_name
    te_obj.save()  # 保存课程

    # 将老师关联班级
    cls_obj = models.Classes.select(sc_name+cl_name)

    # 判断班级是否已经选择 老师绑班级
    if cls_obj.te_name == te_name:
        return False, '班级已经绑定过老师了'
    # 如果没有则将老师绑定给班级
    cls_obj.te_name = te_name
    cls_obj.save()
    return True, '老师绑定班级成功'

管理员modles 层

# 类的封装(属性和方法)

# 类的抽取
from db import db_handels

class BaseClass(object):
    # 方法可以将查询方法封装到类中 可以通过类来调用
    # def save()
    def save(self):
        db_handels.db_save(self)

    @classmethod  # 为什么绑定给雷用 因为自动就将类当做第一对象传入 后面拼接路径
    def select(cls, name):
        res = db_handels.db_select(cls, name)
        return res

    # 发封装一个类方法  直接将类作为第一参数传过来
    @classmethod
    def get_all(cls):
        # 获取需要返回到接口层

        list_obj = db_handels.get_all(cls)
        return list_obj

class Admin(BaseClass):
    # 属性 及方法
    def __init__(self, name, pwd):
        self.name = name
        self.pwd = pwd
        self.save()

class School(BaseClass):
    def __init__(self,school_name,school_addr):
        self.name = school_name  # 自己的名称空间 优先实列化初始值
        self.addr = school_addr
        self.save()

class Course(BaseClass):
     def __init__(self,name,price,cycle,school_name):
         self.name = name
         self.price = price
         self.cycle = cycle
         self.sc_name = school_name
         self.save()

class Classes(BaseClass):
    def __init__(self,name,course_name, school_name):
        self.name = name
        self.te_name = None  # 暂时还没有老师

        self.sc_name = school_name  # 创建班级需要传学校
        self.c_name = course_name  # 创建班级需要传课程
        self.save()

class Teacher(BaseClass):
    '):
        self.name = te_name
        self.pwd = pwd
        self.sc_name = school_name
        self.c_name = None  # 课程名字哦
        self.save()

class Student(BaseClass):
    def __init__(self, name, pwd, school_name):
        self.name = name
        self.pwd = pwd
        self.sc_name = school_name  # 学校是泥在创建学生要先选的 初始化阶段要进行 实列化传值
        self.class_name = None  # 班级
        self.score = None
        self.is_pay = False  # 是否付费属性
        self.save()

管理员handles 层代码

# 存数据 (对象)
import os
import pickle

from conf import settings

def db_save(obj):  # obj 是save()自动将对象传过来
    # 拼接路径 判断路径保存

    PATH = os.path.join(settings.DB_PATH, obj.__class__.__name__.lower())

    if not os.path.exists(PATH):
        os.makedirs(PATH)

    path = os.path.join(PATH, obj.name)
    # 将对象写入文件
    with open(path, 'wb')as f:
        pickle.dump(obj, f)
        f.flush()

# 数据处理层
# select() 查询获取
def db_select(cls, name):
    # print(cls,'111')  类
    # 拼接路径主要判断有没有当前路径
    PATH = os.path.join(settings.DB_PATH, cls.__name__.lower())
    # print(PATH, 'path')
    # print(PATH,'4444')

    if not os.path.exists(PATH):
        os.makedirs(PATH)
    # 再判断文件路径
    user_path = os.path.join(PATH, name)
    if not os.path.exists(user_path):
        return
    # print(user_path, 'user_path')
    with open(user_path, 'rb')as f:
        res_obj = pickle.load(f)
        # print(res_obj, 'res_obj')
        return res_obj

# 获取所有对象的类方法
def get_all(cls):
    # 拼接路径
    path = os.path.join(settings.DB_PATH, cls.__name__.lower())
    if not os.path.exists(path):
        return
    # # 拼接文件路径
    # user_path = os.path.join(path, name)
    # with open(user_path, 'rd')
    #拿到当前文件夹下的所有文件

    res = []
    for a in os.listdir(path):  # 这里的a 是 当前path 下的所有文件对象
        # print(names,'names')  #

        # 直接点用select() 拿到返回对象
        obj = db_select(cls, a)  # 调用 数据获取对象
        # print('obj', obj)  # <db.models.School object at 0x000002549D045438> 学校对象

        res.append(obj)  # 将对象添加到列表中
    # print(res,'get_all  111')
    return res  # 返回到models 层

2.老师用户接口层 :表示层代码

# 教师的功能代码层

from lib import common
from interface import teacher_interface,admin_inerface

current_info = None
current_school = None
def login():
    global current_info, current_school  # 升为全局变量一会记得保存当前用户的登录状态

    while True:
        # 先选择学校
        # 在选择登录
        sc_names = admin_inerface.get_schools_interface()
        sc_name = common.get_name(sc_names, '选择的校区')
        if not sc_name:
            return
        name = input('输入老师名字:').strip()
        pwd = input('输入老师密码:').strip()
        if name and pwd:
            flag, msg = teacher_interface.login_interface(name, pwd,sc_name)
            if flag:
                print(msg)
                current_info = name
                current_school = sc_name
                break
            else:
                print(msg)

# 暂时
def show_class():  # 全部
    """获取这个老师下的班级
    思路:根据当前的学校 和 用户名
    1.先拿到所有的班级 在比对这个老师的是否是这个学校 和这个老师返回一个列表
    2.返回到界循环打印 或者枚举

    :return:
    """
    # 调用接口层
    class_list = teacher_interface.get_classes_list(current_info, current_school)

    if not class_list:
        return '暂无班级列表'
    # 打印 当前的班级列表
    for a in class_list:
        print(class_list.index(a), a)

# 查看当前老师下的学生
def check_student():
    """
    # 拿到所有 的班级 在 在获取 班级下所有的学生

    #

    :return:
    """
    class_list = teacher_interface.get_classes_list(current_info,current_school)
    # 获取班级名字
    cls_name = common.get_name(class_list, '班级名字')
    if not class_list:  # 有班级列表

        return
    # 有则 老师获取所有学生
    stu_dic_list = teacher_interface.get_stu_list_interface(current_school,cls_name)
    if not list:  # 暂时还没有学员
        print('暂时没有学生列表')
        return
    # 在打印字符串拼接 显示个人信息 [{'name':'jason}]
    print('%-8s %-8s %-8s %-8s %-8s'%('name','sc_name','class_name','score','is_pay'))
    for stu_dic in stu_dic_list:

        print('%-8s %-8s %-8s %-8s %-8s '
              %(stu_dic['name'],
                stu_dic['sc_name'],stu_dic['class_name'],stu_dic['score'],
                stu_dic['is_pay']))

# 修改老师密码
def change_pwd():
    """
    对新密码新进限制
    :return:
    """
    new_pwd = input('输入要修改的密码:').strip()
    if len(new_pwd) >=6 and new_pwd.isalnum():
        flag = teacher_interface.change_pwd_interface(current_info,current_school, new_pwd)
        if flag:
            print('密码修改成功')
        else:
            print('修改未成功')

# 修改学生成绩
def change_score():
    """
    需求:修改学生成绩必须获取所有学生 <<< 遍历所有学生 判断 是否当前 学校下的学生和
    1.老师登陆有自己的学校
    2.
    :return:
    """
    # 1.获取班级 当前老师的班级
    cl_list = teacher_interface.get_classes_interface(current_info,current_school)
    cl_name = common.get_name(cl_list, '老师班级')
    if not cl_name:
        return

    # 获取班级下的学生
    students = teacher_interface.get_stu_list_interface(current_school, cl_name)

    if not students:  # 列表套字典
        return '班级下没有学生'

    # 2.获取学生

    stu_name = common.get_name([stu['name'] for stu in students], '学生信息')

    if not stu_name:
        return
    while True:
        score = input('输入修该的分数:').strip()

        if not common.is_number(score):
            print('请输入浮点数')
            continue

        # 调用接口也层修改 解压赋值 一一对应
        flag, msg = teacher_interface.change_score_interface(current_school, stu_name, float(score))
        if flag:
            print(msg)
            break
        else:
            print(msg)

func_dic= {

    ":login,
    ":show_class,
    ":check_student,
    ":change_pwd,
    ":change_score,

}

def teacher_views():
    msg = ("""
    1.登陆
    2.查看班级
    3.查看学员
    4.修改密码
    5.修改成绩
    q.退出

    """)
    common.select_func(func_dic,msg)

老师接口层代码:业务逻辑代码处理层代码

# 教师的功能代码
from db import models

# 老师接口层
def login_interface(name, pwd, sc_name):
    # 直接调用接口层
    te_obj = models.Teacher.select(sc_name+name)
    if not te_obj:
        return False, '用户不存在'
    if pwd == te_obj.pwd:
        return True, '登录成功'

# 获取老师的所有列表
def get_classes_list(te_name, school_name):
    """

    :param te_name:
    :param school_name:
    :return:
    1.先获取这学小的所有列表
    2.循环没有一个班级对象
    3,拿到班级对象点语法可以判断是否等于当前的班级下的学校名字  和当前的班级下的老师名
    4.是直接切分将班级名字返回
    返回一个列表

    """
    # 获取所有班级
    cl_lists = models.Classes.get_all()

    # 循环打印
    res = []
    for a in cl_lists:
        if a.sc_name == school_name and a.te_name == te_name:
            res.append(a.name[len(school_name):])  # 存的时候是有学校的

    return res

# h获取所有的老师
def get_stu_list_interface(current_school,cls_name):
    # 返回
    """

    :param current_school:
    :param cls_name:
    :return: 一个列表存储的是字典
    """
    stu_all_list = models.Student.get_all()
    # print(stu_all_list,'stu_all_list')  # 拿到所有的学生列表对象

    # for 循环
    res = []
    for stu in stu_all_list:
        if stu.sc_name == current_school and stu.class_name == cls_name:

            # 获取学生字典
            stu_dic = stu.__dict__
            stu_dic.pop('pwd')
            # 获取学生的名字
            stu_dic['name'] = stu_dic['name'][len(current_school):]

            res.append(stu_dic)
    return res

# 老师修改密码

def change_pwd_interface(current_info,current_school, new_pwd):
    # 不需要判断了 注意查询老师的时候 拼接查询
    te_obj = models.Teacher.select(current_school+current_info)
    te_obj.pwd = new_pwd
    te_obj.save()
    return True, '修改成功'

# 获取当前老师 的班级
def get_classes_interface(te_name, sc_name):
    # 获取所有
    clas = models.Classes.get_all()

    # 循环
    res = []
    for cl in clas:
        if cl.te_name == te_name and cl.sc_name == sc_name:
            res.append(cl.name[len(sc_name):])
    return res

# 修改学生成绩

def change_score_interface(current_school, stu_name, score):

    # 获取所有学生
    stus = models.Student.get_all()
    ')
    for stu in stus:
        if stu.sc_name == current_school and stu.name == current_school+stu_name:
            stu.score = score
            print(stu.__dict__)
            ')
            stu.save()
            return True, '修改成绩成功'

#
# if __name__ == '__main__':  # 测试代码
#
#     stu = models.Student('rose','123','sh_old')
#     stu.class_name = 'python10'
#     print(stu.__dict__)
#     stu.save()

3.学生用户层:表示层代码

# 学生函数功能层
from lib import common
from interface import admin_inerface,student_inerface

current_school = None
current_info = None
def register():

    # 选择一个校区 在进行注册
    sc_names = admin_inerface.get_schools_interface()
    sc_name = common.get_name(sc_names, '选择校区')
    if not sc_name:
        return
    while True:
        name = input('输入学生名字:').strip()
        pwd = input('输入学生密码:').strip()
        if name and pwd:
            flag, msg = student_inerface.register_interface(sc_name,name,pwd)
            if flag:
                print(msg)
                break
            else:
                print(msg)

def login():
    # 还得选择校区
    global current_school, current_info
    sc_names = admin_inerface.get_schools_interface()
    sc_name = common.get_name(sc_names, '选择校区')
    if not sc_name:
        return
    while True:
        name = input('输入学生名字:').strip()
        pwd = input('输入学生密码:').strip()
        if name and pwd:
            flag, msg = student_inerface.login_interface(sc_name, name, pwd)
            if flag:
                print(msg)
                current_info = name
                current_school = sc_name

                break
            else:
                print(msg)

# 学生缴费
def pay_money():
    """
    1.首先我们要获取这个学生 当前的学生名字  返回一个学生字典 __dict__
    stu =

    2. 判段是否有班级

    3.判断是否缴费

    4。获取当前学生的
    :return:
    """
    while True:
        stu = student_inerface.get_student_interface(current_info, current_school)
        print(stu,'stu')
        if not stu['class_name']:  # 名称字典空间
            # 暂时没有该学生班级
            print('未选择班级')
            return
        if stu['is_pay']:
            print('你已经交过费用了')
            return

    # 获取当前学生的要交的钱是多少

        money = student_inerface.get_money_info(current_info,current_school)
        print('需要缴费金额:[%s]¥' % money)

        cmd = input('输入%s确认缴费<y/n>:').strip()
        if cmd == 'n': break
        elif cmd == 'y':
            flag,msg = student_inerface.pay_money_interface(current_info,current_school)
            if flag:
                print(msg)
            else:
                print(msg)

# 学生选择班级

def choose_classes():
    """
    1.当前由学校名称
    2.获取班级的名字
    3.通过班级赋值
    :return:
    """
    ls_names = student_inerface.get_cls_interface(current_info, current_school)
    ls_name = common.get_name(ls_names,'班级名字')
    ')
    if not ls_name:
        return
    # 有的话则继续
    flag, msg = student_inerface.choose_cls_interface(current_school,current_info,ls_name)
    if flag:
        print(msg)

    else:
        print(msg)

def check_score():
    # 修改分数
    """
    获取学生字典对象
    :return:
    """
    stu_dic = student_inerface.get_student_interface(current_info, current_school)
    if not stu_dic:
        return '暂无学生字典对象'
    print('学生成绩%s' % stu_dic['score'])

func_dic = {
    ":register,
    ":login,
    ":pay_money,
    ":choose_classes,
    ":check_score,
}

def student_views():
    msg = ("""-----欢迎等录学生功能层------
    1、注册
    2、登录
    3、交学费
    4、选择班级
    5、查看成绩
    q、退出 

    """)
    common.select_func(func_dic, msg)

学生层业务逻辑处理层:

# 学生接口层
from db import models

def register_interface(sc_name,name,pwd):
    # 记得拼接
    stu_obj = models.Student.select(sc_name+name)
    if stu_obj:
        return False, '学生已经存在'

    models.Student(sc_name+name, pwd, sc_name)
    print(stu_obj,'stu_obj')
    # stu_obj.save()
    return True, '注册成功'

# 用户登陆

def login_interface(sc_name, name, pwd):
    # 先判断用户名 存在 再判断密码
    stu_obj = models.Student.select(sc_name+name)
    if not stu_obj:
        # 直接返回
        return False, "用户不存在"
    if stu_obj.pwd == pwd:
        return True, '用户登陆成功'

# 获取当前学生信息
def get_student_interface(current_info, current_school):
    stus = models.Student.select(current_school+current_info)

    if stus:
        stu_dic = stus.__dict__
        stu_dic.pop('pwd')
        return stu_dic
    return False

# 获取当前学生要交的学费
def get_money_info(stu_name,sc_name):
    """
    1.获取学生的

    2.获取该学的班级

    3。获取班级取课程对象

    """
    stu = models.Student.select(sc_name+stu_name)

    # 班级对象
    cls = models.Classes.select(sc_name+stu.class_name)  # 获取班级

    # 拿到班级下的课程
    c_course = models.Course.select(sc_name+cls.c_name)

    return c_course.price

# 学生缴费
def pay_money_interface(stu_name,sc_name):
    # 获取学生的缴费信息 改为T
    stu_obj = models.Student.select(sc_name+stu_name)
    stu_obj.is_pay = True
    stu_obj.save()
    return True, '缴费成功'

# 获取班级列表
def get_cls_interface(current_info, current_school):
    cl_list = models.Classes.get_all()

    res = []

    for i in cl_list:
        if i.name.startswith(current_school):
            res.append(i.name[len(current_school):])
    return res

# 给学生添加班级

def choose_cls_interface(current_school,current_info,ls_name):
    stu_obj = models.Student.select(current_school+current_info)
    if not stu_obj:
        return False, '该学生不存在'
    if stu_obj.class_name:  # 一个学生只能选一个班级
        # print('stu_obj',stu_obj.__dict__)
        return False, '已经选则班级'  # 这里是有点问题呀
    stu_obj.class_name = ls_name
    # print(stu_obj.__dict,'2222')
    stu_obj.save()
    return True, '创建班级成功'

4. common 共用功能

# 先封装选择项
from functools import wraps

def select_func(func_dic, msg):
    while True:
        print(msg)
        choice = input('输入功能选项:').strip()
        if choice == 'q':
            break
        elif choice in func_dic:
            func_dic.get(choice)()
        else:

            print('输入有误')

# 获取校区名字
def get_name(names_list, title):
    """

    :param names_list: 管理功能层传过的学校列表
    :param title: 展示给用户的标题 校区  课程 老师 班级
    :return:
    """

    while True:
        if not names_list:
            print('暂时还没有%s'% title)
            return
        # for循环 可以用枚举 这里我们尝试一个新的
        for c_name in names_list:

            print(names_list.index(c_name), c_name)

        choice = input("输入%s编号:"% title).strip()

        if not choice.isdigit():
            continue
        choice = int(choice)
        if choice not in range(len(names_list)):
            print('输入的编号不存在')
            continue
        return names_list[choice]

def is_number(score):
    while True:
        try:
            float(score)
            return True
        except BaseException('输入不是浮点数') as e:
            print(e)
            break

# 装饰器
def login_auth(type):

    def outer(func):
        from views import admin, student, teacher
        @wraps(func)

        def inner(*args,**kwargs):
            if type == 'admin':
                module = admin
            elif type == 'student':
                module = student
            elif type == 'teacher':
                module = teacher

            else:
                raise Exception('没有这个模块')
            if module.current_info :
                res = func(*args, **kwargs)
                return res
            else:
                return module.login()
        return inner
    return outer
												

select 项目<选课系统>的更多相关文章

  1. 一个简单的python选课系统

    下面介绍一下自己写的python程序,主要是的知识点为sys.os.json.pickle的模块应用,python程序包的的使用,以及关于类的使用. 下面是我的程序目录: bin是存放一些执行文件co ...

  2. python 入门基础23 选课系统 项目

    选课系统 代码地址:github_code # 选课系统 # 角色:学校.学员.课程.讲师 # 要求: # 1. 创建北京.上海 2 所学校 # 2. 创建linux , python , go 3个 ...

  3. day27、28 二十八、项目:选课系统

    选课系统 作业要求 角色:学校.学生.课程.讲师 要求: 1. 创建北京.上海 2 所学校 ----> 创建学校 2. 创建linux , python , go 3个课程 , linux\py ...

  4. Python开发【项目】:选课系统-改良版

    程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  5. python【项目】:选课系统【简易版】

    功能要求 角色:学校.学员.课程.讲师要求:1. 创建学校2. 创建课程3. 课程包含,周期,价格,通过学校创建课程4. 通过学校创建班级, 班级关联课程.讲师5. 创建学员时,选择学校,关联班级5. ...

  6. python开发项目:学生选课系统

    程序要求:1.创建北京.上海两所学校(分析:通过学校类实例化两个学校实例) 2.创建Linux.python.go三个课程,Linux\go在北京开,Linux在上海开(创建Linux.python. ...

  7. 学生选课系统 c语言

    /********************************* *主题:学生选修课程系统设计 * *设计要求: *1.添加功能:程序能够任意添加课程和学生记录,可提供选择界面供用户选择所需要添加 ...

  8. JAVA分级测试——选课系统(补发)

    博客园似乎上传图片多了之后会出现各种问题,所以只能直接上代码了 <!DOCTYPE HTML> <html lang="zh"> <head> ...

  9. Javaweb实现简单的选课系统(主要技术包括jsp、Servlet、Javabean)

    一.背景信息: 首先,这个选课系统是上周一老师在课堂上让我们做的测试,考试时长三个小时,我只做了一半,也没有实现选课流程. 由于上周忙于写实验报告没有时间继续完成这个测试.这周用前天和昨天一共七个小时 ...

随机推荐

  1. php array_flip()函数 语法

    php array_flip()函数 语法 作用:用于反转/交换数组中所有的键名以及它们关联的键值.富瑞联华 语法:array_flip(array); 参数: 参数 描述 array 必需.规定需进 ...

  2. Go实现分布式外部排序

    Go实现分布式外部排序 项目路径: https://github.com/Draymonders/go_external_sort 默认读入文件: small.in 默认输出文件:small.out ...

  3. 笨办法学Python(learn python the hard way)--练习36-37

    练习37 1.Keywords(关键字) anddel fromnotwhileaselifglobal orwithassert elseifpass yield break except impo ...

  4. 10 Django与Ajax

    知识预览 1. Ajax 2. 文件上传 Ajax Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用J ...

  5. CentOS7 安装Kafka

    关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service 安装JDK yum install -y http ...

  6. 查看Oracle数据库中的执行计划

    1.set autotrace traceonly命令 2.explain plan for命令 1)explain plan for select * from dual; 2)select * f ...

  7. (转)Jquery之ShowLoading遮罩组件

    本文转载自:http://www.cnblogs.com/eczhou/archive/2012/12/18/2822788.html 一.遮罩用途及效果 ShowLoading这个jQuery插件设 ...

  8. Week1 - 169.Majority Element

    这周刚开始讲了一点Divide-and-Conquer的算法,于是这周的作业就选择在LeetCode上找分治法相关的题目来做. 169.Majority Element Given an array ...

  9. 【Unity】给物品添加力

    给物体添加力 两个方法: Rigidbody.AddForce(Vector3,ForceMode):给刚体添加一个力,让刚体按世界坐标系进行运动 Rigidbody.AddRelativeForce ...

  10. yolov--7--解决报错:/bin/sh: 1: nvcc: not found make: *** [obj/convolutional_kernels.o] Error 127

    1.配置darknet配置darknet出现错误: qhy@qhy-desktop:~/darknet$ make cleanqhy@qhy-desktop:~/darknet$ make……gcc ...