龚焕茏
2024-06-05 51d32283921983508bebffee2ecd5cb4c4948e6a
feat:题目表移除分数字段、新增题目状态、条件多选
8个文件已修改
247 ■■■■■ 已修改文件
src/api/question.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PopUp/gap-filling.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PopUp/multiple-choice.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PopUp/question/Show.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PopUp/short-answer.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PopUp/single-choice.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PopUp/true-false.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Manage/TestPaper/QuestionBank.vue 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/question.js
@@ -3,6 +3,7 @@
export default {
  pageList: query => post('/api/admin/question/page', query),
  edit: query => post('/api/admin/question/edit', query),
  updateStatus: query => post('/api/admin/question/status', query),
  select: id => post('/api/admin/question/select/' + id),
  deleteQuestion: id => post('/api/admin/question/delete/' + id)
}
src/components/PopUp/gap-filling.vue
@@ -12,18 +12,17 @@
      <el-form-item label="填空答案:" required>
        <el-form-item :label="item.prefix" :key="item.prefix" v-for="item in form.items" label-width="50px"
          class="question-item-label">
          <el-input v-model="item.content" @focus="inputClick(item, 'content')" class="question-item-content-input"
            style="width: 50%" />
          <span class="question-item-span">分数:</span><el-input-number v-model="item.score" :precision="1" :step="1"
            :max="100"></el-input-number>
          <el-input v-model="item.content" @focus="inputClick(item, 'content')" class="question-item-content-input" />
          <!-- <span v-if="false" class="question-item-span">分数:</span><el-input-number v-model="item.score" :precision="1" :step="1"
            :max="100"></el-input-number> -->
        </el-form-item>
      </el-form-item>
      <el-form-item label="解析:" prop="analyze" required>
        <el-input v-model="form.analyze" @focus="inputClick(form, 'analyze')" />
      </el-form-item>
      <el-form-item label="分数:" prop="score" required>
      <!-- <el-form-item label="分数:" prop="score" required>
        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
      </el-form-item>
      </el-form-item> -->
      <el-form-item label="难度:" required>
        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
      </el-form-item>
