python第三十二,三十三课---选课系统代码总结

昨日内容回顾

  • 校验用户是否登录装饰器

    1.无参装饰器
    2.有参装饰器
    
  • 管理员创建学校

    第一层
    	获取学校名称、学校地址
     	调用第二层接口传(学校名称 学校地址 管理员姓名)
    第二层
    	先创建学校类(父类抽取与继承)
     	利用学校类查询学校是否已存在
     	获取管理员对象 让管理员对象调用创建学校的方法
    
  • 管理员创建课程

    第一层
    	获取所有的学校名称让管理员选择
    	确定好学校名称之后获取课程相关信息
     	调用第二层接口传入(学校名称 课程名称 价格 周期 管理员姓名)
    第二层
    	先获取学校对象查看是否已有该课程
     	获取管理员对象调用创建课程的方法
    	学校对象修改课程列表添加课程名称并保存
    
  • 管理员创建讲师

    第一层
    	获取讲师姓名 调用第二层创建讲师接口(传讲师姓名 管理员姓名)
    第二层
    	创建讲师类
     	利用讲师类查询老师是否已存在
     	获取管理员对象调用创建讲师的方法
    
  • 学员注册功能

    同管理员注册功能
    
  • 学员登录功能

    同管理员登录功能
    
  • 学员选择学校

    第一层
    	获取所有学校的名称
    	调用第二层接口传(学校名称 学生姓名)
    第二层
    	获取学校判断是否有
    	获取学生对象判断是否已选
    	修改学生对象中的学校属性并保存
    

今日内容概要

  • 学生选择课程
  • 学生查看分数
  • 讲师登录功能
  • 讲师查看课程
  • 讲师选择课程
  • 讲师查看分数
  • 讲师修改分数
  • 项目总结

今日内容详细

总结

1.学生选择课程
	第一层
    	获取当前学生的学校信息
  		 获取学校下的课程信息(重复添加)
  		调用第二层接口传(课程名称 学生姓名)
	第二层
    	获取学生对象添加课程信息
 		获取课程对象添加学生信息
     	上述两个对象都需要保存
2.学生查看分数
	第一层
    	调用第二层接口传学生姓名
 	第二层
    	获取学生对象返回对象内的课程成绩字典
...


重点是在管理员功能
学生功能是体会封装架构的魅力
讲师功能是锻炼逻辑思维和代码CV能力

选课系统ccs代码整理:

start.py 代码

import os
import sys
from core import src

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

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

.
src.py 代码

from core import admin_view, student_view, teacher_view

module_dict = {
    '1': admin_view,
    '2': student_view,
    '3': teacher_view
}

def run():
    while True:
        print("""
        ________选课系统总视图_______
        1.管理员视图
        2.学生视图
        3.老师视图
        ___________________________
        """)
        choice_num = input('请输入要选择的视图编号>>>>>:').strip()
        if choice_num in module_dict:
            module_dict.get(choice_num).run()
        else:
            print('暂无该功能编号')

.
.
.
admin_view.py 代码

from interface import admin_interface
from lib import common

is_login = {'username': ''}


def register():
    username = input('请输入用户名>>>>:').strip()
    password = input('请输入密码>>>:').strip()
    ag_pwd = input('请再次输入密码>>>:').strip()
    if not password == ag_pwd:
        print('两次密码不一致!!')
        return
    flag, msg = admin_interface.register_interface(username, password)
    print(msg)
    # 结束


def login():
    username = input('请输入用户名>>>>:').strip()
    password = input('请输入密码>>>:').strip()
    flag, msg = admin_interface.login_interface(username, password)
    if flag:
        is_login['username'] = username  # 修改全局字典
    print(msg)
    # 注册写完了,开始准备写装饰器


@common.login_auth('admin')
def creat_school():
    admin_username = is_login['username']
    # 1.获取创建学校相关信息
    school_name = input('请输入学校名字>>>>:').strip()
    address = input('请输入学校地址>>>>:').strip()
    # 2.调创建学校的接口
    flag, msg = admin_interface.creat_school_interface(school_name, address, admin_username)
    print(msg)
    # 创建学校写完了


