本帖最后由 lostlosin 于 2025-12-18 08:22 编辑
借助AI做了一个简单的本地html题库练习,简单易用,就不做多介绍了,因为手头上判断题渠道不同,设置了支持多种类型,具体如图。
题库格式:导出模板,按模板填写
题干,答案,选项A,选项B,选项C,选项D,选项E,选项F,选项G,选项H,解析,类型
题干和答案为必填项
类型(单选题、多选题、判断题、填空题)如未填写,导入自动识别。
蓝奏云https://wwazg.lanzoub.com/iPsgq3dugy7e
更新
1.1,仅未做题和错题逻辑bug已修复,优化错题集
[JavaScript] 纯文本查看 复制代码 // 自动判断题目类型
function determineQuestionType(row) {
// 如果原来就有类型列且不为空,优先使用原有类型
if (row.类型 && row.类型.trim() !== '') {
return row.类型;
}
const questionStem = row.题干 || '';
// 确保答案是字符串
const answer = String(row.答案);
// 规则1:当答案为对、错、正确、错误、TRUE、FALSE时,且其他答案选项内容为空,为判断题
// 处理Excel中可能的不同导入格式:字符串'TRUE'/'FALSE'、数字1/0、布尔值true/false
const isTrueAnswer = (answer === '对' || answer === '正确' || answer === 'TRUE' || answer === '1' || answer === 'true');
const isFalseAnswer = (answer === '错' || answer === '错误' || answer === 'FALSE' || answer === '0' || answer === 'false');
if ((isTrueAnswer || isFalseAnswer) && !hasAnyOptionContent(row)) {
return '判断题';
}
// 新增规则:检查题干中是否包含填空题特征(括号或下划线)
// 检查是否有括号(中文或英文),且括号中间为空或只有空格
const hasChineseBracketWithSpaces = /[((]\s*[))]/g.test(questionStem);
// 检查是否有独立的下划线(前后有空格或在句首/句尾)
const hasStandaloneUnderscore = /(\s|^)_+(\s|$)/g.test(questionStem);
// 如果题干中有括号(中间为空或只有空格)或独立的下划线,且选项都为空,则为填空题
if ((hasChineseBracketWithSpaces || hasStandaloneUnderscore) && !hasAnyOptionContent(row)) {
return '填空题';
}
// 获取选项内容
const optionA = (row['选项A'] || '').trim();
const optionB = (row['选项B'] || '').trim();
// 规则2:当答案为单个字母,且只存在选项A和选项B
if (/^[A-Z]$/.test(answer) && optionA && optionB && !hasMoreThanTwoOptions(row)) {
// 检查是否满足判断题的条件
if ((optionA === '对' && optionB === '错') ||
(optionA === '正确' && optionB === '错误') ||
(optionA === 'TRUE' && optionB === 'FALSE') ||
(optionA === 'FALSE' && optionB === 'TRUE') ||
(optionA === '错' && optionB === '对') ||
(optionA === '错误' && optionB === '正确') ||
(optionA === '1' && optionB === '0') ||
(optionA === '0' && optionB === '1') ||
(optionA === 'true' && optionB === 'false') ||
(optionA === 'false' && optionB === 'true')) {
return '判断题';
}
// 规则3:当答案为单个字母,且至少存在两个选项答案,且至少一个选项不为对、错、正确、错误时,为单选题
if (!isJudgmentOption(optionA) || !isJudgmentOption(optionB)) {
return '单选题';
} else {
// 如果两个选项都是判断题选项,则为判断题
return '判断题';
}
}
// 规则4:当答案为至少两个字母,且至少存在两个选项答案时,为多选题
if (/^[A-Z]+$/.test(answer) && answer.length >= 2 && hasAtLeastTwoOptions(row)) {
return '多选题';
}
// 规则5:当答案为单个字母,且至少存在两个选项答案时,为单选题
if (/^[A-Z]$/.test(answer) && hasAtLeastTwoOptions(row)) {
return '单选题';
}
// 默认为填空题
return '填空题';
}
// 检查是否有任何选项内容
function hasAnyOptionContent(row) {
const optionLabels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];
for (let i = 0; i < optionLabels.length; i++) {
// 确保选项值是字符串
const optionValue = String(row[`选项${optionLabels[i]}`]);
if (optionValue && optionValue.trim() !== '') {
return true;
}
}
return false;
}
// 检查是否有超过两个选项
function hasMoreThanTwoOptions(row) {
const optionLabels = ['C', 'D', 'E', 'F', 'G', 'H'];
for (let i = 0; i < optionLabels.length; i++) {
// 确保选项值是字符串
const optionValue = String(row[`选项${optionLabels[i]}`]);
if (optionValue && optionValue.trim() !== '') {
return true;
}
}
return false;
}
// 检查是否为判断题选项
function isJudgmentOption(option) {
// 确保选项是字符串并去除首尾空格后进行比较
const trimmedOption = String(option).trim();
return trimmedOption === '对' || trimmedOption === '错' || trimmedOption === 'TRUE' || trimmedOption === 'FALSE' || trimmedOption === '正确' || trimmedOption === '错误' ||
trimmedOption === '1' || trimmedOption === '0' || trimmedOption === 'true' || trimmedOption === 'false';
}
// 检查是否有至少两个选项
function hasAtLeastTwoOptions(row) {
// 确保选项值是字符串
const optionA = String(row['选项A']) || '';
const optionB = String(row['选项B']) || '';
return optionA.trim() !== '' && optionB.trim() !== '';
} |