From 585d90f0e3194d6b988a424036291921794678ab Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期三, 18 十二月 2024 14:28:12 +0800 Subject: [PATCH] 修改首页 --- src/views/onlineEducation/groupExams/components/examDialog.vue | 373 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 330 insertions(+), 43 deletions(-) diff --git a/src/views/onlineEducation/groupExams/components/examDialog.vue b/src/views/onlineEducation/groupExams/components/examDialog.vue index 6f12c6d..8af519d 100644 --- a/src/views/onlineEducation/groupExams/components/examDialog.vue +++ b/src/views/onlineEducation/groupExams/components/examDialog.vue @@ -5,6 +5,8 @@ width="800px" :before-close="handleClose" destroy-on-close + :close-on-press-escape="false" + :close-on-click-modal="false" > <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > <span style="font-size: 20px;font-weight: 800;margin-left: 20px">考试配置</span> @@ -44,24 +46,46 @@ </div> <el-select clearable - v-model="state.form.singleBankId" + v-model="state.form.singleBankName" + filterable + remote + reserve-keyword + placeholder="请输入单选题库" + remote-show-suffix + :remote-method="getBankList" style="width: 160px;margin: 0 20px" - v-loadMoreNew:[reselectSingle]="handleScroll" - :popper-class="reselectSingle.name" - class="item-width" - placeholder="请选择单选题题库" + @change="selectSingleValue" > <el-option - v-for="item in state.bankListSingle" + v-for="item in state.bankList" :key="item.id" :label="item.name" - :value="item.id" + :value="item.name" /> </el-select> +<!-- <el-select--> +<!-- clearable--> +<!-- v-model="state.form.singleBankId"--> +<!-- style="width: 160px;margin: 0 20px"--> +<!-- v-loadMoreNew:[reselectSingle]="handleScroll"--> +<!-- :popper-class="reselectSingle.name"--> +<!-- class="item-width"--> +<!-- placeholder="请选择单选题题库"--> +<!-- >--> +<!-- <el-option--> +<!-- v-for="item in state.bankListSingle"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.id"--> +<!-- />--> +<!-- </el-select>--> <el-radio-group v-model="state.form.singleMethod" > <el-radio :label="1" style="max-width: 30px">随机</el-radio> - <el-radio :label="2">顺序</el-radio> - </el-radio-group> + <el-radio :label="2" style="max-width: 30px">顺序</el-radio> + </el-radio-group > + <el-radio-group v-model="state.form.singleRebuild" style="margin-left: 30px" > + <el-radio :label="1" v-if="title === '编辑'" style="max-width: 30px">重新出题</el-radio> + </el-radio-group> </div> </div> <div style="display: flex"> @@ -82,23 +106,45 @@ </div> <el-select clearable - v-model="state.form.multiBankId" + v-model="state.form.multiBankName" + filterable + remote + reserve-keyword + placeholder="请输入多选题库" + remote-show-suffix + :remote-method="getBankList" style="width: 160px;margin: 0 20px" - v-loadMoreNew:[reselectSingle]="handleScroll" - :popper-class="reselectSingle.name" - class="item-width" - placeholder="请选择多选题题库" + @change="selectMultiValue" > <el-option - v-for="item in state.bankListSingle" + v-for="item in state.bankList" :key="item.id" :label="item.name" - :value="item.id" + :value="item.name" /> </el-select> +<!-- <el-select--> +<!-- clearable--> +<!-- v-model="state.form.multiBankId"--> +<!-- style="width: 160px;margin: 0 20px"--> +<!-- v-loadMoreNew:[reselectSingle]="handleScroll"--> +<!-- :popper-class="reselectSingle.name"--> +<!-- class="item-width"--> +<!-- placeholder="请选择多选题题库"--> +<!-- >--> +<!-- <el-option--> +<!-- v-for="item in state.bankListSingle"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.id"--> +<!-- />--> +<!-- </el-select>--> <el-radio-group v-model="state.form.multiMethod" > <el-radio :label="1" style="max-width: 30px">随机</el-radio> - <el-radio :label="2">顺序</el-radio> + <el-radio :label="2" style="max-width: 30px">顺序</el-radio> + </el-radio-group> + <el-radio-group v-model="state.form.multiRebuild" style="margin-left: 30px" > + <el-radio :label="1" v-if="title === '编辑'" style="max-width: 30px">重新出题</el-radio> </el-radio-group> </div> </div> @@ -120,28 +166,110 @@ </div> <el-select clearable - v-model="state.form.judgeBankId" + v-model="state.form.judgeBankName" + filterable + remote + reserve-keyword + placeholder="请输入判断题库" + remote-show-suffix + :remote-method="getBankList" style="width: 160px;margin: 0 20px" - v-loadMoreNew:[reselectSingle]="handleScroll" - :popper-class="reselectSingle.name" - class="item-width" - placeholder="请选择判断题题库" + @change="selectJudgeValue" > <el-option - v-for="item in state.bankListSingle" + v-for="item in state.bankList" :key="item.id" :label="item.name" - :value="item.id" + :value="item.name" /> </el-select> +<!-- <el-select--> +<!-- clearable--> +<!-- v-model="state.form.judgeBankId"--> +<!-- style="width: 160px;margin: 0 20px"--> +<!-- v-loadMoreNew:[reselectSingle]="handleScroll"--> +<!-- :popper-class="reselectSingle.name"--> +<!-- class="item-width"--> +<!-- placeholder="请选择判断题题库"--> +<!-- >--> +<!-- <el-option--> +<!-- v-for="item in state.bankListSingle"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.id"--> +<!-- />--> +<!-- </el-select>--> <el-radio-group v-model="state.form.judgeMethod" > <el-radio :label="1" style="max-width: 30px">随机</el-radio> - <el-radio :label="2">顺序</el-radio> + <el-radio :label="2" style="max-width: 30px">顺序</el-radio> + </el-radio-group> + <el-radio-group v-model="state.form.judgeRebuild" style="margin-left: 30px" > + <el-radio :label="1" v-if="title === '编辑'" style="max-width: 30px">重新出题</el-radio> + </el-radio-group> + </div> + </div> + <div style="display: flex"> + <div class="group"> + <div> + 简答:<el-input style="max-width: 40px" v-model="state.form.easyNum"></el-input> 题 + </div> + <div style="margin-left: 20px"> + 每题:<el-input style="max-width: 40px" v-model="state.form.easyScore"></el-input> 分 + </div> + </div> + <div class="group" > + <div> + 共 + <span style="max-width: 30px" v-show="state.form.easyNum && state.form.easyScore">{{state.form.easyNum * state.form.easyScore}}</span> + <!-- <span v-else></span>--> + 分 + </div> + <el-select + clearable + v-model="state.form.easyBankName" + filterable + remote + reserve-keyword + placeholder="请输入简答题库" + remote-show-suffix + :remote-method="getBankList" + style="width: 160px;margin: 0 20px" + @change="selectEasyValue" + > + <el-option + v-for="item in state.bankList" + :key="item.id" + :label="item.name" + :value="item.name" + /> + </el-select> +<!-- <el-select--> +<!-- clearable--> +<!-- v-model="state.form.easyBankId"--> +<!-- style="width: 160px;margin: 0 20px"--> +<!-- v-loadMoreNew:[reselectSingle]="handleScroll"--> +<!-- :popper-class="reselectSingle.name"--> +<!-- class="item-width"--> +<!-- placeholder="请选择简答题题库"--> +<!-- >--> +<!-- <el-option--> +<!-- v-for="item in state.bankListSingle"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.id"--> +<!-- />--> +<!-- </el-select>--> + <el-radio-group v-model="state.form.easyMethod" > + <el-radio :label="1" style="max-width: 30px">随机</el-radio> + <el-radio :label="2" style="max-width: 30px">顺序</el-radio> + </el-radio-group> + <el-radio-group v-model="state.form.easyRebuild" style="margin-left: 30px" > + <el-radio :label="1" v-if="title === '编辑'" style="max-width: 30px">重新出题</el-radio> </el-radio-group> </div> </div> <span class="group" style="margin-bottom: 20px">共计: - {{state.form.judgeNum * state.form.judgeScore+state.form.multiNum * state.form.multiScore+state.form.singleNum * state.form.singleScore}} + {{state.form.judgeNum * state.form.judgeScore+state.form.multiNum * state.form.multiScore+state.form.singleNum * state.form.singleScore+state.form.easyNum * state.form.easyScore}} 分</span> <div style="display: flex;justify-content: space-between;align-items: center"> <el-form-item label="合格分数:" prop="passScore"> @@ -151,15 +279,28 @@ <el-input v-model="state.form.limitTime" style="max-width: 200px" :disabled="state.form.limited === 0"> <template #append>分钟</template> </el-input> + </el-form-item> </div> - <el-form-item label="是否限制考试时长:" prop="limited" style="margin-left: 60px"> - <el-radio-group v-model="state.form.limited" @change="changeLimit" > - <el-radio :label="0" style="max-width: 30px">否</el-radio> - <el-radio :label="1">是</el-radio> - </el-radio-group> - </el-form-item> + <div style="display: flex;justify-content: space-between;align-items: center"> + <el-form-item label="是否限制考试时长:" prop="limited" style="margin-left: 60px"> + <el-radio-group v-model="state.form.limited" @change="changeLimit" > + <el-radio :label="0" style="max-width: 30px">否</el-radio> + <el-radio :label="1">是</el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label="考试截止时间:" prop="deadline" style="margin-left: 60px"> + <el-date-picker + v-model="state.form.deadline" + type="date" + placeholder="请选择截止时间" + format="YYYY-MM-DD" + value-format="YYYY-MM-DD 23:59:59" + /> + </el-form-item> + </div> + </el-form> <template #footer> <span class="dialog-footer"> @@ -187,7 +328,8 @@ editQuestionBank, getQuestionBank } from "@/api/onlineEducation/questionBank"; -import {addExam, checkExamName, editExam} from "@/api/onlineEducation/exam"; +import {addExam, checkExamName, editExam, getExamStudent, getPaper} from "@/api/onlineEducation/exam"; +import Student from "@/views/onlineEducation/groupExams/components/student.vue"; const dialogVisible = ref(false); const title = ref(""); @@ -247,15 +389,29 @@ singleScore: null, limited: 1, limitTime: null, - passScore: null + passScore: null, + judgeRebuild: null, + multiRebuild: null, + singleRebuild: null, + easyRebuild: null, + deadline: '', + easyNum: null, + easyScore: null, + easyBankId: null, + easyMethod: 1, + easyBankName: '', + singleBankName:'', + multiBankName: '', + judgeBankName: '' }, formRules: { name: [{required: true, trigger: "blur", validator: validateName}], categoryId: [{required: true, message: '请选择课程分类', trigger: 'blur'}], - limited: [{required: true, message: '请选择课程分类', trigger: 'blur'}], - limitTime: [{required: true, message: '请选择课程分类', trigger: 'blur'}], - passScore: [{required: true, message: '请选择课程分类', trigger: 'blur'}] + limited: [{required: true, message: '请选择是否限制考试时长', trigger: 'blur'}], + limitTime: [{required: true, message: '请输入考试限制时长', trigger: 'blur'}], + passScore: [{required: true, message: '请输入合格分数', trigger: 'blur'}], + deadline: [{required: true, message: '请选择考试截止时间', trigger: 'blur'}] }, classifyList: [], isAdmin: false, @@ -266,11 +422,15 @@ bankSinglePageNum: 1, // 当前页码 bankSinglePageSize: 10, // 每页显示的数量 hasMoreItemsSingle: null, // 是否还有更多选项 + initSingleBankName: '', + initMultiBankName: '', + initJudgeBankName: '', + initEasyBankName: '', }) const openDialog = async (type, value) => { await getClassifyList(); - await loadMoreBankData() + await getBankList(''); const userInfo = JSON.parse(Cookies.get('userInfo')) console.log("userInfo",userInfo) if(userInfo.userType === 0){ @@ -284,8 +444,26 @@ } title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; if(type === 'edit') { - state.form = value - startUsername.value = value.name; + const res = await getPaper(value.id) + if(res.code == 200){ + state.form = res.data + state.form.easyNum = state.form.easyNum ? state.form.easyNum: null + state.form.easyScore = state.form.easyScore ? state.form.easyScore: null + state.form.singleNum = state.form.singleNum ? state.form.singleNum: null + state.form.singleScore = state.form.singleScore ? state.form.singleScore: null + state.form.multiNum = state.form.multiNum ? state.form.multiNum: null + state.form.multiScore = state.form.multiScore ? state.form.multiScore: null + state.form.judgeNum = state.form.judgeNum ? state.form.judgeNum: null + state.form.judgeScore = state.form.judgeScore ? state.form.judgeScore: null + startUsername.value = value.name; + state.initSingleBankName = state.form.singleBankName; + state.initMultiBankName= state.form.multiBankName; + state.initJudgeBankName= state.form.judgeBankName; + state.initEasyBankName= state.form.easyBankName; + }else{ + ElMessage.warning(res.message) + } + }else if(type === 'add' && value ){ state.form.parentId = value.id } @@ -299,6 +477,21 @@ // message: '管理员暂无权限' // }); // return; + // } + const total = state.form.judgeNum * state.form.judgeScore+state.form.multiNum * state.form.multiScore+state.form.singleNum * state.form.singleScore+state.form.easyNum * state.form.easyScore + if(state.form.passScore > total){ + ElMessage({ + type: 'warning', + message: '合格分数不能大于总分' + }); + return; + } + // if(!(state.form.judgeBankId || state.form.multiBankId || state.form.singleBankId)){ + // ElMessage({ + // type: 'warning', + // message: '请选择题库' + // }); + // return; // } const valid = await busRef.value.validate(); if(valid){ @@ -368,6 +561,9 @@ console.log("label====",classifyRef.value.getCheckedNodes()[0].value) state.form.categoryId = classifyRef.value.getCheckedNodes()[0].value // 我这里只是打印了一下label的值哦,需要赋值的话自己去赋值哦 + if (classifyRef.value.popperVisible) { + classifyRef.value.togglePopperVisible() + } } const handleClose = () => { @@ -396,10 +592,27 @@ singleMethod: 1, singleNum: null, singleScore: null, - limited: 0, + limited: 1, limitTime: null, - passScore: null + passScore: null, + judgeRebuild: null, + multiRebuild: null, + singleRebuild: null, + easyRebuild: null, + easyNum: null, + easyScore: null, + easyBankId: null, + easyMethod: 1, + deadline: '', + easyBankName: '', + singleBankName:'', + multiBankName: '', + judgeBankName: '' + } + state.bankListSingle = []; + state.bankSinglePageNum = 1; + state.bankSinglePageSize = 10; } const handleScroll = () => { if(state.bankSinglePageNum >= state.hasMoreItemsSingle) return @@ -421,6 +634,80 @@ }else{ ElMessage.warning(res.message) } +} + +const getBankList = async (val)=>{ + if(val != ""){ + const queryParams = { + name: val + } + const res = await getQuestionBank(queryParams) + if (res.code == 200) { + state.bankList = res.data.list + + } else { + ElMessage.warning(res.message) + } + }else { + const queryParams = { + pageNum: 1, + pageSize: 10 + } + const res = await getQuestionBank(queryParams) + if (res.code == 200) { + state.bankList = res.data.list + } else { + ElMessage.warning(res.message) + } + } +} +const selectSingleValue = (val) => { + if(val != state.initSingleBankName){ + state.form.singleRebuild = 1; + }else { + state.form.singleRebuild = 0; + } + state.bankList.forEach(item => { + if(item.name === val){ + state.form.singleBankId = item.id + } + }) +} +const selectMultiValue = (val) => { + if(val != state.initMultiBankName){ + state.form.multiRebuild = 1; + }else { + state.form.multiRebuild = 0; + } + state.bankList.forEach(item => { + if(item.name === val){ + state.form.multiBankId = item.id + } + }) +} +const selectJudgeValue = (val) => { + if(val != state.initJudgeBankName){ + state.form.judgeRebuild = 1; + }else { + state.form.judgeRebuild = 0; + } + state.bankList.forEach(item => { + if(item.name === val){ + state.form.judgeBankId = item.id + } + }) +} +const selectEasyValue = (val) => { + if(val != state.initEasyBankName){ + state.form.easyRebuild = 1; + }else { + state.form.easyRebuild = 0; + } + state.bankList.forEach(item => { + if(item.name === val){ + state.form.easyBankId = item.id + } + }) } const changeLimit = (val) => { @@ -451,7 +738,7 @@ align-items:center; font-size: 15px; font-weight: 700; - margin: 20px 0 0 70px; + margin: 20px 0 0 35px; } } -- Gitblit v1.9.2