@common.login_auth('admin')
def creat_course():
    admin_username = is_login['username']
    # 1.课程需要跟学校绑定 所以我们可以先获取所有学校名字的列表 然后选择学校 最后创建课程
    flag, school_name_list = admin_interface.get_school_name_list()
    if not flag:
        print(school_name_list)  # '暂无学校,请先创建学校'
        return  # 不要忘了!!!
    while True:
        for num, school_name in enumerate(school_name_list, start=1):  # 循环打印学校
            print(f"学校编号:{num}      |     学校名称:{school_name}")
        choice_num = input('请输入要选择的学校编号(q)>>>>:').strip()  # 对输入的编号进行两个小判断
        if choice_num == 'q':
            return
        if not choice_num.isdigit():
            print('请输入纯数字!!!')
            continue
        choice_num = int(choice_num)
        if choice_num not in range(1, len(school_name_list) + 1):
            print('没有该编号对应的学校!!')
            continue
        target_school_name = school_name_list[choice_num-1]  # 获取学校名称
        # 2.获取创建课程相关信息
        course_name = input('请输入课程名字>>>>:').strip()  # python脱产班_一期_XX学校  python脱产班_二期_XX学校
        course_price = input('请输入课程价格>>>>:').strip()
        course_period = input('请输入课程周期>>>>:').strip()
        # 3.调创建学校的接口
        flag, msg = admin_interface.creat_course_interface(target_school_name,
                                                           course_name,
                                                           course_price,
                                                           course_period,
                                                           admin_username)
        print(msg)
        # 创建课程结束


@common.login_auth('admin')
def creat_teacher():
    admin_username = is_login['username']
    # 1. 老师不用和学校绑定,所以不用先选学校了,直接获取要创建的老师姓名,调接口
    teacher_name = input('请输入要创建老师的用户名').strip()
    flag, msg = admin_interface.creat_teacher_interface(teacher_name, admin_username)
    print(msg)
    # 创建老师结束


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


def run():
    while True:  # 别忘了加个q退出管理员视图功能
        print("""
        -------------管理员视图----------------
        1.注册功能
        2.登录功能
        3.创建学校功能
        4.创建课程功能
        5.创建老师功能
        ----------------end------------------
        """)
        choice_num = input('请输入要执行的功能编号(q)>>>>>:').strip()
        if choice_num == 'q':
            return
        if choice_num in func_dict:
            func_dict.get(choice_num)()
        else:
            print('没有您要执行的功能编号!!')

.
.
.
student_view.py 代码

from interface import student_interface
from lib import common


is_login = {'username': ''}


def register():
    username = input('请输入用户名>>>>:').strip()
    password = input('请输入密码>>>:').strip()
    ag_pwd = input('请再次输入密码>>>:').strip()
    if not password == ag_pwd:
        print('两次密码不一致!!')
    flag, msg = student_interface.register_interface(username, password)
    print(msg)
    # 结束


def login():
    username = input('请输入用户名>>>>:').strip()
    password = input('请输入密码>>>:').strip()
    flag, msg = student_interface.login_interface(username, password)
    if flag:
        is_login['username'] = username  # 修改全局字典
    print(msg)


# 选择学校
@common.login_auth('student')
def choice_school():
    student_name = is_login['username']
    # 调接口拿学校列表
    flag, school_name_list = student_interface.get_school_name_list()
    if not flag:
        print(school_name_list)
        return
    while True:
        for num, school_name in enumerate(school_name_list, start=1):
            print(f"学校编号:{num}      |     学校名称:{school_name}")
        choice_num = input('请输入要选择的学校编号>>>>:').strip()  # 对输入的编号进行两个小判断
        if not choice_num.isdigit():
            print('请输入纯数字!!!')
            continue
        choice_num = int(choice_num)
        if choice_num not in range(1, len(school_name_list) + 1):
            print('没有该编号对应的学校!!')
            continue
        target_school_name = school_name_list[choice_num-1]  # 获取学校名称
        # 调用接口完成学校选择
        flag, msg = student_interface.choice_school_interface(target_school_name,student_name)
        print(msg)
        return


