From b43bad8ef992d4abdebf96feb6f4fe862e8f4d8a Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期一, 17 六月 2024 09:38:14 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/exam/question/edit/analysis.vue          |  193 ++++++++++++++++++++++++
 src/views/exam/question/edit/calculate.vue         |  193 ++++++++++++++++++++++++
 src/views/answer/components/QuestionAnswerShow.vue |    6 
 src/store/modules/enumItem.js                      |    6 
 src/views/answer/list.vue                          |    4 
 src/router.js                                      |   14 +
 src/views/exam/question/components/Show.vue        |    2 
 src/views/exam/question/edit/audio.vue             |   19 ++
 8 files changed, 429 insertions(+), 8 deletions(-)

diff --git a/src/router.js b/src/router.js
index 5dede70..4be4188 100644
--- a/src/router.js
+++ b/src/router.js
@@ -173,6 +173,20 @@
         name: 'audioPage',
         meta: { title: '璇煶棰樼紪杈�', noCache: true, activeMenu: '/exam/question/list' },
         hidden: true
+      },
+      {
+        path: 'question/edit/calculate',
+        component: () => import('@/views/exam/question/edit/calculate'),
+        name: 'audioPage',
+        meta: { title: '璁$畻棰樼紪杈�', noCache: true, activeMenu: '/exam/question/list' },
+        hidden: true
+      },
+      {
+        path: 'question/edit/analysis',
+        component: () => import('@/views/exam/question/edit/analysis'),
+        name: 'audioPage',
+        meta: { title: '鍒嗘瀽棰樼紪杈�', noCache: true, activeMenu: '/exam/question/list' },
+        hidden: true
       }
     ]
   },
diff --git a/src/store/modules/enumItem.js b/src/store/modules/enumItem.js
index eee505a..9572098 100644
--- a/src/store/modules/enumItem.js
+++ b/src/store/modules/enumItem.js
@@ -15,13 +15,15 @@
       paperTypeEnum: [{ key: 1, value: '鍥哄畾璇曞嵎' }, { key: 2, value: '闅忔満璇曞嵎' }, { key: 3, value: '闅忓簭璇曞嵎' }]
     },
     question: {
-      typeEnum: [{ key: 1, value: '鍗曢�夐' }, { key: 2, value: '澶氶�夐' }, { key: 3, value: '鍒ゆ柇棰�' }, { key: 4, value: '濉┖棰�' }, { key: 5, value: '绠�绛旈' }, { key: 6, value: '璇煶棰�' }],
+      typeEnum: [{ key: 1, value: '鍗曢�夐' }, { key: 2, value: '澶氶�夐' }, { key: 3, value: '鍒ゆ柇棰�' }, { key: 4, value: '濉┖棰�' }, { key: 5, value: '绠�绛旈' }, { key: 6, value: '璇煶棰�' }, { key: 7, value: '璁$畻棰�' }, { key: 8, value: '鍒嗘瀽棰�' }],
       editUrlEnum: [{ key: 1, value: '/exam/question/edit/singleChoice', name: '鍗曢�夐' },
         { key: 2, value: '/exam/question/edit/multipleChoice', name: '澶氶�夐' },
         { key: 3, value: '/exam/question/edit/trueFalse', name: '鍒ゆ柇棰�' },
         { key: 4, value: '/exam/question/edit/gapFilling', name: '濉┖棰�' },
         { key: 5, value: '/exam/question/edit/shortAnswer', name: '绠�绛旈' },
-        { key: 6, value: '/exam/question/edit/audio', name: '璇煶棰�' }]
+        { key: 6, value: '/exam/question/edit/audio', name: '璇煶棰�' },
+        { key: 7, value: '/exam/question/edit/calculate', name: '璁$畻棰�' },
+        { key: 8, value: '/exam/question/edit/analysis', name: '鍒嗘瀽棰�' }]
     }
   }
 }
diff --git a/src/views/answer/components/QuestionAnswerShow.vue b/src/views/answer/components/QuestionAnswerShow.vue
index 087f037..f84e195 100644
--- a/src/views/answer/components/QuestionAnswerShow.vue
+++ b/src/views/answer/components/QuestionAnswerShow.vue
@@ -1,6 +1,6 @@
 <template>
   <div v-loading="qLoading" style="line-height:1.8">