@@ -105,17 +104,23 @@
      },
    }
  },
  props: {
    id: {
      type: Number,
      default: 0
    }
  },
  created() {
    let id = this.$route.query.id
    this.getSubjects();
    let id = this.id
    let _this = this
    if (id && parseInt(id) !== 0) {
      _this.formLoading = true
      questionApi.select(id).then(re => {
        _this.form = re.response
        _this.form = re.data
        _this.formLoading = false
      })
    }
    this.getSubjects();
  },
  methods: {
    // 获取科目
src/components/PopUp/multiple-choice.vue
@@ -19,9 +19,9 @@
      <el-form-item label="解析:" prop="analyze" required>
        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
      </el-form-item>
      <el-form-item label="分数:" prop="score" required>
      <!-- <el-form-item label="分数:" prop="score" required>
        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
      </el-form-item>
      </el-form-item> -->
      <el-form-item label="难度:" required>
        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
      </el-form-item>
@@ -53,7 +53,7 @@
<script>
import QuestionShow from '@/components/PopUp/question/Show'
import Ueditor from '@/components/Ueditor'
import { mapGetters, mapState, mapActions } from 'vuex'
import { mapActions } from 'vuex'
import questionApi from '@/api/question'
import subjectApi from '@/api/subject'
@@ -117,13 +117,20 @@
      }
    }
  },
  created () {
    let id = this.$route.query.id
  props: {
    id: {
      type: Number,
      default: 0
    }
  },
  created() {
    this.getSubjects();
    let id = this.id
    let _this = this
    if (id && parseInt(id) !== 0) {
      _this.formLoading = true
      questionApi.select(id).then(re => {
        _this.form = re.response
        _this.form = re.data
        _this.formLoading = false
      })
    }
src/components/PopUp/question/Show.vue
@@ -60,3 +60,8 @@
  methods: {}
}
</script>
<style scoped>
  /deep/ td {
    background-color: #f0f0f0;
  }
</style>
src/components/PopUp/short-answer.vue
@@ -15,9 +15,9 @@
      <el-form-item label="解析:" prop="analyze" required>
        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
      </el-form-item>
      <el-form-item label="分数:" prop="score" required>
      <!-- <el-form-item label="分数:" prop="score" required>
        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
      </el-form-item>
      </el-form-item> -->
      <el-form-item label="难度:" required>
        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
      </el-form-item>
@@ -43,7 +43,6 @@
<script>
import QuestionShow from '@/components/PopUp/question/Show'
import Ueditor from '@/components/Ueditor'
import { mapGetters, mapState, mapActions } from 'vuex'
import questionApi from '@/api/question'
import subjectApi from '@/api/subject'
@@ -102,13 +101,20 @@
      }
    }
  },
  created () {
    let id = this.$route.query.id
  props: {
    id: {
      type: Number,
      default: 0
    }
  },
  created() {
    this.getSubjects();
    let id = this.id
    let _this = this
    if (id && parseInt(id) !== 0) {
      _this.formLoading = true
      questionApi.select(id).then(re => {
        _this.form = re.response
        _this.form = re.data
        _this.formLoading = false
      })
    }
src/components/PopUp/single-choice.vue
@@ -19,9 +19,9 @@
      <el-form-item label="解析:" prop="analyze" required>
        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
      </el-form-item>
      <el-form-item label="分数:" prop="score" required>
      <!-- <el-form-item label="分数:" prop="score" required>
        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
      </el-form-item>
      </el-form-item> -->
      <el-form-item label="难度:" required>
        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
      </el-form-item>
@@ -53,7 +53,6 @@
<script>
import QuestionShow from '@/components/PopUp/question/Show'
import Ueditor from '@/components/Ueditor'
import { mapGetters, mapState, mapActions } from 'vuex'
import questionApi from '@/api/question'
import subjectApi from '@/api/subject'
@@ -117,13 +116,20 @@
      }
    }
  },
  created () {
    let id = this.$route.query.id
  props: {
    id: {
      type: Number,
      default: 0
    }
  },
  created() {
    this.getSubjects();
    let id = this.id
    let _this = this
    if (id && parseInt(id) !== 0) {
      _this.formLoading = true
      questionApi.select(id).then(re => {
        _this.form = re.response
        _this.form = re.data
        _this.formLoading = false
      })
    }
src/components/PopUp/true-false.vue
@@ -18,9 +18,9 @@
      <el-form-item label="解析:" prop="analyze" required>
        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
      </el-form-item>
      <el-form-item label="分数:" prop="score" required>
      <!-- <el-form-item label="分数:" prop="score" required>
        <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
      </el-form-item>
      </el-form-item> -->
      <el-form-item label="难度:" required>
        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
      </el-form-item>
@@ -51,7 +51,6 @@
<script>
import QuestionShow from '@/components/PopUp/question/Show'
import Ueditor from '@/components/Ueditor'
import { mapGetters, mapState, mapActions } from 'vuex'
import questionApi from '@/api/question'
import subjectApi from '@/api/subject'
@@ -113,13 +112,20 @@
      }
    }
  },
  created () {
    let id = this.$route.query.id
  props: {
    id: {
      type: Number,
      default: 0
    }
  },
  created() {
    this.getSubjects();
    let id = this.id
    let _this = this
    if (id && parseInt(id) !== 0) {
      _this.formLoading = true
      questionApi.select(id).then(re => {
        _this.form = re.response
        _this.form = re.data
        _this.formLoading = false
      })
    }
src/views/Manage/TestPaper/QuestionBank.vue
@@ -19,21 +19,23 @@
          <div>
            <el-form :inline="true" :model="queryParam" class="demo-form-inline" label-width="80px">
              <el-form-item>
                <el-input v-model="queryParam.content" placeholder="题目名"></el-input>
                <el-input v-model="queryParam.content" placeholder="请输入题目" clearable></el-input>
              </el-form-item>
              <el-form-item>
                <el-select v-model="queryParam.subjectId" placeholder="全部科目">
                  <el-option label="全部科目" value="shanghai"></el-option>
                  <el-option label="语文" value="beijing"></el-option>
                  <el-option label="数学" value="beijing"></el-option>
                  <el-option label="英语" value="beijing"></el-option>
                <el-select v-model="queryParam.subjectId" placeholder="请选择科目" clearable multiple @change="search">
                  <el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item>
                <el-select v-model="queryParam.questionType" placeholder="选择题">
                  <el-option label="选择题" value="shanghai"></el-option>
                  <el-option label="问答题" value="beijing"></el-option>
                  <el-option label="判断题" value="beijing"></el-option>
                <el-select v-model="queryParam.questionType" placeholder="请选择题型" clearable multiple @change="search">
                  <el-option v-for="item in questionTypeEnum" :key="item.key" :value="item.key"
                    :label="item.value"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item>
                <el-select v-model="queryParam.status" placeholder="请选择状态" clearable @change="search">
                  <el-option value="1" label="启用"></el-option>
                  <el-option value="2" label="禁用"></el-option>
                </el-select>
              </el-form-item>
@@ -43,56 +45,66 @@
            </el-form>
          </div>
          <!-- 表格 -->
          <el-table v-loading="listLoading" :header-cell-style="getRowClass" :data="tableData" border style="width: 100%;">
            <el-table-column align="center" prop="shortTitle" label="题目名">
          <el-table v-loading="listLoading" :header-cell-style="getRowClass" :data="tableData" border
            style="width: 100%;">
            <el-table-column align="center" prop="shortTitle" label="题目名" show-overflow-tooltip>
            </el-table-column>
            <el-table-column align="center" prop="subjectName" label="科目">
            <el-table-column align="center" prop="subjectName" label="科目" width="150px">
            </el-table-column>
            <el-table-column align="center" prop="questionTypeName" label="题型">
            <el-table-column align="center" prop="questionTypeName" label="题型" width="100px">
            </el-table-column>
            <el-table-column align="center" prop="score" label="分数">
            </el-table-column>
            <el-table-column prop="difficult" label="难度" width="60px"/>
            <el-table-column prop="createTime" label="创建时间" width="160px"/>
            <el-table-column label="操作" align="center" width="220px">
            <!-- <el-table-column align="center" prop="score" label="分数">
            </el-table-column> -->
            <el-table-column align="center" prop="difficult" label="难度" width="60px" />
            <el-table-column align="center" prop="createTime" label="创建时间" width="160px" />
            <el-table-column label="状态" prop="status" width="70px">
              <template slot-scope="{row}">
                <el-button size="mini"   @click="showQuestion(row)">预览</el-button>
                <el-button size="mini"  @click="editQuestion(row)">编辑</el-button>
                <el-button size="mini"  type="danger" @click="deleteQuestion(row)" class="link-left">删除</el-button>
                <el-tag :type="row.status === '禁用' ? 'danger' : 'success'">
                  {{ row.status ? row.status : '启用' }}
                </el-tag>
              </template>
            </el-table-column>
            <el-table-column label="操作" align="center" width="300px">
              <template slot-scope="{row}">
                <el-button size="mini" @click="showQuestion(row)">预览</el-button>
                <el-button size="mini" @click="editQuestion(row)">编辑</el-button>
                <el-button size="mini" type="primary" @click="statusQuestion(row)">{{ row.status === "禁用" ? "启用" : "禁用"
                  }}</el-button>
                <el-popconfirm title="确认删除吗" @confirm="deleteQuestion(row)">
                  <el-button slot="reference" size="mini" type="danger" class="link-left">删除</el-button>
                </el-popconfirm>
              </template>
            </el-table-column>
          </el-table>
          <div class="block" style="display: flex; margin-top: 40px;">
            <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex"
              :limit.sync="queryParam.pageSize" @pagination="search" />
          </div>
          <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex"
            :limit.sync="queryParam.pageSize" @pagination="search" />
        </div>
      </div>
    </div>
    <!-- 填空 -->
    <el-dialog :visible.sync="gapVisible" :close-on-click-modal="false">
      <gap ref="gap" @children="parentGoods" @callback="callback" />
    <el-dialog :visible.sync="gapVisible" :close-on-click-modal="false" v-if="gapVisible">
      <gap ref="gap" @children="parentGoods" @callback="callback" :id="updateId" />
    </el-dialog>
    <!-- 多选 -->
    <el-dialog :visible.sync="multipleVisible" :close-on-click-modal="false">
      <multiple ref="multiple" @children="parentGoods" @callback="callback" />
    <el-dialog :visible.sync="multipleVisible" :close-on-click-modal="false" v-if="multipleVisible">
      <multiple ref="multiple" @children="parentGoods" @callback="callback" :id="updateId" />
    </el-dialog>
    <!-- 简答 -->
    <el-dialog :visible.sync="shortVisible" :close-on-click-modal="false">
      <short ref="short" @children="parentGoods" @callback="callback" />
    <el-dialog :visible.sync="shortVisible" :close-on-click-modal="false" v-if="shortVisible">
      <short ref="short" @children="parentGoods" @callback="callback" :id="updateId" />
    </el-dialog>
    <!-- 单选 -->
    <el-dialog :visible.sync="singleVisible" :close-on-click-modal="false">
      <single ref="single" @children="parentGoods" @callback="callback" />
    <el-dialog :visible.sync="singleVisible" :close-on-click-modal="false" v-if="singleVisible">
      <single ref="single" @children="parentGoods" @callback="callback" :id="updateId" />
    </el-dialog>
    <!-- 判断 -->
    <el-dialog :visible.sync="truesVisible" :close-on-click-modal="false">
      <trues ref="trues" @children="parentGoods" @callback="callback" />
    <el-dialog :visible.sync="truesVisible" :close-on-click-modal="false" v-if="truesVisible">
      <trues ref="trues" @children="parentGoods" @callback="callback" :id="updateId" />
    </el-dialog>
    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading" />
    </el-dialog>
  </div>
</template>
@@ -106,6 +118,8 @@
import { mapGetters, mapState } from 'vuex'
import questionApi from '@/api/question'
import QuestionShow from '@/components/PopUp/question/Show'
import subjectApi from '@/api/subject'
import Pagination from '@/components/Pagination'
export default {
  // 注册
@@ -115,10 +129,12 @@
    short,
    single,
    trues,
    QuestionShow
    QuestionShow,
    Pagination
  },
  data() {
    return {
      updateId: '',
      questionShow: {
        qType: 0,
        dialog: false,
@@ -127,9 +143,10 @@
      },
      listLoading: true,
      queryParam: {
        questionType: null,
        subjectId: null,
        content: null,
        questionType: [],
        subjectId: [],
        content: '',
        status: '',
        pageIndex: 1,
        pageSize: 10
      },
@@ -140,12 +157,20 @@
      singleVisible: false,
      truesVisible: false,
      tableData: [],
      subjects: []
    };
  },
  created() {
    this.search()
    this.getSubjects();
  },
  methods: {
    // 获取科目
    getSubjects() {
      subjectApi.list().then(re => {
        this.subjects = re.data
      })
    },
    callback() {
      this.gapVisible = false;
      this.multipleVisible = false;
@@ -165,21 +190,9 @@
        this.listLoading = false
      })
    },
    // 返回上一个页面
    goBack() {
      this.$router.back();
    },
    // 修改表单头部的颜色
    getRowClass() {
      return "background:#d2d3d6";
    },
    // 生成试卷
    getCreate() {
      // 跳转到生成页面
      //跳转到对应的管理页面
      this.$router.push({
        path: "/manage/test-paper-generation",
      });
    },
    // 点击后调用弹窗组件的方法,开启弹窗
    getDialogFormVisible(value) {
@@ -200,13 +213,14 @@
          this.truesVisible = true;
          break;
      }
      this.updateId = '';
    },
    // 弹窗
    // 接收弹窗组件返回的表单值
    parentGoods(obj) {
      console.log(obj, "弹窗组件的表单值");
    },
    showQuestion (row) {
    showQuestion(row) {
      let _this = this
      this.questionShow.dialog = true
      this.questionShow.loading = true
@@ -216,11 +230,25 @@
        _this.questionShow.loading = false
      })
    },
    editQuestion (row) {
      let url = this.enumFormat(this.editUrlEnum, row.questionType)
      this.$router.push({ path: url, query: { id: row.id } })
    editQuestion(row) {
      this.getDialogFormVisible(row.questionTypeName);
      this.updateId = row.id;
    },
    deleteQuestion (row) {
    statusQuestion(row) {
      let question = {
        id: row.id,
        status: row.status === '禁用' ? '启用' : '禁用'
      }
      questionApi.updateStatus(question).then(re => {
        if (re.code === 1) {
          this.$message.success(re.message)
          this.search()
        } else {
          this.$message.error(re.message)
        }
      })
    },
    deleteQuestion(row) {
      let _this = this
      questionApi.deleteQuestion(row.id).then(re => {
        if (re.code === 1) {
@@ -239,7 +267,6 @@
      editUrlEnum: state => state.exam.question.editUrlEnum
    }),
    ...mapGetters('exam', ['subjectEnumFormat']),
    ...mapState('exam', { subjects: state => state.subjects })
  }
};
</script>