|
|
|
|
@ -2,7 +2,18 @@
|
|
|
|
|
<main class="exam-admin app-container">
|
|
|
|
|
<header class="page-head">
|
|
|
|
|
<div><h1>综合考核</h1><p>维护题库并管理考试全流程</p></div>
|
|
|
|
|
<el-button v-if="activeTab === 'questions'" type="primary" :icon="Plus" @click="openQuestion()">新增题目</el-button>
|
|
|
|
|
<div v-if="activeTab === 'questions'" class="page-actions">
|
|
|
|
|
<el-button type="primary" :icon="Plus" @click="openQuestion()">添加题目</el-button>
|
|
|
|
|
<el-dropdown trigger="click" @command="openImportPicker">
|
|
|
|
|
<el-button type="success" :icon="Upload" :loading="importing">批量导入<el-icon class="el-icon--right"><ArrowDown /></el-icon></el-button>
|
|
|
|
|
<template #dropdown><el-dropdown-menu><el-dropdown-item command="word">导入 Word 文件</el-dropdown-item><el-dropdown-item command="excel">导入 Excel 文件</el-dropdown-item></el-dropdown-menu></template>
|
|
|
|
|
</el-dropdown>
|
|
|
|
|
<el-dropdown trigger="click" @command="downloadTemplate">
|
|
|
|
|
<el-button type="success" :icon="Download">下载模板<el-icon class="el-icon--right"><ArrowDown /></el-icon></el-button>
|
|
|
|
|
<template #dropdown><el-dropdown-menu><el-dropdown-item command="word">Word 导入模板</el-dropdown-item><el-dropdown-item command="excel">Excel 导入模板</el-dropdown-item></el-dropdown-menu></template>
|
|
|
|
|
</el-dropdown>
|
|
|
|
|
<el-button type="primary" @click="openAi">AI出题</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<el-button v-else type="primary" :icon="Plus" @click="$router.push('/exam/manage/new')">新建考试</el-button>
|
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
@ -17,28 +28,7 @@
|
|
|
|
|
</el-select>
|
|
|
|
|
<el-input v-model="questionQuery.keyword" placeholder="搜索题干" clearable :prefix-icon="Search" @keyup.enter="loadQuestions" />
|
|
|
|
|
<el-button :icon="Search" @click="loadQuestions">查询</el-button>
|
|
|
|
|
<div class="toolbar-spacer" />
|
|
|
|
|
<div class="toolbar-actions">
|
|
|
|
|
<el-dropdown trigger="click" @command="downloadTemplate">
|
|
|
|
|
<el-button :icon="Download">下载模板<el-icon class="el-icon--right"><ArrowDown /></el-icon></el-button>
|
|
|
|
|
<template #dropdown>
|
|
|
|
|
<el-dropdown-menu>
|
|
|
|
|
<el-dropdown-item command="word">Word 导入模板</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item command="excel">Excel 导入模板</el-dropdown-item>
|
|
|
|
|
</el-dropdown-menu>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dropdown>
|
|
|
|
|
<el-dropdown trigger="click" @command="openImportPicker">
|
|
|
|
|
<el-button type="primary" :icon="Upload" :loading="importing">批量导入<el-icon class="el-icon--right"><ArrowDown /></el-icon></el-button>
|
|
|
|
|
<template #dropdown>
|
|
|
|
|
<el-dropdown-menu>
|
|
|
|
|
<el-dropdown-item command="word">导入 Word 文件</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item command="excel">导入 Excel 文件</el-dropdown-item>
|
|
|
|
|
</el-dropdown-menu>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dropdown>
|
|
|
|
|
<input ref="importInput" class="import-file-input" type="file" :accept="importAccept" @change="handleImportFile" />
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
<el-table v-loading="loading" :data="questions" class="data-table">
|
|
|
|
|
<el-table-column label="题型" width="110"><template #default="{ row }"><el-tag :type="typeTone[row.type]">{{ typeName[row.type] }}</el-tag></template></el-table-column>
|
|
|
|
|
@ -135,6 +125,7 @@ async function loadProjects() { try { projectOptions.value = (await examApi.getQ
|
|
|
|
|
async function loadQuestions() { loading.value = true; try { questions.value = (await examApi.getQuestions(questionQuery)).data || []; } finally { loading.value = false; } }
|
|
|
|
|
async function loadExams() { loading.value = true; try { exams.value = (await examApi.getTeacherExams({ keyword: examKeyword.value })).data || []; } finally { loading.value = false; } }
|
|
|
|
|
function openQuestion(row) { questionReadonly.value = row?.sourceType === 'PLATFORM'; Object.assign(questionForm, row ? JSON.parse(JSON.stringify(row)) : emptyQuestion()); if (!Array.isArray(questionForm.answer) && isChoice.value) questionForm.answer = []; questionDialog.value = true; }
|
|
|
|
|
function openAi() { router.push('/ai'); }
|
|
|
|
|
function resetAnswer() { questionForm.answer = questionForm.type === "TRUE_FALSE" ? true : questionForm.type === "SHORT_ANSWER" ? "" : []; }
|
|
|
|
|
function toggleMultiple(label, checked) { questionForm.answer = checked ? [...new Set([...questionForm.answer, label])] : questionForm.answer.filter((item) => item !== label); }
|
|
|
|
|
function addOption() { questionForm.options.push({ label: String.fromCharCode(65 + questionForm.options.length), content: "" }); }
|
|
|
|
|
|