选课系统项目
选课系统需求
https://www.cnblogs.com/kermitjam/p/11356270.html
结构图
文件
1.conf/settings
import os BASE_PATH = os.path.dirname( os.path.dirname(__file__) ) DB_PATH = os.path.join( BASE_PATH, 'db' )
2.core/admin_view
''' 管理员视图 ''' 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() re_password = input('请确认密码:').strip() if password == re_password: # 调用管理员注册接口 flag, msg = admin_interface.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, 'admin' ) if flag: # print(admin_info) admin_info['user'] = username # print(admin_info) print(msg) break else: print(msg) # 管理员创建学校 @common.login_auth('admin') def create_school(): while True: # 1.管理员输入 学校名称 与 学校地址 school_name = input('请输入学校名称:').strip() school_addr = input('请输入学校地址:').strip() # 2.调用创建学校接口,并传入 学校名称 与 学校地址 以及管理员名称 # (管理员名称,用来获取管理员对象,并调用创建学校方法。) flag, msg = admin_interface.create_school_interface( school_name, school_addr, admin_info.get('user') ) if flag: print(msg) break else: print(msg) # 管理员创建课程 @common.login_auth('admin') def create_course(): while True: # 1.获取所有学校,让管理员选择 # 判断学校是否存在 school_list = common_interface.check_school_interface() if not school_list: print('没有可选择的学校,请先创建学校!') break for index, school_name in enumerate(school_list): print(index, school_name) choice = input('请输入选择的学校编号: ').strip() if not choice.isdigit(): continue choice = int(choice) if choice not in range(len(school_list)): continue school_name = school_list[choice] # 2.选择完学校后,输入课程的名称 course_name = input('请输入课程名称:').strip() # 3.调用创建课程接口,并保存课程对象 flag, msg = admin_interface.create_course_interface( school_name, course_name, admin_info.get('user') ) if flag: print(msg) break else: print(msg) # 管理员创建老师 @common.login_auth('admin') def create_teacher(): while True: teacher_name = input('请输入老师名称: ').strip() # 1.调用创建老师接口,保存老师 flag, msg = admin_interface.create_teacher_interface( teacher_name, admin_info.get('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 view(): while True: print(''' ----- 欢迎来到管理员视图 ----- 1.注册 2.登陆 3.创建学校 4.创建课程 5.创建老师 ''') choice = input('请输入编号进入视图:').strip() if choice == 'q': break if choice not in func_dic: continue func_dic.get(choice)()
core/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.老师视图 ''') choice = input('请输入编号进入视图:').strip() if choice == 'q': break if choice not in func_dic: continue func_dic.get(choice)()
core/student_view
''' 学生视图 ''' 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() re_password = input('请确认密码:').strip() if password == re_password: # 调用管理员注册接口 flag, msg = student_interface.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, 'student' ) if flag: # print(admin_info) student_info['user'] = username # print(admin_info) print(msg) break else: print(msg) # 学生选择学校 @common.login_auth('student') def choose_school(): while True: # 1.获取所有的学校,并且打印让学生选择 school_list = common_interface.check_school_interface() if not school_list: print('没有可选择的学校,请先创建学校!') break for index, school_name in enumerate(school_list): print(index, school_name) choice = input('请输入选择的学校编号: ').strip() if choice == 'q': break if not choice.isdigit(): continue choice = int(choice) if choice not in range(len(school_list)): continue school_name = school_list[choice] # 2.调用学生接口中的 选择学校接口 flag, msg = student_interface.choose_school_interface( school_name, student_info.get('user') ) if flag: print(msg) break else: print(msg) # 学生选择课程功能 @common.login_auth('student') def choose_course(): while True: # 1.获取当前对象的 学校中 所有的课程 flag, course_list_or_msg = student_interface.get_course_list_interface( student_info.get('user')) if not flag: print(course_list_or_msg) break # 2.打印课程,选择课程名称 for index, course_name in enumerate(course_list_or_msg): print(index, course_name) choice = input('请输入选择的课程编号: ').strip() if choice == 'q': break if not choice.isdigit(): continue choice = int(choice) if choice not in range(len(course_list_or_msg)): continue course_name = course_list_or_msg[choice] # 3.调用学生选择课程接口 flag, msg = student_interface.choose_course_interface( course_name, student_info.get('user') ) 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')) 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、查看成绩 ''') choice = input('请输入编号进入视图:').strip() if choice == 'q': break if choice not in func_dic: continue func_dic.get(choice)()
core/teacher_view
''' 老师视图 ''' 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, 'teacher' ) if flag: # print(admin_info) teacher_info['user'] = username # print(admin_info) print(msg) break else: print(msg) # 查看老师教授的课程 @common.login_auth('teacher') def check_courses(): while True: flag, course_list_or_msg = teacher_interface.check_course_interface( teacher_info.get('user') ) if flag: print(course_list_or_msg) break else: print(course_list_or_msg) break # 选择教授的课程 @common.login_auth('teacher') def choose_course(): while True: # 1.先获取所有学校,选择学校 school_list = common_interface.check_school_interface() if not school_list: print('没有学校可以选择!') break for index, school_name in enumerate(school_list): print(index, school_name) choice = input('请输入学校编号: ').strip() if not choice.isdigit(): continue choice = int(choice) if choice not in range(len(school_list)): continue school_name = school_list[choice] # 2.通过学校获取所有课程,再选择教授课程 flag, course_list_or_msg = common_interface.check_course_from_school(school_name) # 3.打印所有的课程,让老师选择课程编号 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(): continue choice = int(choice) if choice not in range(len(course_list_or_msg)): continue course_name = course_list_or_msg[choice] # 4.调用选择教授课程接口 flag, msg = teacher_interface.choose_course_interface( course_name, teacher_info.get('user')) if flag: print(msg) break else: print(msg) # 查看老师课程下的学生 @common.login_auth('teacher') def check_student(): while True: # 1.获取老师中所有的课程,并选择 flag, course_list_or_msg = teacher_interface.check_course_interface( teacher_info.get('user')) if not flag: print(course_list_or_msg) break # 2.通过课程查看课程中所有的学生 for index, course_name in enumerate(course_list_or_msg): print(index, course_name) choice = input('请输入课程编号: ').strip() if not choice.isdigit(): continue choice = int(choice) if choice not in range(len(course_list_or_msg)): continue course_name = course_list_or_msg[choice] # 3.调用查看课程中所有学生接口 flag, student_list_or_msg = teacher_interface.check_student_interface( course_name, teacher_info.get('user') ) if flag: print(student_list_or_msg) break else: print(student_list_or_msg) # 修改学生分数 @common.login_auth('teacher') def change_score(): while True: # 1.获取老师中所有的课程,并选择 flag, course_list_or_msg = teacher_interface.check_course_interface( teacher_info.get('user')) if not flag: print(course_list_or_msg) break # 2.通过课程查看课程中所有的学生 for index, course_name in enumerate(course_list_or_msg): print(index, course_name) choice = input('请输入课程编号: ').strip() if not choice.isdigit(): continue choice = int(choice) if choice not in range(len(course_list_or_msg)): continue course_name = course_list_or_msg[choice] # 3.调用查看课程中所有学生接口 flag, student_list_or_msg = teacher_interface.check_student_interface( course_name, teacher_info.get('user') ) if not flag: print(student_list_or_msg) break # 4.先循环打印所有的学生,并选择学生编号,获取学生名字 for index, student_name in enumerate(student_list_or_msg): print(index, student_name) choice2 = input('请输入学生编号: ').strip() if not choice2.isdigit(): 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() # 课后作业1: 校验修改的分数是否是数字 score = int(score) # 课后作业2: 校验输入的成绩是否 > 100分 # 5.调用修改学生分数接口 flag, msg = teacher_interface.change_score_interface( student_name, course_name, score, teacher_info.get('user') ) if flag: print(msg) break func_dic = { '1': login, '2': check_courses, '3': choose_course, '4': check_student, '5': change_score, } def view(): while True: print(''' 1、登录 2、查看教授课程 3、选择教授课程 4、查看课程下学生 5、修改学生成绩 ''') choice = input('请输入编号进入视图:').strip() if choice == 'q': break if choice not in func_dic: continue func_dic.get(choice)()
3.db/db_handler (存取数据)
import os from conf import settings import pickle # 保存数据 def save(obj): # 保存对象的操作 # 1.拼接文件保存路径,想要当前的类当做文件夹,以对象的名称作为文件名 # admin_obj.__class__ --> Admin.__name__ ----> 'Admin' cls_name = obj.__class__.__name__ # 获取当前类所在的文件夹 dir_path = os.path.join( settings.DB_PATH, cls_name) # 若文件夹不存在,则创建文件夹 if not os.path.exists(dir_path): os.mkdir(dir_path) # 拼接当前用户文件的绝对路径 user_path = os.path.join( dir_path, obj.name ) # 将obj对象写入pickle文件中 with open(user_path, 'wb') as f: pickle.dump(obj, f) f.flush() # 查看数据 def select(cls, name): # 保存对象的操作 # 1.拼接文件保存路径,想要当前的类当做文件夹,以对象的名称作为文件名 # admin_obj.__class__ --> Admin.__name__ ----> 'Admin' cls_name = cls.__name__ # 获取当前类所在的文件夹 dir_path = os.path.join( settings.DB_PATH, cls_name) # 若文件夹不存在,则创建文件夹 if not os.path.exists(dir_path): os.mkdir(dir_path) # 拼接当前用户文件的绝对路径 user_path = os.path.join( dir_path, name ) # 若文件路径存在则查找对象 if os.path.exists(user_path): # 将obj对象写入pickle文件中 with open(user_path, 'rb') as f: obj = pickle.load(f) return obj
db/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) # 查看 数据(对象) 方法 @classmethod def select_obj_by_name(cls, name): obj = db_handler.select(cls, name) return obj # 管理员类 class Admin(Base): # admin_obj.save_obj(admin_obj) def __init__(self, name, pwd): self.name = name self.pwd = pwd # 管理员创建学校方法 def create_school(self, school_name, school_addr): # 创建对象方式一: # school_obj = School(school_name, school_addr) # school_obj.save_obj() # 创建对象方式二: School(school_name, school_addr) # 管理员创建课程方法 def create_course(self, school_name, course_name): # 1.调用课程类 创建课程对象 Course(school_name, course_name) # 2.获取学校对象,为学校对象中的课程列表添加课程 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 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.name = course_name self.school = school_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 # 学生类 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): # 1.添加课程 self.course_list.append(course_name) # 2.为新添加的课程设置初始分数 self.score[course_name] = 0 self.save_obj() # 3.获取课程对象,让课程对象调用添加学生方法 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 check_student_from_course(self, course_name): # 1.获取课程对象 course_obj = Course.select_obj_by_name(course_name) # 2.通过课程对象, 获取学生列表 student_list = course_obj.check_all_student() return student_list # 老师修改分数方法 def change_score(self, student_name, course_name, score): # 1.获取学生对象 student_obj = Student.select_obj_by_name(student_name) # 2.直接修改学生score属性 student_obj.score[course_name] = score student_obj.save_obj()
4.interface/admin_interface
from db import models # 管理员注册接口 def register_interface(username, password): # 查看对象是否存在 # obj or None obj = models.Admin.select_obj_by_name(username) # 创建 “管理员对象” ,让数据层中db_handler帮你保存 if not obj: # 开始创建对象 # 创建对象保存数据 admin_obj = models.Admin(username, password) admin_obj.save_obj() return True, f'用户[{username}]注册成功!' return False, '用户已存在!' # 创建学校接口 def create_school_interface(school_name, school_addr, admin_name): # 1.校验学校是否存在,若存在返回 学校已存在 school_obj = models.School.select_obj_by_name(school_name) if school_obj: return False, '学校已存在!' # 2.获取管理员对象 admin_obj = models.Admin.select_obj_by_name(admin_name) # 3.通过管理员对象 调用创建学校方法 admin_obj.create_school(school_name, school_addr) return True, '学校创建成功' # 创建课程接口 def create_course_interface(school_name, course_name, admin_name): # 1.先获取学校对象,判断 用户输入的课程 是否存在学校对象的课程列表中 school_obj = models.School.select_obj_by_name(school_name) if course_name in school_obj.course_list: # [course1, course2] return False, '课程已存在!' # 2.获取管理员对象,通过管理员对象调用创建课程方法 admin_obj = models.Admin.select_obj_by_name(admin_name) admin_obj.create_course(school_name, course_name) return True, '课程创建成功!' # 创建老师接口: 老师密码默认为 123 def create_teacher_interface(teacher_name, admin_name, pwd='123'): # 1.校验老师是否存在 teacher_obj = models.Teacher.select_obj_by_name(teacher_name) if teacher_obj: return False, '老师已存在!' # 2.不存在则创建老师, 由管理员创建老师 ---》调用管理员创建老师方法 admin_obj = models.Admin.select_obj_by_name(admin_name) admin_obj.create_teacher(teacher_name, pwd) return True, '老师创建成功!'
interface/common_interface
from conf import settings from db import models import os # 查看所有学校接口 def check_school_interface(): # 1.拼接所有学校存放的文件夹 school_dir = os.path.join( settings.DB_PATH, 'School' ) if os.path.exists(school_dir): # 2.获取文件夹中所有文件的名字 school_list = os.listdir(school_dir) return school_list # 公共登录接口 def login_interface(username, password, user_type): # 为了不冒黄色 obj = None if user_type == 'admin': # 1.判断用户是否存在 obj = models.Admin.select_obj_by_name(username) elif user_type == 'student': obj = models.Student.select_obj_by_name(username) elif user_type == 'teacher': obj = models.Teacher.select_obj_by_name(username) # 2.若不存在返回用户不存在 if not obj: return False, '用户不存在!' # 3.用户存在, 校验密码是否正确 # self.pwd if obj.pwd == password: return True, '登录成功!' else: return False, '密码错误!' # 查看学校中所有的课程接口 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 return False, '学校中没有课程!'
interface/student_interface
from db import models # 管理员注册接口 def register_interface(username, password): # 查看对象是否存在 # obj or None obj = models.Student.select_obj_by_name(username) # 创建 “管理员对象” ,让数据层中db_handler帮你保存 if not obj: # 开始创建对象 # 创建对象保存数据 admin_obj = models.Student(username, password) admin_obj.save_obj() return True, f'用户[{username}]注册成功!' return False, '用户已存在!' # 学生选择学校课程接口 def choose_school_interface(school_name, student_name): # 1.获取学生对象 student_obj = models.Student.select_obj_by_name(student_name) # 2.判断学生是否已经选择学校 if student_obj.school: return False, '已选择过学校了!' # 3.若不存在,则 调用学生对象中的 选择学校方法,添加学校 student_obj.add_school(school_name) return True, '学校添加成功!' # 获取当前学生中学校的所有课程 def get_course_list_interface(student_name): # 1.获取当前学生对象 student_obj = models.Student.select_obj_by_name(student_name) school_name = student_obj.school # 2.判断学生是否 选择了学校 if not school_name: return False, '请先选择学校' # 3.获取学校对象,获取学校对象中的课程列表 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_course_interface(course_name, student_name): # 1.获取学生对象, 获取学生课程列表 student_obj = models.Student.select_obj_by_name(student_name) course_list = student_obj.course_list # 2.判断当前课程是否存在 学生对象的课程列表中 if course_name in course_list: return False, '该课程已存在!' # 3.若不存在,则添加到课程列表中, 让学生对象调用添加课程方法 student_obj.add_course(course_name) return True, '添加课程成功!' # 查看学生成绩接口 def check_score_interface(student_name): # 1.获取学生对象 student_obj = models.Student.select_obj_by_name(student_name) # 2.将学生对象中的字典返回给视图层 return student_obj.score
interface/teacher_interface
from db import models # 查看老师下所有课程 def check_course_interface(teacher_name): # 1.获取老师对象 teacher_obj = models.Teacher.select_obj_by_name(teacher_name) # 2.由老师对象调用查看课程的方法 course_list = teacher_obj.check_all_course() if not course_list: return False, '该老师没有选择教授课程!' return True, course_list # 老师选择课程接口 def choose_course_interface(course_name, teacher_name): # 1.获取老师对象 teacher_obj = models.Teacher.select_obj_by_name(teacher_name) teacher_course_list = teacher_obj.course_list # 2.判断该课程是否存在 if course_name in teacher_course_list: return False, '该课程已存在' # 3.若不存在,则让老师对象 调用添加课程方法,老师添加课程。 teacher_obj.add_course(course_name) return True, '添加课程成功!' # 老师查看教授课程接口 def check_student_interface(course_name, teacher_name): # 1.先获取老师对象 teacher_obj = models.Teacher.select_obj_by_name(teacher_name) # 2.让老师对象,调用查看课程中所有学生方法 student_list = teacher_obj.check_student_from_course(course_name) if not student_list: return False, '课程中没有学生' return True, student_list # 老师修改分数接口 # student_name, course_name, score, teacher_info.get('user') def change_score_interface( student_name, course_name, score, teacher_name): # 1.获取老师对象 teacher_obj = models.Teacher.select_obj_by_name(teacher_name) # 2.通过老师对象,调用修改分数方法 teacher_obj.change_score( # 学生名字传入,为了获取学生对象,并修改学生中的课程成绩 student_name, course_name, score, ) return True, f'修改分数成功, 课程[{course_name}]分数为: [{score}]'
5.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'): 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'): 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'): res = func(*args, **kwargs) return res else: teacher_view.login() else: print('用户权限不足') return inner return outer
6.start
注意:此处添加环境变量可以省略因为start在项目路径下。当start.py在bin目录下,必须加如环境变量,否则无法引用项目其他文件夹中的模块
import os import sys sys.path.append( os.path.dirname(__file__) ) from core import src if __name__ == '__main__': src.run()