# 选择课程
@common.login_auth('student')
def choice_course():
    student_name = is_login['username']
    # 选择课程时要先确定学生有没有选择学校,课程是与学校绑定的!!!  先拿学校名,再拿学校里面的课程列表!!,选择课程,保存
    flag, school_name = student_interface.get_school_name(student_name)
    if not flag:
        print(school_name)  # '您还没选学校了!!'
        return
    flag1, course_list = student_interface.get_course_list(school_name)
    if not flag1:
        print(course_list)  # 该学校下,暂无课程,请联系管理员添加!!


    temp_course_list = []  # 定义一个临时空课程列表
    while True:
        for num, course_name in enumerate(course_list, start=1):
            print(f"课程编号:{num}      |     课程名称:{course_name}")
        choice_num = input('请输入要选择的课程编号(q)>>>>:').strip()  # 对输入的编号进行两个小判断
        # 第二部分
        if choice_num == 'q':
            if not temp_course_list:
                print('你什么都没选 无法添加课程')
                continue
            # 老师退出选课,一次性将临时课程列表传递给第二层
            flag, msg = student_interface.choice_course_interface(temp_course_list, student_name)
            print(msg)
            return

        # 第一部分
        if not choice_num.isdigit():
            print('请输入纯数字!!!')
            continue
        choice_num = int(choice_num)
        if choice_num not in range(1, len(course_list) + 1):
            print('没有该编号对应的课程!!')
            continue
        target_course_name = course_list[choice_num-1]  # 获取课程名称
        # 临时保存学生选择的课程名称 一旦退出选课再一次性传给第二层
        if target_course_name in temp_course_list:
            print('该课程你刚刚已经添加,无需再次添加!!')
            continue
        temp_course_list.append(target_course_name)
        print(f"您选择的课程{temp_course_list}已添加到临时课程列表中")
        # 结束


# 查看分数
@common.login_auth('student')
def check_score():
    student_name = is_login['username']
    flag, msg = student_interface.check_score_interface(student_name)
    print(msg)
    # 结束


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


def run():
    while True:  # 别忘了加个q退出管理员视图功能
        print("""
        -------------学生视图----------------
        1.学生注册功能
        2.学生登录功能
        3.选择学校功能
        4.选择课程功能
        5.查看分数功能
        ----------------end------------------
        """)
        choice_num = input('请输入要执行的功能编号(q)>>>>>:').strip()
        if choice_num == 'q':
            return
        if choice_num in func_dict:
            func_dict.get(choice_num)()
        else:
            print('没有您要执行的功能编号!!')

.
.
.
teacher_view.py 代码

from interface import teacher_interface
from lib import common

is_login = {'username': ''}


def login():
    username = input('请输入用户名>>>>:').strip()
    password = input('请输入密码>>>:').strip()
    flag, msg = teacher_interface.login_interface(username, password)
    if flag:
        is_login['username'] = username  # 修改全局字典
    print(msg)


# 讲师查看课程
@common.login_auth('teacher')
def check_course():
    teacher_name = is_login['username']
    # 1.课程需要跟学校绑定 所以我们可以先获取所有学校名字的列表 然后选择学校 最后创建课程
    flag, school_name_list = teacher_interface.get_school_name_list()  # 获取学校列表
    if not flag:
        print(school_name_list)  # '暂无学校,请先创建学校'
        return  # 不要忘了!!!
    while True:
        for num, school_name in enumerate(school_name_list, start=1):  # 循环打印学校
            print(f"学校编号:{num}      |     学校名称:{school_name}")
        choice_num = input('请输入要选择的学校编号(q)>>>>:').strip()  # 对输入的编号进行两个小判断
        if choice_num == 'q':
            return
        if not choice_num.isdigit():
            print('请输入纯数字!!!')
            continue
        choice_num = int(choice_num)
        if choice_num not in range(1, len(school_name_list) + 1):
            print('没有该编号对应的学校!!')
            continue
        target_school_name = school_name_list[choice_num - 1]  # 获取学校名称
        # 调接口获取课程列表
        flag, course_list = teacher_interface.get_school_course_list(target_school_name)
        if not flag:
            print(course_list)  # '该学校下暂无课程!!!'
            return
        print('------------------课程名称如下------------------------')
        for course_id, course_name in enumerate(course_list, start=1):
            print(f"课程编号:{course_id}     |   课程名称:{course_name}")
        print('----------------------------------------------')
        print('-------------------end------------------------')


