feat: align teacher question bank actions

fix/exam-question-access-material-excel-delete-draft
chenyuan 3 weeks ago
parent b19e4ecf29
commit 1779bbe9a7

@ -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>
<input ref="importInput" class="import-file-input" type="file" :accept="importAccept" @change="handleImportFile" />
</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: "" }); }

Loading…
Cancel
Save