zhouwx
2024-07-15 6459f8bff3e568e65e6dc617f22c686cf5a8db44
src/views/onlineEducation/groupExams/components/examDialog.vue
@@ -4,6 +4,7 @@
        v-model="dialogVisible"
        width="800px"
        :before-close="handleClose"
        destroy-on-close
    >
      <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>
@@ -28,15 +29,18 @@
        <div  style="display: flex">
          <div class="group">
            <div>
              单选:<el-input style="max-width: 40px"></el-input>&nbsp;题
              单选:<el-input style="max-width: 40px" v-model.trim="state.form.singleNum"></el-input>&nbsp;题
            </div>
            <div style="margin-left: 20px">
              每题:<el-input style="max-width: 40px"></el-input>&nbsp;分
              每题:<el-input style="max-width: 40px" v-model.trim="state.form.singleScore"></el-input>&nbsp;分
            </div>
          </div>
          <div class="group" >
           <div>
             共&nbsp;<span style="max-width: 30px">xxx</span>&nbsp;分
             共&nbsp;
             <span style="max-width: 30px" v-show="state.form.singleNum && state.form.singleScore">{{state.form.singleNum * state.form.singleScore}}</span>
<!--             <span v-else></span>-->
             &nbsp;分
           </div>
            <el-select
                clearable
@@ -54,33 +58,36 @@
                  :value="item.id"
              />
            </el-select>
          <el-radio-group v-model="radio"  >
          <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 :label="2">顺序</el-radio>
          </el-radio-group>
          </div>
        </div>
        <div  style="display: flex">
          <div class="group">
            <div>
              多选:<el-input style="max-width: 40px"></el-input>&nbsp;题
              多选:<el-input style="max-width: 40px" v-model="state.form.multiNum"></el-input>&nbsp;题
            </div>
            <div style="margin-left: 20px">
              每题:<el-input style="max-width: 40px"></el-input>&nbsp;分
              每题:<el-input style="max-width: 40px" v-model="state.form.multiScore"></el-input>&nbsp;分
            </div>
          </div>
          <div class="group" >
            <div>
              共&nbsp;<span style="max-width: 30px">xxx</span>&nbsp;分
            <div >
              共&nbsp;
              <span style="max-width: 30px" v-show="state.form.multiNum && state.form.multiScore">{{state.form.multiNum * state.form.multiScore}}</span>
<!--              <span v-else></span>-->
              &nbsp;分
            </div>
            <el-select
                clearable
                v-model="state.form.singleBankId"
                v-model="state.form.multiBankId"
                style="width: 160px;margin: 0 20px"
                v-loadMoreNew:[reselectSingle]="handleScroll"
                :popper-class="reselectSingle.name"
                class="item-width"
                placeholder="请选择单选题题库"
                placeholder="请选择多选题题库"
            >
              <el-option
                  v-for="item in state.bankListSingle"
@@ -89,33 +96,36 @@
                  :value="item.id"
              />
            </el-select>
            <el-radio-group v-model="radio"  >
            <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">顺序</el-radio>
            </el-radio-group>
          </div>
        </div>
        <div  style="display: flex">
          <div class="group">
            <div>
              判断:<el-input style="max-width: 40px"></el-input>&nbsp;题
              判断:<el-input style="max-width: 40px" v-model="state.form.judgeNum"></el-input>&nbsp;题
            </div>
            <div style="margin-left: 20px">
              每题:<el-input style="max-width: 40px"></el-input>&nbsp;分
              每题:<el-input style="max-width: 40px" v-model="state.form.judgeScore"></el-input>&nbsp;分
            </div>
          </div>
          <div class="group" >
            <div>
              共&nbsp;<span style="max-width: 30px">xxx</span>&nbsp;分
              共&nbsp;
              <span style="max-width: 30px" v-show="state.form.judgeNum && state.form.judgeScore">{{state.form.judgeNum * state.form.judgeScore}}</span>
<!--              <span v-else></span>-->
              &nbsp;分
            </div>
            <el-select
                clearable
                v-model="state.form.singleBankId"
                v-model="state.form.judgeBankId"
                style="width: 160px;margin: 0 20px"
                v-loadMoreNew:[reselectSingle]="handleScroll"
                :popper-class="reselectSingle.name"
                class="item-width"
                placeholder="请选择单选题题库"
                placeholder="请选择判断题题库"
            >
              <el-option
                  v-for="item in state.bankListSingle"