# 讲师选择课程
@common.login_auth('teacher')
def choice_course():  # 展示所有的名称供老师选择
    teacher_name = is_login['username']
    flag, course_name_list1 = teacher_interface.get_course_list()
    if not flag:
        print(course_name_list1)  # '当前系统没有任何课程,请联系管理员添加!!'
        return
    temp_course_name_list = []
    while True:
        for num, course_name in enumerate(course_name_list1, start=1):
            print(f"课程编号:{num}      |     课程名称:{course_name}")
        choice_num = input('请输入要选择的课程编号(q)>>>>:').strip()  # 对输入的编号进行两个小判断
        # 第二部分
        if choice_num == 'q':
            if not temp_course_name_list:
                print('你什么都没选 无法添加课程')
                continue
            # 学生退出选课,一次性将临时课程列表传递给第二层
            flag, msg = teacher_interface.choice_course_interface(temp_course_name_list, teacher_name)
            print(msg)
            return
        # 第一部分
        if not choice_num.isdigit():
            print('请输入纯数字!!!')
            continue
        choice_num = int(choice_num)
        if choice_num not in range(1, len(course_name_list1) + 1):
            print('没有该编号对应的课程!!')
            continue
        target_course_name = course_name_list1[choice_num - 1]  # 获取课程名称
        # 临时保存学生选择的课程名称 一旦退出选课再一次性传给第二层
        if target_course_name in temp_course_name_list:
            print('该课程你刚刚已经添加,无需再次添加!!')
            continue
        temp_course_name_list.append(target_course_name)
        print(f"您选择的课程{temp_course_name_list}已添加到临时课程列表中")
        # 结束


@common.login_auth('teacher')
def check_score():
    teacher_name = is_login['username']
    # 获取自己教授下的课程下的所有学生成绩
    flag, course_name_list = teacher_interface.get_teach_course_list(teacher_name)
    if not flag:
        print(course_name_list)  # '您暂无选择教授任何课程!!!'
        return
    while True:
        for num, course_name in enumerate(course_name_list, start=1):
            print(f"课程编号:{num}      |     课程名称:{course_name}")
        choice_num = input('请输入要选择的课程编号(q)>>>>:').strip()  # 对输入的编号进行两个小判断
        # 第二部分
        if choice_num == 'q':
            return
        # 第一部分
        if not choice_num.isdigit():
            print('请输入纯数字!!!')
            continue
        choice_num = int(choice_num)
        if choice_num not in range(1, len(course_name_list) + 1):
            print('没有该编号对应的课程!!')
            continue
        target_course_name = course_name_list[choice_num - 1]  # 获取课程名称
        # 调用接口,获取学生名单,并获取成绩
        flag, student_list = teacher_interface.get_student_list_interface(target_course_name)
        if not flag:
            print(student_list)  # '该课程下暂无学生,无法查看成绩'
            return
        flag, all_student_score1 = teacher_interface.get_score_interface(student_list)
        print(all_student_score1)


