# --------------------------------------------------------------------------
# 这里放的是提炼出来的视图层公用方法(为了提高代码复用性,减少重复造轮子)
# --------------------------------------------------------------------------
# 菜单选择
def choose_item(msg: str, func_dict: dict, callback_func=None): # 传入一个回调函数,退出视图时自动清空登录信息
while True:
print(f"{msg}q. 退出")
choice = input("请输入序号选择>>>:").strip()
if choice in func_dict:
func_dict[choice]()
elif choice in ['q', 'exit']:
if callback_func:
callback_func()
break
else:
print("请正确输入序号!")
# 从列表中选择一个选项(list --> str) --- 选校区 课程等使用
def get_one_name(names_list, keyword=None):
while True:
print(f"现有如下{keyword}:")
for name_list in names_list:
print(f"\t{names_list.index(name_list) + 1} {name_list}") # 打印索引与单个名称
choice_index = input(f"请输入序号选择{keyword}(q返回上一级)>>>:").strip()
if choice_index in ['q', 'exit']:
return False
elif choice_index.isdigit() and int(choice_index) - 1 in range(0, len(names_list) + 1):
return names_list[int(choice_index) - 1]
else:
print("请正确输入序号!")
def select_name_one_by_one(get_all_func=None, prefix=None, keyword=None, course_name=None):
'''
选择校区、班级、课程等使用,传入获取所有...的函数名(需要有两个返回值flag, msg),以及选择时的关键字(校区、班级等)
:param get_all_func: 获取所有...的函数名
:param prefix: get_all_func函数的参数
:param keyword: 选择时的关键字(校区、班级等)
:return: 校区、班级等的名字
'''
# 选校区
''' 封装参考源代码
flag, msg = admin_interface.get_all_school_names()
if not flag:
print(msg)
return False
school_names = msg
res = view_common.get_one_name(school_names, keyword='校区')
if not res: # 放弃创建课程
return False
school_name = res
'''
if course_name:
flag, msg = get_all_func(prefix=prefix, course_name=course_name)
else:
flag, msg = get_all_func(prefix=prefix)
if not flag:
print(msg)
return False
names_list = msg
res = get_one_name(names_list, keyword)
if not res: # 放弃创建课程
return False
name = res
return name
def input_filter(keyword=None, unit=None, is_number=False, check_exists_func=None, prefix=None, need_exists=False):
'''
输入过滤函数,默认判空,支持数字输入,查重,返回True则需要在接收的时候返回上一级(if isinstance(school_name, bool))
:param keyword: 输出信息以及打印信息中的关键字(校区名称、校区地址、课程名、课程价钱....)
:param unit: 输入关键字的单位(元、月、周、日)
:param is_number: 输入的内容是否为数字,如果是,则返回给的值也是数字(int)
:param check_exists_func: 查重的函数,如果需要判断重复就把判断重复的函数名传进来
:param prefix: 需要检查的参数是否有前缀
:param need_exists: 是否需要存在,必须先传check_exists_func 无效,如果需要存在则判断是否不存在,否则是否存在
:return: True 退出此功能,外界接收return结束函数
int(cmd) 转成int类型后的输入信息
cmd 合法的输入信息
'''
if unit:
input_msg = f"请输入{keyword},单位:{unit}(q返回上一级)>>>:"
else:
input_msg = f"请输入{keyword}(q返回上一级)>>>:"
while True:
cmd = input(input_msg).strip()
if not cmd:
print(f"{keyword}不能为空!")
continue
if cmd in ['q', 'exit']:
return True
if check_exists_func:
if prefix:
flag, msg = check_exists_func(f"{prefix}{cmd}")
else:
flag, msg = check_exists_func(cmd)
if not need_exists: # 创建时不能重复
if flag:
print(f"{keyword} {cmd} 已存在!")
continue
else: # 登录查找时需要存在
if not flag:
print(f"{keyword} {cmd} 不存在!")
continue
if is_number:
# 是数字的话返回的也要转成数字
if not cmd.isdigit():
print(f"{keyword}必须是数字!")
continue
return int(cmd)
return cmd
def login_auth(view_type):
'''
登录验证装饰器,未登录提示(有未登录直接登录的注释),已登录执行方法
:param view_type: 被装饰得视图类型,暂时只支持 admin teacher student
:return:
'''
def outter(func):
def inner(*args, **kwargs):
# 下面不能一次性全导过来,因为自身也在其中(或者是把views当成包,自定义 __name__(是不是这个单词忘了) 忽略掉本文件)
from views import admin_view
from views import teacher_view
from views import student_view
type_map_current_dict = {
"admin": admin_view.current_admin,
"teacher": teacher_view.current_teacher,
"student": student_view.current_student,
}
if view_type in type_map_current_dict:
if not type_map_current_dict[view_type]['name']: # 没有登录信息
print("此功能需要登录才能执行,请您先去登录哦~")
# 调用该对象的登录方法(把type_map_current_dict 设计成一个列表就可以了 "admin": [admin_view.current_admin, admin_view])
# type_map_current_dict[view_type][1].login() # 调用登录功能
# 前面判断条件的 type_map_current_dict[view_type]['name'] 改成 type_map_current_dict[view_type][0]['name']
return False # 如果要直接调用登录方法,把这里注释掉
res = func(*args, **kwargs)
return res
else:
print("该方法暂不支持登录验证,请自行添加维护!")
return inner
return outter
- 1
- 2
- 3
前往页