马宇豪
2024-12-18 585d90f0e3194d6b988a424036291921794678ab
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>&nbsp;题
            </div>
            <div style="margin-left: 20px">
              每题:<el-input style="max-width: 40px" v-model="state.form.easyScore"></el-input>&nbsp;分
            </div>
          </div>
          <div class="group" >
            <div>
              共&nbsp;
              <span style="max-width: 30px" v-show="state.form.easyNum && state.form.easyScore">{{state.form.easyNum * state.form.easyScore}}</span>
              <!--              <span v-else></span>-->
              &nbsp;分
            </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}}
          &nbsp;分</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;
  }
}