# 修改学生分数
@common.login_auth('teacher')
def update_score():
    teacher_name = is_login['username']
    # 获取自己教授下的课程下的所有学生成绩
    flag, course_name_list = teacher_interface.get_teach_course_list(teacher_name)
    if not flag:
        print(course_name_list)  # '您暂无选择教授任何课程!!!'
        return
    print(course_name_list)  # '这个地方没问题!!能正常拿到课程列表'
    while True:  # 拿到课程列表,枚举选择出目标课程
        for num, course_name in enumerate(course_name_list, start=1):
            print(f"课程编号:{num}      |     课程名称:{course_name}")
        choice_course_num = input('请输入要选择的课程编号(q)>>>>:').strip()  # 对输入的编号进行两个小判断
        # 第二部分
        if choice_course_num == 'q':
            return
        # 第一部分
        if not choice_course_num.isdigit():
            print('请输入纯数字!!!')
            continue
        choice_course_num = int(choice_course_num)
        if choice_course_num not in range(1, len(course_name_list) + 1):
            print('没有该编号对应的课程!!')
            continue
        target_course_name = course_name_list[choice_course_num - 1]  # 获取课程名称
        print(target_course_name)  # '目标课程拿的没问题!!!'
        # 调用接口,获取学生名单,并获取成绩
        flag, student_list = teacher_interface.get_student_list_interface(target_course_name)
        if not flag:
            print(student_list)  # '该课程下暂无学生,无法查看成绩'
            continue
        student_list1 = set(student_list)
        student_list = list(student_list1)   # 这个地方要用集合去一下重,课程下面学生的名字会有重复的!!!
        while True:  # 拿到学生列表,枚举选出目标学生
            for num, student_name in enumerate(student_list, start=1):
                print(f"学生编号:{num}      |     学生名称:{student_name}")
            choice_num1 = input('请输入要选择的学生编号(q)>>>>:').strip()  # 对输入的编号进行两个小判断
            # 第二部分
            if choice_num1 == 'q':
                break
            # 第一部分
            if not choice_num1.isdigit():
                print('请输入纯数字!!!')
                continue
            choice_num1 = int(choice_num1)
            if choice_num1 not in range(1, len(student_list) + 1):
                print('编号超出了范围!!')
                continue
            target_student_name = student_list[choice_num1 - 1]  # 获取学生名称
            print(target_student_name)
            target_course_score = input('请输入当前课程下,当前学生要修改的分数>>>:').strip()
            # 调用接口
            print(target_student_name)
            flag, msg = teacher_interface.update_score_interface(target_student_name,
                                                                 target_course_name,
                                                                 target_course_score,
                                                                 teacher_name)
            print(msg)


func_dict = {
    '1': login,
    '2': check_course,
    '3': choice_course,
    '4': check_score,
    '5': update_score
}


def run():
    while True:  # 别忘了加个q退出管理员视图功能
        print("""
        -------------讲师视图----------------
        1.讲师登录功能
        2.讲师查看课程功能
        3.讲师选择课程功能
        4.讲师查看分数功能
        5.讲师修改分数功能
        ----------------end------------------
        """)
        choice_num = input('请输入要执行的功能编号(q)>>>>>:').strip()
        if choice_num == 'q':
            return
        if choice_num in func_dict:
            func_dict.get(choice_num)()
        else:
            print('没有您要执行的功能编号!!')

.
.
.
admin_interface.py 代码

from db import models
from lib import common

logger = common.get_logger('管理员视图')


def register_interface(username, password):
    # 1.判断该管理员用户名的文件是否存在,肯定要调models里面方法,所以该方法绑定给类就比较好调了
    user_obj = models.Admin.select_obj(username)
    if user_obj:
        return False, f"当前管理员用户名{username}已存在"
    # 2.密码加密
    hash_pwd = common.get_hash(password)
    # 3.创建管理员对象并保存,__init__里面有保存对象功能!!
    models.Admin(username, hash_pwd)
    logger.debug(f"管理员{username}注册成功")
    return True, f"管理员{username}注册成功"


def login_interface(username, password):
    # 1.判断该管理员用户名的文件是否存在
    user_obj = models.Admin.select_obj(username)
    if not user_obj:
        return False, f"该管理员用户名{username}不存在!!"
    if not user_obj.pwd == common.get_hash(password):
        return False, f"该管理员用户的密码不正确!!"
    logger.debug(f"该管理员用户{username}登录成功!!")
    return True, f"该管理员用户{username}登录成功!!"

