fuliqi
2024-10-28 c2a1c68a2a398e6d0f2f5854c65127efbff306b1
src/views/exam/paper/edit.vue
@@ -1,11 +1,6 @@
<template>
  <div class="app-container">
    <el-form :model="form" ref="form" label-width="150px" v-loading="formLoading" :rules="rules">
      <el-form-item label="学科:" prop="subjectId" required>
        <el-select v-model="form.subjectId" placeholder="学科">
          <el-option v-for="item in subjects" :key="item.id" :label="item.name" :value="item.id"/>
        </el-select>
      </el-form-item>
      <el-form-item label="试卷类型:" prop="paperType" required>
        <el-select v-model="form.paperType" placeholder="试卷类型">
          <el-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
@@ -14,8 +9,10 @@
      <el-form-item label="试卷名称:" prop="name" required>
        <el-input style="width: 300px" v-model="form.name"/>
      </el-form-item>
      <!-- 题目详细信息 -->
      <el-form-item :key="index" :label="'标题'+(index+1)+':'" required
                    v-for="(titleItem,index) in form.questionTitleList" v-show="form.paperType===1 || (form.paperType ===3 && form.id)">
                    v-for="(titleItem,index) in form.questionTitleList"
                    v-show="form.paperType===1 || (form.paperType ===3 && form.id)">
        <el-input v-model="titleItem.title" style="width: 50%"/>
        <el-select @change="addQuestionType" v-model="titleItem.questionType" style="margin-left: 20px"
                   placeholder="请选择题目类型">
@@ -26,7 +23,8 @@
            :value="item.value"
            :disabled="addedQuestionTypes.includes(item.value)"/><!-- 禁用已添加的选项 -->
        </el-select>
        <el-input-number v-show ="titleItem.questionList.length > 0" v-model="titleItem.eachScore" @change="updateScores(titleItem)" :min="0" :precision="1"
        <el-input-number v-show="titleItem.questionList.length > 0" v-model="titleItem.eachScore"
                         @change="updateScores(titleItem)" :min="0" :precision="1"
                         style="margin-left: 20px" placeholder="每题分数"></el-input-number>
        <el-button type="text" class="link-left" style="margin-left: 20px" size="mini" @click="addQuestion(titleItem)">
          添加题目
@@ -72,31 +70,56 @@
        <el-radio v-model="form.visibility" :label="'1'">私有</el-radio>
        <el-radio v-model="form.visibility" :label="'2'">公开</el-radio>
      </el-form-item>
      <!-- 题目配置信息 随机试卷或新建随序才显示 -->
      <el-form-item v-show="form.paperType ===2 || (form.paperType ===3 && !form.id)" :key="index"
                    :label="translateQuestionType(item.questionType)+':'" v-for="(item,index) in form.questionSetting">
        <div style="display: flex;">
                    :label="translateQuestionType(item.questionType)+':'" v-for="(item,index) in form.questionSetting"
      >
        <div>
          <span style="margin-right: 10px">{{ '标题' }}</span>
          <el-input v-model="item.title" style="margin-right: 50px;width: 500px"/>
          <span style="margin-right: 10px">{{ '数量' }}</span>
          <el-input-number v-model="item.num" :precision="0" :min="0" style="margin-right: 50px"/>
          <span style="margin-right: 10px">{{ '每题分数' }}</span>
          <el-input-number v-model="item.score" :min="0" :precision="1"/>
          <el-input v-model="item.title" style="margin-bottom: 20px;margin-right: 30px;width: 800px"/>
          <el-button type="primary" @click=addToQuestionSetting(item.questionType)>添加</el-button>
          <div style="display: flex;margin-bottom: 10px;" :key="index" v-for="(setting,index) in item.settingList">
            <span style="margin-right: 10px;">{{ '难度' }}</span>
            <el-rate v-model="setting.difficult" :precision="0" :min="0" style="margin-right: 25px;padding: 5px 0"/>
            <span style="margin-right: 10px">{{ '科目' }}</span>
            <el-select v-model="setting.subjectId" placeholder="学科" style="margin-right: 25px">
              <el-option v-for="item in subjects" :key="item.id" :label="item.name" :value="item.id"/>
            </el-select>
            <span style="margin-right: 10px">{{ '数量' }}</span>
            <el-input-number v-model="setting.num" :precision="0" :min="0" style="margin-right: 25px"/>
            <span style="margin-right: 10px">{{ '每题分数' }}</span>
            <el-input-number v-model="setting.score" :min="0" :precision="1" style="margin-right: 25px"/>
            <el-button type="danger" icon="el-icon-delete" circle
                       @click="removeQuestionSetting(item,index)"></el-button>
          </div>
        </div>
      </el-form-item>
      <el-form-item label="合计:">
        <div style="display: flex;">
          <span style="margin-right: 10px">{{ '数量:' }}</span>
          <span v-if ="form.paperType ===2 || (form.paperType ===3 && !form.id)" style="margin-right: 50px;width: 100px">{{ totalNum }}</span>
          <span v-if ="form.paperType ===1 || (form.paperType ===3 && form.id)" style="margin-right: 50px;width: 100px">{{ form.num }}</span>
          <span v-if="form.paperType ===2 || (form.paperType ===3 && !form.id)" style="margin-right: 50px;width: 100px">{{
              totalNum
            }}</span>
          <span v-if="form.paperType ===1 || (form.paperType ===3 && form.id)" style="margin-right: 50px;width: 100px">{{
              form.num
            }}</span>
          <span style="margin-right: 10px">{{ '总分:' }}</span>
          <span v-if ="form.paperType ===2 || (form.paperType ===3 && !form.id)" style="width: 100px">{{ totalScore }}</span>
          <span v-if ="form.paperType ===1 || (form.paperType ===3 && form.id)" style="width: 100px">{{ form.score }}</span>
          <span v-if="form.paperType ===2 || (form.paperType ===3 && !form.id)" style="width: 100px">{{
              totalScore
            }}</span>
          <span v-if="form.paperType ===1 || (form.paperType ===3 && form.id)" style="width: 100px">{{
              form.score
            }}</span>
        </div>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm">提交</el-button>
        <el-button @click="resetForm">重置</el-button>
        <el-button type="success" @click="addTitle" v-show="form.paperType ===1 ||(form.paperType ===3 && form.id)">添加标题</el-button>
        <el-button type="success" @click="addTitle" v-show="form.paperType ===1 ||(form.paperType ===3 && form.id)">
          添加标题
        </el-button>
      </el-form-item>
    </el-form>
