|
|
|
|
@ -0,0 +1,161 @@
|
|
|
|
|
import os
|
|
|
|
|
from history_manager import HistoryManager
|
|
|
|
|
from junior_generator import JuniorQuestionGenerator
|
|
|
|
|
from primary_generator import PrimaryQuestionGenerator
|
|
|
|
|
from senior_generator import SeniorQuestionGenerator
|
|
|
|
|
|
|
|
|
|
#查重功能在_generate_and_save_questions函数中实现
|
|
|
|
|
|
|
|
|
|
class ExamGenerator:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.accounts = {
|
|
|
|
|
"小学": [("张三1", "123"), ("张三2", "123"), ("张三3", "123")],
|
|
|
|
|
"初中": [("李四1", "123"), ("李四2", "123"), ("李四3", "123")],
|
|
|
|
|
"高中": [("王五1", "123"), ("王五2", "123"), ("王五3", "123")]
|
|
|
|
|
}
|
|
|
|
|
self.level = None
|
|
|
|
|
self.username = None
|
|
|
|
|
self.folder = None
|
|
|
|
|
self.history = set()
|
|
|
|
|
self.history_manager = HistoryManager()
|
|
|
|
|
|
|
|
|
|
def get_account_type(self, username, password):
|
|
|
|
|
"""根据用户名和密码获取用户等级(角色)"""
|
|
|
|
|
for level, infos in self.accounts.items():
|
|
|
|
|
if (username, password) in infos:
|
|
|
|
|
return level
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def get_generator(self, level):
|
|
|
|
|
"""根据等级获取对应的题目生成器"""
|
|
|
|
|
if level == "小学":
|
|
|
|
|
return PrimaryQuestionGenerator()
|
|
|
|
|
elif level == "初中":
|
|
|
|
|
return JuniorQuestionGenerator()
|
|
|
|
|
elif level == "高中":
|
|
|
|
|
return SeniorQuestionGenerator()
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
|
"""
|
|
|
|
|
程序主入口,控制整体流程。
|
|
|
|
|
"""
|
|
|
|
|
print("--- 欢迎使用数学题库生成系统 ---")
|
|
|
|
|
while True:
|
|
|
|
|
# 1. 处理登录
|
|
|
|
|
if not self._login():
|
|
|
|
|
print("感谢使用,再见!")
|
|
|
|
|
break # 退出整个程序
|
|
|
|
|
|
|
|
|
|
# 2. 登录成功后,进入主菜单循环
|
|
|
|
|
self._main_menu()
|
|
|
|
|
|
|
|
|
|
# 3. 从主菜单退出后,重置用户状态,准备下一次登录
|
|
|
|
|
self._reset_user_state()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _login(self):
|
|
|
|
|
"""
|
|
|
|
|
处理用户登录流程。
|
|
|
|
|
返回: 如果登录成功返回 True,如果用户选择退出返回 False。
|
|
|
|
|
"""
|
|
|
|
|
while True:
|
|
|
|
|
login_input = input("请输入用户名和密码(以空格分隔),或输入 -1 退出:").strip()
|
|
|
|
|
|
|
|
|
|
if login_input == "-1":
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
if " " not in login_input:
|
|
|
|
|
print("输入格式错误,请输入用户名和密码,以空格分隔。")
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
username, password = login_input.split(" ", 1)
|
|
|
|
|
level = self.get_account_type(username, password)
|
|
|
|
|
|
|
|
|
|
if level:
|
|
|
|
|
self.username = username
|
|
|
|
|
self.level = level
|
|
|
|
|
self.folder = os.path.join("exams", self.username)
|
|
|
|
|
self.history = self.history_manager.load_history(self.folder)
|
|
|
|
|
print(f"\n登录成功!当前用户:{self.username},当前等级:{self.level}")
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
print("用户名或密码错误,请重新输入。")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _main_menu(self):
|
|
|
|
|
"""
|
|
|
|
|
登录后的主菜单和命令处理循环。
|
|
|
|
|
"""
|
|
|
|
|
while True:
|
|
|
|
|
# 根据当前等级获取生成器
|
|
|
|
|
generator = self.get_generator(self.level)
|
|
|
|
|
if not generator:
|
|
|
|
|
print("无法获取题目生成器,请联系管理员。")
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
cmd = input(f"\n请输入操作:\n"
|
|
|
|
|
f"1. 直接输入数量 10-30(生成 {self.level} 数学题目)\n"
|
|
|
|
|
f"2. 直接输入 '切换为小学/初中/高中'(切换等级)\n"
|
|
|
|
|
f"3. 直接输入 -1(返回登录界面)\n"
|
|
|
|
|
f"请输入您的选择:").strip()
|
|
|
|
|
|
|
|
|
|
if cmd == "-1":
|
|
|
|
|
print("\n正在退出当前用户...")
|
|
|
|
|
break # 退出主菜单循环
|
|
|
|
|
|
|
|
|
|
# 解析并执行命令
|
|
|
|
|
self._process_command(cmd, generator)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _process_command(self, cmd, generator):
|
|
|
|
|
"""
|
|
|
|
|
解析并执行用户在主菜单中输入的命令。
|
|
|
|
|
"""
|
|
|
|
|
if cmd.startswith("切换为"):
|
|
|
|
|
new_level = cmd[3:].strip()
|
|
|
|
|
if new_level in ["小学", "初中", "高中"]:
|
|
|
|
|
self.level = new_level
|
|
|
|
|
print(f"系统提示:已成功切换为 {self.level} 等级。")
|
|
|
|
|
else:
|
|
|
|
|
print("切换失败,请输入 '切换为小学'、'切换为初中' 或 '切换为高中'。")
|
|
|
|
|
|
|
|
|
|
elif cmd.isdigit():
|
|
|
|
|
num = int(cmd)
|
|
|
|
|
if 10 <= num <= 30:
|
|
|
|
|
self._generate_and_save_questions(num, generator)
|
|
|
|
|
else:
|
|
|
|
|
print("无效数量,请输入 10 到 30 之间的数字。")
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
print("无效的命令,请重新输入。")
|
|
|
|
|
|
|
|
|
|
#查重功能
|
|
|
|
|
def _generate_and_save_questions(self, num, generator):
|
|
|
|
|
"""
|
|
|
|
|
生成指定数量的不重复题目,并保存到文件和历史记录中。
|
|
|
|
|
"""
|
|
|
|
|
print(f"正在为您生成 {num} 道 {self.level} 数学题目...")
|
|
|
|
|
questions = []
|
|
|
|
|
while len(questions) < num:
|
|
|
|
|
q = generator.generate_question()
|
|
|
|
|
# 确保题目既不在历史记录中,也不在本次生成的临时列表中
|
|
|
|
|
if q not in self.history and q not in questions:
|
|
|
|
|
questions.append(q)
|
|
|
|
|
|
|
|
|
|
# 保存题目
|
|
|
|
|
self.history_manager.save_questions(self.folder, questions)
|
|
|
|
|
# 更新内存中的历史记录
|
|
|
|
|
self.history.update(questions)
|
|
|
|
|
|
|
|
|
|
print(f"✅ 成功生成并保存 {num} 道 {self.level} 数学题目!")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _reset_user_state(self):
|
|
|
|
|
"""
|
|
|
|
|
重置所有与当前用户相关的状态,以便下一个用户登录。
|
|
|
|
|
"""
|
|
|
|
|
self.username = None
|
|
|
|
|
self.level = None
|
|
|
|
|
self.folder = None
|
|
|
|
|
self.history = set()
|