.
.
.
student_interface.py 代码

from lib import common
from db import models

logger = common.get_logger('学生视图模块')


# 学生注册  密码就不加密了
def register_interface(username, password):
    student_obj = models.Student.select_obj(username)
    if student_obj:
        return False, f"学生用户名{username}已存在 !!"
    models.Student(username, password)
    logger.debug(f"学生{username}账号,注册成功 !!")
    return True, f"学生{username}账号,注册成功 !!"


def login_interface(username, password):
    student_obj = models.Student.select_obj(username)
    if not student_obj:
        return False, f"学生用户名{username}不存在 !!"
    if not student_obj.pwd == password:
        return False, f"密码不正确 !!"
    logger.debug(f"学生{username}账号,登录成功 !!")
    return True, f"学生{username}账号,登录成功 !!"


def get_school_name_list():
    school_name_list = models.School.select_subdir_all_file_list()
    if not school_name_list:
        return False, '学校还未创建,联系管理员创建学校'
    return True, school_name_list


# 选择学校接口
def choice_school_interface(target_school_name, student_name):
    student_obj = models.Student.select_obj(student_name)
    if student_obj.school:
        return False, f'您已选过学校了!!'
    student_obj.school = target_school_name
    student_obj.save_obj()
    logger.debug(f"学生{student_name},选择{target_school_name}成功 !!")
    return True, f"学生{student_name},选择{target_school_name}成功 !!"


def get_school_name(student_name):
    student_obj = models.Student.select_obj(student_name)
    school_name = student_obj.school
    if not school_name:
        return False, f'您还没选学校了!!'
    return True, school_name


def get_course_list(school_name):
    school_obj = models.School.select_obj(school_name)
    course_list = school_obj.course_list
    if not course_list:
        return False, f'该学校下,暂无课程,请联系管理员添加!!'
    return True, course_list


def choice_course_interface(temp_course_list, student_name):
    # 获取学生对象,并查看学生的课程列表,与传进来的课程列表利用集合求并集并去重,
    # 再转回列表重新赋值给学生对象的课程列表
    student_obj = models.Student.select_obj(student_name)
    old_course_set_list = set(student_obj.course_list)
    temp_course_set_list = set(temp_course_list)
    student_obj.course_list = list(old_course_set_list | temp_course_set_list)
    buji_course_list = list(temp_course_set_list - old_course_set_list)  # 新的减老的,把和老的课程列表里面相同的课程剃掉
    # 再把学生成绩字典一起初始化后,保存学生对象,下面这行代码有bug,
    # 假如学生有个课程已经有成绩了,用并集拿到课程列表里面有原来有成绩的课程,用字典生成式就会把有成绩的结果改成'暂无成绩'
    # student_obj.score_dict = {i:'暂无成绩' for i in student_obj.course_list}
    for i in buji_course_list:
        student_obj.score_dict[i] = '暂无成绩'     # 这样就可以只将新添加的课程初始化一下成绩,原来老的已有成绩的课程不会被改掉!!
    student_obj.save_obj()
    # 课程绑定学生,学生所选的所有的课,课程对象里面的学生列表里面都要添加该学生
    # 需要for循环
    for course_name in student_obj.course_list:
        course_obj = models.Course.select_obj(course_name)
        course_obj.student_list.append(student_name)
        course_obj.save_obj()
    logger.debug(f"学生{student_name},已选择了课程{student_obj.course_list}")
    return True, f"学生{student_name},已选择了课程{student_obj.course_list}"


def check_score_interface(student_name):
    student_obj = models.Student.select_obj(student_name)
    if not student_obj.score_dict:
        return False, '你还没有选择课程 赶紧去选 快开学了 来不及了!!!'
    return True, student_obj.score_dict

.
.
.
teacher_interface.py 代码

from lib import common
from db import models

logger = common.get_logger('讲师模块')


