综合应用面向对象
角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供两个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
readme.txt
角色: 学校、学员、课程、讲师、管理员
要求:
1. 创建北京、上海 2 所学校 ---> 管理员创建学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 创建讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师
6. 提供两个角色接口
6.1 学员视图, 可以注册,选择课程(等同于选择班级)
6.2 讲师视图, 讲师可管理自己的课程, 上课时选择班级,
查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
- pickle 可以帮我们保存对象
1、需求分析 (课程与班级合为一体)
- 管理视图
- 1.注册
- 2.登录
- 3.创建学校
- 4.创建课程(先选择学校)
- 5.创建讲师
- 学员视图
- 1.注册
- 2.登录功能
- 3.选择校区
- 4.选择课程(先选择校区,再选择校区中的某一门课程)
- 学生选择课程,课程也选择学生
- 5.查看分数
- 讲师视图
- 1.登录
- 2.查看教授课程
- 3.选择教授课程
- 4.查看课程下学生
- 5.修改学生分数
2、程序的架构设计
- 三层架构
- 用户视图层
- 用于与用户进行交互的
- 小的逻辑判断,比如注册功能中两次密码是否一致的校验
- core
- src.py 主视图
- admin.py
admin_view
- student.py
student_view
- teacher.py
teacher_view
- 逻辑接口层
- 核心业务逻辑的处理
- interface
- admin_interface.py
- student_interface.py
- teacher_interface.py
- 数据处理层
- 做数据的处理,比如数据的 增、删、查、改
- db
- models.py
- db_handler.py
- ATM + 购物车
- 存放 json格式的数据
- dict --> json
- 选课系统(******)
- pickle 保存对象
- object ---> pickle
3、分任务开发
4、测试
5、线上
start.py
‘‘‘
启动文件入口
‘‘‘
import os, sys
sys.path.append(
os.path.dirname(__file__)
)
from core import src
if __name__ == ‘__main__‘:
src.run()
conf
settings.py
import os
BASE_PATH = os.path.dirname(
os.path.dirname(__file__)
)
DB_PATH = os.path.join(
BASE_PATH, ‘db‘
)
core
src.py
‘‘‘‘‘‘
‘‘‘
用户视图层的 主视图
‘‘‘
from core import admin
from core import student
from core import teacher
func_dict = {
‘1‘: admin.admin_view,
‘2‘: student.student_view,
‘3‘: teacher.teacher_view,
}
def run():
while True:
print(‘‘‘
====== 欢迎来到选课系统 ======
1.管理员功能
2.学生功能
3.老师功能
=========== end =============
‘‘‘)
choice = input(‘请输入功能编号: ‘).strip()
if choice not in func_dict:
print(‘输入有误,请重新输入!‘)
continue
func_dict.get(choice)()
admin.py
‘‘‘‘‘‘
‘‘‘管理员视图‘‘‘
from interface import admin_interface
from interface import common_interface
from lib import common
admin_info = {
‘user‘: None
}
# 管理员注册
def register():
while True:
username = input(‘请输入用户名: ‘).strip()
password = input(‘请输入密码: ‘).strip()
re_password = input(‘请确认密码: ‘).strip()
# 小的逻辑判断
if password == re_password:
# 调用接口层,管理员注册接口
flag, msg = admin_interface.admin_register_interface(
username, password
)
if flag:
print(msg)
break
else:
print(msg)
else:
print(‘两次密码不一致,请重新输入‘)
# 管理员登录
def login():
while True:
username = input(‘请输入用户名: ‘).strip()
password = input(‘请输入密码: ‘).strip()
# 1.调用管理员登录接口
flag, msg = admin_interface.admin_login_interface(
username, password
)
if flag:
print(msg)
# 记录当前用户登录状态
# 可变类型不需要global
admin_info[‘user‘] = username
break
else:
print(msg)
# 管理员创建学校
@common.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.auth(‘admin‘)
def create_course():
while True:
# 1.让管理员先选择学校
# 1.1 调用接口,获取所有学校的名称并打印
flag, school_list_or_msg = common_interface.get_all_school_interface()
if not flag:
print(school_list_or_msg)
break
for index, school_name in enumerate(school_list_or_msg):
print(f‘编号: {index} 学校名: {school_name}‘)
choice = input(‘请输入学校编号: ‘).strip()
if not choice.isdigit():
print(‘请输入数字‘)
continue
choice = int(choice)
if choice not in range(len(school_list_or_msg)):
print(‘请输入正确编号!‘)
continue
# 获取选择后的学校名字
school_name = school_list_or_msg[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.auth(‘admin‘)
def create_teacher():
while True:
# 1.让管理员输入创建的老师名字
teacher_name = input(‘请输入老师的名字: ‘).strip()
# 2.调用接口创建老师
flag, msg = admin_interface.create_teacher_interface(
teacher_name, admin_info.get(‘user‘))
if flag:
print(msg)
break
else:
print(msg)
func_dict = {
‘1‘: register,
‘2‘: login,
‘3‘: create_school,
‘4‘: create_course,
‘5‘: create_teacher,
}
# 管理员视图函数
def admin_view():
while True:
print(‘‘‘
- 1.注册
- 2.登录
- 3.创建学校
- 4.创建课程
- 5.创建讲师
‘‘‘)
choice = input(‘请输入功能编号: ‘).strip()
if choice == ‘q‘:
admin_info[‘user‘] = None
break
if choice not in func_dict:
print(‘输入有误,请重新输入!‘)
continue
func_dict.get(choice)()
student.py
‘‘‘‘‘‘
‘‘‘学生视图‘‘‘
from lib import common
student_info = {‘user‘: None}
# 学生注册
def register():
pass
# 学生登录
def login():
pass
# 学生选择学校
@common.auth(‘student‘)
def choice_school():
pass
# 学生选择课程
@common.auth(‘student‘)
def choice_course():
pass
# 学生查看课程分数
@common.auth(‘student‘)
def check_score():
pass
func_dict = {
‘1‘: register,
‘2‘: login,
‘3‘: choice_school,
‘4‘: choice_course,
‘5‘: check_score,
}
def student_view():
while True:
print(‘‘‘
- 1.注册
- 2.登录功能
- 3.选择校区
- 4.选择课程
- 5.查看分数
‘‘‘)
choice = input(‘请输入功能编号: ‘).strip()
if choice == ‘q‘:
break
if choice not in func_dict:
print(‘输入有误,请重新输入!‘)
continue
func_dict.get(choice)()
teacher.py
‘‘‘‘‘‘
‘‘‘老师视图‘‘‘
from lib import common
teacher_info = {‘user‘: None}
# 老师登录
def login():
pass
# 查看教授课程
@common.auth(‘teacher‘)
def check_course():
pass
# 选择教授课程
@common.auth(‘teacher‘)
def choose_course():
pass
# 查看课程下学生
@common.auth(‘teacher‘)
def check_stu_from_course():
pass
# 修改学生分数
@common.auth(‘teacher‘)
def change_score_from_student():
pass
func_dict = {
‘1‘: login,
‘2‘: check_course,
‘3‘: choose_course,
‘4‘: check_stu_from_course,
‘5‘: change_score_from_student,
}
def teacher_view():
while True:
print(‘‘‘
- 1.登录
- 2.查看教授课程
- 3.选择教授课程
- 4.查看课程下学生
- 5.修改学生分数
‘‘‘)
choice = input(‘请输入功能编号: ‘).strip()
if choice == ‘q‘:
break
if choice not in func_dict:
print(‘输入有误,请重新输入!‘)
continue
func_dict.get(choice)()
db
db_handler.py
‘‘‘‘‘‘
‘‘‘
用于保存对象与获取对象
‘‘‘
import os
import pickle
from conf import settings
# 保存数据
def save_data(obj):
‘‘‘
1.获取对象的保存文件夹路径
以类名 当做 文件夹的名字
obj.__class__: 获取当前对象的类
obj.__class__.__name__: 获取类的名字
‘‘‘
class_name = obj.__class__.__name__
user_dir_path = os.path.join(
settings.DB_PATH, class_name
)
# 2.判断文件夹是否存在,不存在则创建文件夹
if not os.path.exists(user_dir_path):
os.mkdir(user_dir_path)
# 3.拼接当前用户的pickle文件路径,, 以用户名作为文件名
user_path = os.path.join(
user_dir_path, obj.user # 当前用户名字
)
# 4.打开文件,保存对象, 通过pickle
with open(user_path, ‘wb‘) as f:
pickle.dump(obj, f)
# 查看数据
def select_data(cls, username): # 类, username
# 由cls类获取类名
class_name = cls.__name__
user_dir_path = os.path.join(
settings.DB_PATH, class_name
)
# 2.判断文件夹是否存在,不存在则创建文件夹
if not os.path.exists(user_dir_path):
os.mkdir(user_dir_path)
# 3.拼接当前用户的pickle文件路径,, 以用户名作为文件名
user_path = os.path.join(
user_dir_path, username # 当前用户名字
)
# 4.判断文件如果存在,再打开,并返回,若不存在,则代表用户不存在
if os.path.exists(user_path):
# 5.打开文件,获取对象
with open(user_path, ‘rb‘) as f:
obj = pickle.load(f)
return obj
models.py
‘‘‘‘‘‘
‘‘‘用于存放类的
学校类、学员类、课程类、讲师类、管理员类
‘‘‘
from db import db_handler
# 父类,让所有子类都继承 select 与 save方法
class Base:
# 查看数据 ----> 登录、查看数据库
@classmethod
def select(cls, username): # School, school_name
# obj: 对象 or None
obj = db_handler.select_data(cls, username)
return obj
# 保存数据 ---> 注册、保存、更新数据
def save(self):
# 让db_handler中的save_data帮我保存对象数据
db_handler.save_data(self)
# 管理员类
class Admin(Base):
# 调用类的时候触发
# username, password
def __init__(self, user, pwd):
# 给当前对象赋值
self.user = user
self.pwd = pwd
# 创建学校
def create_school(self, school_name, school_addr):
‘‘‘该方法内部来调用学校类实例化的得到对象,并保存‘‘‘
school_obj = School(school_name, school_addr)
school_obj.save()
# 创建课程
def create_course(self, school_obj, course_name):
# 1.调用课程类,实例化创建课程
course_obj = Course(course_name)
course_obj.save()
# 2.获取当前学校对象,并将课程添加到课程列表中
school_obj.course_list.append(course_name)
# 3.更新学校数据
school_obj.save()
# 创建讲师
def create_teacher(self, teacher_name, teacher_pwd):
# 1.调用老师类,实例化的到老师对象,并保存
teacher_obj = Teacher(teacher_name, teacher_pwd)
teacher_obj.save()
# 学校类
class School(Base):
def __init__(self, name, addr):
# 必须写: self.user,
# 因为db_handler里面的select_data统一规范
self.user = name
self.addr = addr
# 课程列表: 每所学校都应该有相应的课程
self.course_list = []
# 学生类
class Student(Base):
pass
# 课程类
class Course(Base):
def __init__(self, course_name):
self.user = course_name
self.student_list = []
# 老师类
class Teacher(Base):
def __init__(self, teacher_name, teacher_pwd):
self.user = teacher_name
# self.pwd需要统一
self.pwd = teacher_pwd
self.course_list_from_tea = []
interface
common_interface.py
‘‘‘‘‘‘
‘‘‘公共接口‘‘‘
import os
from conf import settings
# 获取所有学校名称接口
def get_all_school_interface():
# 1.获取学校文件夹路径
school_dir = os.path.join(
settings.DB_PATH, ‘School‘
)
# 2.判断文件夹是否存在
if not os.path.exists(school_dir):
return False, ‘没有学校,请先联系管理员‘
# 3.文件夹若存在,则获取文件夹中所有文件的名字
school_list = os.listdir(school_dir)
return True, school_list
admin_interface.py
‘‘‘‘‘‘
‘‘‘管理员接口‘‘‘
from db import models
# 管理员注册接口
def admin_register_interface(username, password):
# 1.判断用户是否存在
# 调用Admin类中的,select方法,
# 由该方法去调用db_handler中的select_data功能获取对象
admin_obj = models.Admin.select(username)
# 1.1) 若存在不允许注册,返回用户已存在给视图层
if admin_obj:
return False, ‘用户已存在!‘
# 1.2) 若不存在则允许注册,调用类实例化得到对象并保存
admin_obj = models.Admin(username, password)
# 对象调用save() 会将 admin_obj传给save方法
admin_obj.save()
return True, ‘注册成功!‘
# 管理员登录接口
def admin_login_interface(username, password):
# 1.判断用户是否存在
admin_obj = models.Admin.select(username)
# 2.若不存在,则证明用户不存在并返回给视图层
if not admin_obj:
return False, ‘用户名不存在!‘
# 3.若用户存在,则校验密码
if password == admin_obj.pwd:
return True, ‘登录成功! ‘
else:
return False, ‘密码错误!‘
# 管理员创建学校接口
def create_school_interface(school_name, school_addr, admin_name):
# 1.查看当前学校是否已存在
# school_obj ---> 对象 or None
school_obj = models.School.select(school_name)
# 2.若学校存在,则返回False告诉用户学校已存在
if school_obj:
return False, ‘学校已存在!‘
# 3.若不存在,则创建学校, 注意: (由管理员对象来创建)
admin_obj = models.Admin.select(admin_name)
# 由管理员来调用创建学校方法,并传入学校的名字与地址
admin_obj.create_school(
school_name, school_addr
)
# 4.返回创建学校成功给视图层
return True, f‘[{school_name}]学校创建成功!‘
# 管理员创建课程接口
def create_course_interface(school_name, course_name, admin_name):
# 1.查看课程是否存在
# 1.1 先获取学校对象中的课程列表
school_obj = models.School.select(school_name)
# 1.2 判断当前课程是否存在课程列表中
if course_name in school_obj.course_list:
return False, ‘当前课程已存在!‘
# 1.2 若课程不存在,则创建课程, 由管理员来创建
admin_obj = models.Admin.select(admin_name)
admin_obj.create_course(
school_obj, course_name
)
return True, f‘[{course_name}] 课程创建成功, 绑定给[{school_name}]校区!‘
# 管理员创建老师接口
def create_teacher_interface(teacher_name, admin_name, teacher_pwd=‘123‘):
# 1.判断老师是否存在
teacher_obj = models.Teacher.select(teacher_name)
# 2.若存在,则返回不能创建
if teacher_obj:
return False, ‘老师已存在!‘
# 3.若不存在,则创建老师,让 管理员 来创建
admin_obj = models.Admin.select(admin_name)
admin_obj.create_teacher(teacher_name, teacher_pwd)
return True, f‘[{teacher_name}]老师创建成功!‘
student_interface.py
teacher_interface.py
lib
common.py
‘‘‘‘‘‘
‘‘‘公共方法‘‘‘
# 多用户登录认证装饰器
def auth(role):
‘‘‘
:param role: 角色 ---》 管理员、学生、老师
:return:
‘‘‘
from core import admin, student, teacher
# 登录认证装饰器
def login_auth(func):
def inner(*args, **kwargs):
if role == ‘admin‘:
if admin.admin_info[‘user‘]:
res = func(*args, **kwargs)
return res
else:
admin.login()
elif role == ‘student‘:
if student.student_info[‘user‘]:
res = func(*args, **kwargs)
return res
else:
student.login()
elif role == ‘teacher‘:
if teacher.teacher_info[‘user‘]:
res = func(*args, **kwargs)
return res
else:
teacher.login()
else:
print(‘当前视图没有权限‘)
return inner
return login_auth
原文:https://www.cnblogs.com/lucky-cat233/p/12693133.html