-    <div v-if="qType == 1 || qType == 2 || qType == 3 || qType == 4 || qType == 5 || qType == 6">
+    <div v-if="qType == 1 || qType == 2 || qType == 3 || qType == 4 || qType == 5 || qType == 6 || qType == 7 || qType == 8">
       <div v-if="qType == 1 || qType == 6">
         <div class="q-title" v-html="question.title" />
         <div class="q-content">
@@ -42,7 +42,7 @@
           </el-form-item>
         </div>
       </div>
-      <div v-else-if="qType == 5">
+      <div v-else-if="qType == 5 || qType == 7 || qType == 8">
         <div class="q-title" v-html="question.title" />
         <div>
           <el-input v-model="answer.content" type="textarea" rows="5"></el-input>
@@ -69,7 +69,7 @@
       </div>
       <div class="question-answer-show-item">
         <span class="question-show-item">姝g‘绛旀锛�</span>
-        <span v-if="qType == 1 || qType == 2 || qType == 5 || qType == 6" v-html="question.correct" class="q-item-span-content" />
+        <span v-if="qType == 1 || qType == 2 || qType == 5 || qType == 6 || qType == 7 || qType == 8" v-html="question.correct" class="q-item-span-content" />
         <span v-if="qType == 3" v-html="trueFalseFormatter(question)" class="q-item-span-content" />
         <span v-if="qType == 4">{{ question.correctArray }}</span>
       </div>
diff --git a/src/views/answer/list.vue b/src/views/answer/list.vue
index 8b8e238..63d1414 100644
--- a/src/views/answer/list.vue
+++ b/src/views/answer/list.vue
@@ -2,6 +2,9 @@
   <div class="app-container">
     <el-form :inline="true" :model="queryParam" class="demo-form-inline" label-width="80px">
       <el-form-item>
+        <el-input v-model="queryParam.examName" placeholder="璇疯緭鍏ヨ�冭瘯鍚嶇О" clearable></el-input>
+      </el-form-item>
+      <el-form-item>
         <el-input v-model="queryParam.name" placeholder="璇疯緭鍏ヨ瘯鍗峰悕绉�" clearable></el-input>
       </el-form-item>
       <el-form-item>
@@ -15,6 +18,7 @@
     </el-form>
 
     <el-table v-loading="listLoading" :data="tableData" border style="width: 100%;">
+      <el-table-column align="center" prop="examName" label="鑰冭瘯鍚嶇О" />
       <el-table-column align="center" prop="paperName" label="璇曞嵎鍚嶇О" />
       <el-table-column align="center" prop="subjectName" label="绉戠洰" />
       <el-table-column align="center" prop="paperType" label="璇曞嵎绫诲瀷" width="150px">
diff --git a/src/views/exam/question/components/Show.vue b/src/views/exam/question/components/Show.vue
index 468780b..2179805 100644
--- a/src/views/exam/question/components/Show.vue
+++ b/src/views/exam/question/components/Show.vue
@@ -29,7 +29,7 @@
     <div v-else-if="qType==4" v-loading="qLoading">
       <div class="q-title" v-html="question.title"/>
     </div>
-    <div v-else-if="qType==5" v-loading="qLoading">
+    <div v-else-if="qType==5 || qType == 7 || qType == 8" v-loading="qLoading">
       <div class="q-title" v-html="question.title"/>
     </div>
     <div v-else>