def login_interface(username, password):
    # 1.判断该讲师用户名的文件是否存在
    teacher_obj = models.Teacher.select_obj(username)
    if not teacher_obj:
        return False, f"该讲师用户名{username}不存在!!"
    if not teacher_obj.pwd == password:
        return False, f"该讲师用户的密码不正确!!"
    logger.debug(f"该讲师用户{username}登录成功!!")
    return True, f"该讲师用户{username}登录成功!!"


# 获取学校名字的列表
def get_school_name_list():  # 注意不要忘了小判断
    school_name_list = models.School.select_subdir_all_file_list()
    if not school_name_list:
        return False, '暂无学校,请先创建学校'
    return True, school_name_list


def get_school_course_list(target_school_name):
    school_obj = models.School.select_obj(target_school_name)
    course_list1 = school_obj.course_list
    if not course_list1:
        return False, '该学校下暂无课程!!!'
    return True, course_list1


def get_course_list():
    course_name_list = models.Course.select_subdir_all_file_list()
    if not course_name_list:
        return False, '当前系统没有任何课程,请联系管理员添加!!'
    return True, course_name_list


def choice_course_interface(temp_course_name_list, teacher_name):
    # 获取老师对象,并查看老师的课程列表,与传进来的课程列表利用集合求并集并去重,
    # 再转回列表重新赋值给学生对象的课程列表
    teacher_obj = models.Teacher.select_obj(teacher_name)
    old_course_set_list = set(teacher_obj.course_list)
    temp_course_set_list = set(temp_course_name_list)
    teacher_obj.course_list = list(old_course_set_list | temp_course_set_list)
    teacher_obj.save_obj()
    # 课程绑定老师,老师所选的所有的课,课程对象里面的老师列表里面都要添加该老师
    # 需要for循环
    for course_name in teacher_obj.course_list:
        course_obj = models.Course.select_obj(course_name)
        course_obj.teacher_list.append(teacher_name)
        course_obj.save_obj()
    logger.debug(f"老师:{teacher_name},已选择教授的课程为:{teacher_obj.course_list}")
    return True, f"老师:{teacher_name},已选择教授的课程为:{teacher_obj.course_list}"


def get_teach_course_list(teacher_name):
    teacher_obj = models.Teacher.select_obj(teacher_name)
    course_list1 = teacher_obj.course_list
    if not course_list1:
        return False, '您暂无选择教授任何课程!!!'
    return True, course_list1


def get_student_list_interface(target_course_name):
    course_obj = models.Course.select_obj(target_course_name)
    student_list1 = course_obj.student_list
    if not student_list1:
        return False, '该课程下暂无学生,无法查看成绩'
    return True, student_list1


def get_score_interface(student_list):
    all_student_score = {name: models.Student.select_obj(name).score_dict for name in student_list}
    # all_teach_score ={}
    # for name in student_list:
    #     all_teach_score[name] = models.Student.select_obj(name).score_dict
    return True, all_student_score


def update_score_interface(student_name, course_name, course_score, teacher_name):
    print(student_name)
    student_obj = models.Student.select_obj(student_name)
    student_obj.score_dict[course_name] = course_score
    student_obj.save_obj()
    return True, f"讲师:{teacher_name},已将学生:{student_name},课程:{course_name}成绩修改为:{course_score}"

.
.
.
common.py 代码

import logging
import logging.config
import conf.settings
import hashlib


# 加密器
def get_hash(msg):
    md5 = hashlib.md5()
    md5.update(msg.encode('utf8'))
    hash_msg = md5.hexdigest()
    return hash_msg


# 日志器
def get_logger(msg):
    from conf import settings
    logging.config.dictConfig(settings.LOGGING_DIC)  # 自动加载字典中的配置
    logger1 = logging.getLogger(msg)
    return logger1

# 装饰器
def login_auth(user_type):  # 装饰器优化版(把模块名弄成一个字典!!)
    def outer(func):
        def inner(*args, **kwargs):
            from core import admin_view, student_view, teacher_view
            module_dict = {
                'admin': admin_view,
                'student': student_view,
                'teacher': teacher_view
            }
            if user_type not in module_dict:
                print('暂无该视图 登录校验功能')
                return
            module_name = module_dict.get(user_type)  # 拿到模块名
            if module_name.is_login['username']:
                res = func(*args, **kwargs)
                return res
            else:
                print('您暂无登录 请先完成登录')
                module_name.login()
        return inner

    return outer