@@ -124,24 +134,32 @@
                  :value="item.id"
              />
            </el-select>
            <el-radio-group v-model="radio"  >
            <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">顺序</el-radio>
            </el-radio-group>
          </div>
        </div>
        <span class="group" style="margin-bottom: 10px">共计:xxx分</span>
        <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}}
          &nbsp;分</span>
        <div style="display: flex;justify-content: space-between;align-items: center">
          <el-form-item label="合格分数:" prop="">
            <el-input-number v-model="num" :min="1" :max="10" style="margin-right: 10px" /> (大于等于)
          <el-form-item label="合格分数:" prop="passScore">
            <el-input-number v-model="state.form.passScore" :min="1" :max="1000" style="margin-right: 10px" /> (大于等于)
          </el-form-item>
          <el-form-item label="限制时长:" prop="">
            <el-input v-model="num1" style="max-width: 200px" >
          <el-form-item label="限制时长:" prop="limitTime">
            <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>
        </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>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
@@ -169,7 +187,7 @@
  editQuestionBank,
  getQuestionBank
} from "@/api/onlineEducation/questionBank";
import {checkExamName} from "@/api/onlineEducation/exam";
import {addExam, checkExamName, editExam} from "@/api/onlineEducation/exam";
const dialogVisible = ref(false);
const title = ref("");
@@ -214,11 +232,30 @@
    name: '',
    categoryId: null,
    companyName: '',
    companyId: null
    companyId: null,
    judgeBankId: null,
    judgeMethod: 1,
    judgeNum: null,
    judgeScore: null,
    multiBankId: null,
    multiMethod: 1,
    multiNum: null,
    multiScore: null,
    singleBankId: null,
    singleMethod: 1,
    singleNum: null,
    singleScore: null,
    limited: 1,
    limitTime: null,
    passScore: null
  },
  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'}]
  },
  classifyList: [],
  isAdmin: false,
@@ -247,9 +284,7 @@
  }
  title.value = type === 'addFirst' || type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ;
  if(type === 'edit') {
    state.form.id = value.id
    state.form.name = value.name
    state.form.categoryId = value.categoryId
    state.form = value
    startUsername.value = value.name;
  }else if(type === 'add' && value ){
    state.form.parentId = value.id
@@ -258,18 +293,18 @@
}
const onSubmit = async () => {
  if(state.isAdmin){
    ElMessage({
      type: 'warning',
      message: '管理员暂无权限'
    });
    return;
  }
  // if(state.isAdmin){
  //   ElMessage({
  //     type: 'warning',
  //     message: '管理员暂无权限'
  //   });
  //   return;
  // }
  const valid = await busRef.value.validate();
  if(valid){
    if(title.value === '新增'){
      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
      const res = await addQuestionBank(data)
      const res = await addExam(data)
      if(res.code === 200){
        ElMessage({
          type: 'success',
@@ -284,7 +319,7 @@
      dialogVisible.value = false;
    }else if(title.value === '编辑'){
      const {...data} = JSON.parse(JSON.stringify(state.form))
      const res = await editQuestionBank(data)
      const res = await editExam(data)
      if(res.code === 200){
        ElMessage({
          type: 'success',
@@ -348,7 +383,22 @@
    name: '',
    categoryId: null,
    companyName: '',
    companyId: null
    companyId: null,
    judgeBankId: null,
    judgeMethod: 1,
    judgeNum: null,
    judgeScore: null,
    multiBankId: null,
    multiMethod: 1,
    multiNum: null,
    multiScore: null,
    singleBankId: null,
    singleMethod: 1,
    singleNum: null,
    singleScore: null,
    limited: 0,
    limitTime: null,
    passScore: null
  }
}
const handleScroll = () => {
@@ -372,6 +422,14 @@
    ElMessage.warning(res.message)
  }
}
const changeLimit = (val) => {
  state.form.limitTime = null
  if(val === 0) {
    state.form.limitTime = 0
  }
}
defineExpose({
  openDialog
});