@@ -104,6 +127,11 @@
      <el-form :model="questionPage.queryParam" ref="queryForm" :inline="true">
        <el-form-item label="ID:">
          <el-input v-model="questionPage.queryParam.id" clearable></el-input>
        </el-form-item>
        <el-form-item label="学科:">
          <el-select v-model="questionPage.queryParam.subjectIdInt" placeholder="学科">
            <el-option v-for="item in subjects" :key="item.id" :label="item.name" :value="item.id"/>
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="queryForm">查询</el-button>
@@ -146,7 +174,6 @@
    return {
      form: {
        id: null,
        subjectId: null,
        paperType: 1,
        name: '',
        num: 0,
@@ -156,14 +183,46 @@
        deductTypeScore: 0,
        visibility: '1',
        questionSetting: [
          { questionType: 1, title: '单选题', score: null, num: null },
          { questionType: 2, title: '多选题', score: null, num: null },
          { questionType: 3, title: '判断题', score: null, num: null },
          { questionType: 4, title: '填空题', score: null, num: null },
          { questionType: 5, title: '简答题', score: null, num: null },
          { questionType: 6, title: '语音题', score: null, num: null },
          { questionType: 7, title: '计算题', score: null, num: null },
          { questionType: 8, title: '分析题', score: null, num: null },
          {
            title: '单选题',
            questionType: 1,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '多选题',
            questionType: 2,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '判断题',
            questionType: 3,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '填空题',
            questionType: 4,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '简答题',
            questionType: 5,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '语音题',
            questionType: 6,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '计算题',
            questionType: 7,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '分析题',
            questionType: 8,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          }
        ],
        questionTitleList: []
      },
@@ -180,18 +239,12 @@
        { name: '简答题', value: 5 },
        { name: '语音题', value: 6 },
        { name: '计算题', value: 7 },
        { name: '分析题', value: 8 },
        { name: '分析题', value: 8 }
      ],
      addedQuestionTypes: [], // 已添加的题目类型
      subjects: [],
      formLoading: false,
      rules: {
        level: [
          { required: true, message: '请选择年级', trigger: 'change' }
        ],
        subjectId: [
          { required: true, message: '请选择学科', trigger: 'change' }
        ],
        paperType: [
          { required: true, message: '请选择试卷类型', trigger: 'change' }
        ],
@@ -207,6 +260,7 @@
        showDialog: false,
        queryParam: {
          id: null,
          subjectIdInt: null,
          questionType: [],
          subjectId: [],
          pageIndex: 1,
@@ -228,10 +282,18 @@
      examPaperApi.select(id).then(re => {
        _this.form = re.data
        _this.formLoading = false
        this.addQuestionType()
      })
    }
  },
  methods: {
    addToQuestionSetting (questionType) {
      this.form.questionSetting.forEach(item => {
        if (item.questionType === questionType) {
          item.settingList.push({ difficult: null, score: null, num: null, subjectId: null })
        }
      })
    },
    updateTotalScore () {
      this.form.score = 0
      this.form.questionTitleList.forEach(titleItem => {
@@ -321,27 +383,39 @@
    addQuestion (titleItem) {
      this.currentTitleItem = titleItem
      this.questionPage.queryParam.questionType = []
      this.questionPage.queryParam.status = 1
      if (!titleItem.questionType) {
        this.$message({
          message: '请先选择题型',
          type: 'warning'
        })
        return
      }
      this.questionPage.queryParam.questionType.push(titleItem.questionType)
      this.questionPage.showDialog = true
      this.search()
    },
    removeTitleItem (titleItem ,index) {
    removeTitleItem (titleItem, index) {
      this.form.questionTitleList.splice(index, 1)
      this.form.num = this.form.num - titleItem.questionList.length
      this.updateTotalScore();
      this.updateTotalScore()
      if (!this.form.questionTitleList || this.form.questionTitleList.length === 0) {
        this.addedQuestionTypes = []
      } else {
        this.addQuestionType()
      }
    },
    removeQuestion (titleItem ,questionIndex) {
      titleItem.questionList.splice(questionIndex ,1)
      this.updateTotalScore();
    removeQuestion (titleItem, questionIndex) {
      titleItem.questionList.splice(questionIndex, 1)
      this.updateTotalScore()
      this.form.num = this.form.num - 1
    },
    removeQuestionSetting (item, index) {
      item.settingList.splice(index, 1)
    },
    queryForm () {
      this.questionPage.queryParam.pageIndex = 1
      this.questionPage.queryParam.subjectId = [this.questionPage.queryParam.subjectIdInt]
      this.search()
    },
    confirmQuestionSelect () {
@@ -355,8 +429,6 @@
      this.questionPage.showDialog = false
    },
    search () {
      this.questionPage.queryParam.subjectId = []
      this.questionPage.queryParam.subjectId.push(this.form.subjectId)
      this.questionPage.listLoading = true
      questionApi.pageList(this.questionPage.queryParam).then(data => {
        const re = data.data
@@ -383,14 +455,46 @@
        deductTypeScore: 0,
        visibility: '1',
        questionSetting: [
          { questionType: 1, title: '单选题', score: null, num: null },
          { questionType: 2, title: '多选题', score: null, num: null },
          { questionType: 3, title: '判断题', score: null, num: null },
          { questionType: 4, title: '填空题', score: null, num: null },
          { questionType: 5, title: '简答题', score: null, num: null },
          { questionType: 6, title: '语音题', score: null, num: null },
          { questionType: 7, title: '计算题', score: null, num: null },
          { questionType: 8, title: '分析题', score: null, num: null },
          {
            title: '单选题',
            questionType: 1,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '多选题',
            questionType: 2,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '判断题',
            questionType: 3,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '填空题',
            questionType: 4,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '简答题',
            questionType: 5,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '语音题',
            questionType: 6,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '计算题',
            questionType: 7,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          },
          {
            title: '分析题',
            questionType: 8,
            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
          }
        ],
        questionTitleList: []
      }
@@ -405,8 +509,10 @@
    totalNum () {
      if (this.form.paperType === 2 || this.form.paperType === 3) {
        let total = 0
        for (let item of this.form.questionSetting) {
          total += parseInt(item.num || 0, 10)
        for (let settings of this.form.questionSetting) {
          for (let item of settings.settingList) {
            total += parseInt(item.num || 0, 10)
          }
        }
        this.form.num = total
        return total
@@ -417,10 +523,12 @@
    totalScore () {
      if (this.form.paperType === 2 || this.form.paperType === 3) {
        let total = 0
        for (let item of this.form.questionSetting) {
          const num = parseInt(item.num || 0, 10)
          const score = parseFloat(item.score || 0)
          total += num * score
        for (let settings of this.form.questionSetting) {
          for (let item of settings.settingList) {
            const num = parseInt(item.num || 0, 10)
            const score = parseFloat(item.score || 0)
            total += num * score
          }
        }
        this.form.score = total.toFixed(1)
        return total.toFixed(1) // 保留一位小数