.
.
.
日志器(代码不用看,直接复制粘贴即可)

import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
DB_DIR = os.path.join(BASE_DIR, 'db')


standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'  # 其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

# 自定义文件路径
LOG_DIR = os.path.join(BASE_DIR, 'log')
if not os.path.isdir(LOG_DIR):
    os.mkdir(LOG_DIR)
LOGFILE_PATH = os.path.join(LOG_DIR, 'ccs.log')      # 日志文件的名字

# log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},  # 过滤日志
    'handlers': {
        # 打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        # 打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': LOGFILE_PATH,  # 日志文件
            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        # logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
        # '购物车记录': {
        #     'handlers': ['default','console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
        #     'level': 'WARNING',
        #     'propagate': True,  # 向上(更高level的logger)传递
        # },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
    },
}

.
.
.
最重要的文件
db_handler.py 代码

import os
from conf import settings
import pickle


# 利用类名与类的对象的用户名,去查询对象是否存在
def select(cls, username):
    db_subdir_path = os.path.join(settings.DB_DIR, cls.__name__)
    if not os.path.exists(db_subdir_path):
        os.mkdir(db_subdir_path)
    obj_file_path = os.path.join(db_subdir_path, username)
    if os.path.exists(obj_file_path):
        with open(obj_file_path, 'rb')as f:  # 读
            return pickle.load(f)


# 对象保存功能
def save(obj):
    db_subdir_path = os.path.join(settings.DB_DIR, obj.__class__.__name__)
    if not os.path.exists(db_subdir_path):
        os.mkdir(db_subdir_path)
    obj_file_path = os.path.join(db_subdir_path, obj.name)
    with open(obj_file_path, 'wb')as f:  # 写
        pickle.dump(obj, f)


# 获取db分目录下所有文件名称功能
def select_all_file_list(cls):
    db_subdir_path = os.path.join(settings.DB_DIR, cls.__name__)
    return os.listdir(db_subdir_path)

.
.
.
最重要的文件
models.py 代码

from db import db_handler


class Bases:
    def save_obj(self):
        db_handler.save(self)

    @classmethod
    def select_obj(cls, username):
        return db_handler.select(cls, username)

    @classmethod
    def select_subdir_all_file_list(cls):
        return db_handler.select_all_file_list(cls)


class Admin(Bases):
    def __init__(self, admin_name, pwd):
        self.name = admin_name
        self.pwd = pwd
        self.save_obj()

    def creat_school(self, school_name, address):
        School(school_name, address)

    def creat_course(self, course_name, course_price, course_period):
        Course(course_name, course_price, course_period)

    def creat_teacher(self, teacher_name, pwd='123'):
        Teacher(teacher_name, pwd='123')


class School(Bases):
    def __init__(self, school_name, address):
        self.name = school_name
        self.pwd = address
        self.course_list = []
        self.save_obj()


class Course(Bases):
    def __init__(self, course_name, course_price, course_period):
        self.name = course_name
        self.price = course_price
        self.period = course_period
        self.student_list = []   # 选择学该课学生列表
        self.teacher_list = []   # 选择教授该课的老师列表
        self.save_obj()


class Teacher(Bases):
    def __init__(self, teacher_name, pwd='123'):
        self.name = teacher_name
        self.pwd = pwd
        self.course_list = []   # 老师选择教授的课程列表
        self.save_obj()


class Student(Bases):
    def __init__(self, student_name, pwd):
        self.name = student_name
        self.pwd = pwd
        self.school = None
        self.course_list = []   # 学生选择学习的课程列表
        self.score_dict = {}    # 学生所有学习课程的成绩字典{'kc1':'cj1','kc2':'cj2'}
        self.save_obj()

有空写个选课系统的代码总结:

posted @   tengyifan  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示