diff --git a/src/views/exam/question/edit/analysis.vue b/src/views/exam/question/edit/analysis.vue
new file mode 100644
index 0000000..eb200f0
--- /dev/null
+++ b/src/views/exam/question/edit/analysis.vue
@@ -0,0 +1,193 @@
+<template>
+  <div class="app-container">
+    <el-form :model="form" ref="form" label-width="100px" 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" :value="item.id" :label="item.name"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="棰樺共锛�" prop="title" required>
+        <el-input v-model="form.title"   @focus="inputClick(form,'title')" />
+      </el-form-item>
+      <el-form-item label="绛旀锛�" prop="correct" required>
+        <el-input v-model="form.correct"   @focus="inputClick(form,'correct')" />
+      </el-form-item>
+      <el-form-item label="瑙f瀽锛�" prop="analyze" required>
+        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
+      </el-form-item>
+      <el-form-item label="闅惧害锛�" required>
+        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
+      </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="showQuestion">棰勮</el-button>
+      </el-form-item>
+    </el-form>
+    <el-dialog  :visible.sync="richEditor.dialogVisible"  append-to-body :close-on-click-modal="false" style="width: 100%;height: 100%"   :show-close="false" center>
+      <Ueditor @ready="editorReady"/>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="editorConfirm">纭� 瀹�</el-button>
+        <el-button @click="richEditor.dialogVisible = false">鍙� 娑�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
+      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import QuestionShow from '../components/Show'
+import Ueditor from '@/components/Ueditor'
+import { mapGetters, mapState, mapActions } from 'vuex'
+import questionApi from '@/api/question'
+
+export default {
+  components: {
+    Ueditor, QuestionShow
+  },
+  data () {
+    return {
+      form: {
+        id: null,
+        questionType: 8,
+        gradeLevel: null,
+        subjectId: null,
+        title: '',
+        items: [],
+        analyze: '',
+        correct: '',
+        score: '',
+        difficult: 0
+      },
+      subjectFilter: null,
+      formLoading: false,
+      rules: {
+        gradeLevel: [
+          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
+        ],
+        subjectId: [
+          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
+        ],
+        title: [
+          { required: true, message: '璇疯緭鍏ラ骞�', trigger: 'blur' }
+        ],
+        correct: [
+          { required: true, message: '璇疯緭鍏ョ瓟妗�', trigger: 'blur' }
+        ],
+        analyze: [
+          { required: true, message: '璇疯緭鍏ヨВ鏋�', trigger: 'blur' }
+        ],
+        score: [
+          { required: true, message: '璇疯緭鍏ュ垎鏁�', trigger: 'blur' }
+        ]
+      },
+      richEditor: {
+        dialogVisible: false,
+        object: null,
+        parameterName: '',
+        instance: null
+      },
+      questionShow: {
+        qType: 0,
+        dialog: false,
+        question: null,
+        loading: false
+      }
+    }
+  },
+  created () {
+    let id = this.$route.query.id
+    let _this = this
+    this.initSubject(function () {
+      _this.subjectFilter = _this.subjects
+    })
+    if (id && parseInt(id) !== 0) {
+      _this.formLoading = true
+      questionApi.select(id).then(re => {
+        _this.form = re.data
+        _this.formLoading = false
+      })
+    }
+  },
+  methods: {
+    editorReady (instance) {
+      this.richEditor.instance = instance
+      let currentContent = this.richEditor.object[this.richEditor.parameterName]
+      this.richEditor.instance.setContent(currentContent)
+      // 鍏夋爣瀹氫綅鍒癠editor
+      this.richEditor.instance.focus(true)
+    },
+    inputClick (object, parameterName) {
+      this.richEditor.object = object
+      this.richEditor.parameterName = parameterName
+      this.richEditor.dialogVisible = true
+    },
+    editorConfirm () {
+      let content = this.richEditor.instance.getContent()
+      this.richEditor.object[this.richEditor.parameterName] = content
+      this.richEditor.dialogVisible = false
+    },
+    submitForm () {
+      let _this = this
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.formLoading = true
+          questionApi.edit(this.form).then(re => {
+            if (re.code === 1) {
+              _this.$message.success(re.message)
+              _this.delCurrentView(_this).then(() => {
+                _this.$router.push('/exam/question/list')
+              })
+            } else {
+              _this.$message.error(re.message)
+              this.formLoading = false
+            }
+          }).catch(e => {
+            this.formLoading = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    resetForm () {
+      let lastId = this.form.id
+      this.$refs['form'].resetFields()
+      this.form = {
+        id: null,
+        questionType: 5,
+        gradeLevel: null,
+        subjectId: null,
+        title: '',
+        items: [],
+        analyze: '',
+        correct: '',
+        score: '',
+        difficult: 0
+      }
+      this.form.id = lastId
+    },
+    levelChange () {
+      this.form.subjectId = null
+      this.subjectFilter = this.subjects.filter(data => data.level === this.form.gradeLevel)
+    },
+    showQuestion () {
+      this.questionShow.dialog = true
+      this.questionShow.qType = this.form.questionType
+      this.questionShow.question = this.form
+    },
+    ...mapActions('exam', { initSubject: 'initSubject' }),
+    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
+  },
+  computed: {
+    ...mapGetters('enumItem', ['enumFormat']),
+    ...mapState('enumItem', {
+      questionTypeEnum: state => state.exam.question.typeEnum,
+      levelEnum: state => state.user.levelEnum
+    }),
+    ...mapState('exam', { subjects: state => state.subjects })
+  }
+}
+</script>
diff --git a/src/views/exam/question/edit/audio.vue b/src/views/exam/question/edit/audio.vue
index 7f88df7..4743443 100644
--- a/src/views/exam/question/edit/audio.vue
+++ b/src/views/exam/question/edit/audio.vue
@@ -11,8 +11,10 @@
       </el-form-item>
       <el-form-item label="璇煶锛�" prop="audioFile" required>
         <el-upload v-model="form.audioFile" :action="uploadUrl" :limit="1" accept="audio/*" :on-success="uploadSuccess"
-          :file-list="audioList">
+          :on-remove="handleRemove" :file-list="audioList">
           <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
+          <el-button v-if="form.audioFile" size="small" type="primary" @click.stop="audioPlay(form.audioFile)">{{
+      audioInstance ? '鏆傚仠' : '璇曞惉' }}</el-button>
         </el-upload>
       </el-form-item>
       <el-form-item label="閫夐」锛�" required>
@@ -125,7 +127,8 @@
         dialog: false,
         question: null,
         loading: false
-      }
+      },
+      audioInstance: null
     }
   },
   created() {
@@ -144,6 +147,18 @@
     }
   },
   methods: {
+    handleRemove() {
+      this.form.audioFile = ''
+    },
+    audioPlay(url) {
+      if (this.audioInstance) {
+        this.audioInstance.pause();
+        this.audioInstance = null;
+      } else {
+        this.audioInstance = new Audio('/api/files/' + url);
+        this.audioInstance.play();
+      }
+    },
     uploadSuccess(response) {
       this.form.audioFile = response.data.url;
       this.form.originalFile = response.data.name;
diff --git a/src/views/exam/question/edit/calculate.vue b/src/views/exam/question/edit/calculate.vue
new file mode 100644
index 0000000..7533456
--- /dev/null
+++ b/src/views/exam/question/edit/calculate.vue
@@ -0,0 +1,193 @@
+<template>
+  <div class="app-container">
+    <el-form :model="form" ref="form" label-width="100px" 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" :value="item.id" :label="item.name"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="棰樺共锛�" prop="title" required>
+        <el-input v-model="form.title"   @focus="inputClick(form,'title')" />
+      </el-form-item>
+      <el-form-item label="绛旀锛�" prop="correct" required>
+        <el-input v-model="form.correct"   @focus="inputClick(form,'correct')" />
+      </el-form-item>
+      <el-form-item label="瑙f瀽锛�" prop="analyze" required>
+        <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
+      </el-form-item>
+      <el-form-item label="闅惧害锛�" required>
+        <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
+      </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="showQuestion">棰勮</el-button>
+      </el-form-item>
+    </el-form>
+    <el-dialog  :visible.sync="richEditor.dialogVisible"  append-to-body :close-on-click-modal="false" style="width: 100%;height: 100%"   :show-close="false" center>
+      <Ueditor @ready="editorReady"/>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="editorConfirm">纭� 瀹�</el-button>
+        <el-button @click="richEditor.dialogVisible = false">鍙� 娑�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
+      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import QuestionShow from '../components/Show'
+import Ueditor from '@/components/Ueditor'
+import { mapGetters, mapState, mapActions } from 'vuex'
+import questionApi from '@/api/question'
+
+export default {
+  components: {
+    Ueditor, QuestionShow
+  },
+  data () {
+    return {
+      form: {
+        id: null,
+        questionType: 7,
+        gradeLevel: null,
+        subjectId: null,
+        title: '',
+        items: [],
+        analyze: '',
+        correct: '',
+        score: '',
+        difficult: 0
+      },
+      subjectFilter: null,
+      formLoading: false,
+      rules: {
+        gradeLevel: [
+          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
+        ],
+        subjectId: [
+          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
+        ],
+        title: [
+          { required: true, message: '璇疯緭鍏ラ骞�', trigger: 'blur' }
+        ],
+        correct: [
+          { required: true, message: '璇疯緭鍏ョ瓟妗�', trigger: 'blur' }
+        ],
+        analyze: [
+          { required: true, message: '璇疯緭鍏ヨВ鏋�', trigger: 'blur' }
+        ],
+        score: [
+          { required: true, message: '璇疯緭鍏ュ垎鏁�', trigger: 'blur' }
+        ]
+      },
+      richEditor: {
+        dialogVisible: false,
+        object: null,
+        parameterName: '',
+        instance: null
+      },
+      questionShow: {
+        qType: 0,
+        dialog: false,
+        question: null,
+        loading: false
+      }
+    }
+  },
+  created () {
+    let id = this.$route.query.id
+    let _this = this
+    this.initSubject(function () {
+      _this.subjectFilter = _this.subjects
+    })
+    if (id && parseInt(id) !== 0) {
+      _this.formLoading = true
+      questionApi.select(id).then(re => {
+        _this.form = re.data
+        _this.formLoading = false
+      })
+    }
+  },
+  methods: {
+    editorReady (instance) {
+      this.richEditor.instance = instance
+      let currentContent = this.richEditor.object[this.richEditor.parameterName]
+      this.richEditor.instance.setContent(currentContent)
+      // 鍏夋爣瀹氫綅鍒癠editor
+      this.richEditor.instance.focus(true)
+    },
+    inputClick (object, parameterName) {
+      this.richEditor.object = object
+      this.richEditor.parameterName = parameterName
+      this.richEditor.dialogVisible = true
+    },
+    editorConfirm () {
+      let content = this.richEditor.instance.getContent()
+      this.richEditor.object[this.richEditor.parameterName] = content
+      this.richEditor.dialogVisible = false
+    },
+    submitForm () {
+      let _this = this
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.formLoading = true
+          questionApi.edit(this.form).then(re => {
+            if (re.code === 1) {
+              _this.$message.success(re.message)
+              _this.delCurrentView(_this).then(() => {
+                _this.$router.push('/exam/question/list')
+              })
+            } else {
+              _this.$message.error(re.message)
+              this.formLoading = false
+            }
+          }).catch(e => {
+            this.formLoading = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    resetForm () {
+      let lastId = this.form.id
+      this.$refs['form'].resetFields()
+      this.form = {
+        id: null,
+        questionType: 5,
+        gradeLevel: null,
+        subjectId: null,
+        title: '',
+        items: [],
+        analyze: '',
+        correct: '',
+        score: '',
+        difficult: 0
+      }
+      this.form.id = lastId
+    },
+    levelChange () {
+      this.form.subjectId = null
+      this.subjectFilter = this.subjects.filter(data => data.level === this.form.gradeLevel)
+    },
+    showQuestion () {
+      this.questionShow.dialog = true
+      this.questionShow.qType = this.form.questionType
+      this.questionShow.question = this.form
+    },
+    ...mapActions('exam', { initSubject: 'initSubject' }),
+    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
+  },
+  computed: {
+    ...mapGetters('enumItem', ['enumFormat']),
+    ...mapState('enumItem', {
+      questionTypeEnum: state => state.exam.question.typeEnum,
+      levelEnum: state => state.user.levelEnum
+    }),
+    ...mapState('exam', { subjects: state => state.subjects })
+  }
+}
+</script>

--
Gitblit v1.8.0