| | |
| | | name: 'shortAnswerPage', |
| | | meta: { title: '简答题编辑', noCache: true, activeMenu: '/exam/question/list' }, |
| | | hidden: true |
| | | }, |
| | | { |
| | | path: 'question/edit/audio', |
| | | component: () => import('@/views/exam/question/edit/audio'), |
| | | name: 'audioPage', |
| | | meta: { title: '语音题编辑', noCache: true, activeMenu: '/exam/question/list' }, |
| | | hidden: true |
| | | } |
| | | ] |
| | | }, |
| | |
| | | paperTypeEnum: [{ key: 1, value: '固定试卷' }, { key: 4, value: '时段试卷' }, { key: 6, value: '任务试卷' }] |
| | | }, |
| | | question: { |
| | | typeEnum: [{ key: 1, value: '单选题' }, { key: 2, value: '多选题' }, { key: 3, value: '判断题' }, { key: 4, value: '填空题' }, { key: 5, value: '简答题' }], |
| | | typeEnum: [{ key: 1, value: '单选题' }, { key: 2, value: '多选题' }, { key: 3, value: '判断题' }, { key: 4, value: '填空题' }, { key: 5, value: '简答题' }, { key: 6, 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: 5, value: '/exam/question/edit/shortAnswer', name: '简答题' }, |
| | | { key: 6, value: '/exam/question/edit/audio', name: '语音题' }] |
| | | } |
| | | } |
| | | } |
| | |
| | | <template> |
| | | <div v-loading="qLoading" style="line-height:1.8"> |
| | | <div v-if="qType == 1 || qType == 2 || qType == 3 || qType == 4 || qType == 5"> |
| | | <div v-if="qType == 1"> |
| | | <div v-if="qType == 1 || qType == 2 || qType == 3 || qType == 4 || qType == 5 || qType == 6"> |
| | | <div v-if="qType == 1 || qType == 6"> |
| | | <div class="q-title" v-html="question.title" /> |
| | | <div class="q-content"> |
| | | <el-radio-group v-model="answer.content"> |
| | |
| | | </div> |
| | | <div class="question-answer-show-item"> |
| | | <span class="question-show-item">正确答案:</span> |
| | | <span v-if="qType == 1 || qType == 2 || qType == 5" v-html="question.correct" class="q-item-span-content" /> |
| | | <span v-if="qType == 1 || qType == 2 || qType == 5 || qType == 6" 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> |
| | |
| | | <template> |
| | | <div style="line-height:1.8"> |
| | | <div v-if="qType==1" v-loading="qLoading"> |
| | | <div v-if="qType==1 || qType == 6" v-loading="qLoading"> |
| | | <div class="q-title" v-html="question.title"/> |
| | | <div class="q-content"> |
| | | <span :key="item.id" v-for="item in question.items" class="q-item-contain"> |
New file |
| | |
| | | <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="audioFile" required> |
| | | <el-upload v-model="form.audioFile" :action="uploadUrl" :limit="1" accept="audio/*" :on-success="uploadSuccess" |
| | | :file-list="audioList"> |
| | | <el-button size="small" type="primary">点击上传</el-button> |
| | | </el-upload> |
| | | </el-form-item> |
| | | <el-form-item label="选项:" required> |
| | | <el-form-item :label="item.prefix" :key="item.prefix" v-for="(item, index) in form.items" label-width="50px" |
| | | class="question-item-label"> |
| | | <el-input v-model="item.prefix" style="width:50px;" /> |
| | | <el-input v-model="item.content" @focus="inputClick(item, 'content')" class="question-item-content-input" /> |
| | | <el-button type="danger" size="mini" class="question-item-remove" icon="el-icon-delete" |
| | | @click="questionItemRemove(index)"></el-button> |
| | | </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="难度:" required> |
| | | <el-rate v-model="form.difficult" class="question-item-rate"></el-rate> |
| | | </el-form-item> |
| | | <el-form-item label="正确答案:" prop="correct" required> |
| | | <el-radio-group v-model="form.correct"> |
| | | <el-radio v-for="item in form.items" :key="item.prefix" :label="item.prefix">{{ item.prefix }}</el-radio> |
| | | </el-radio-group> |
| | | </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="questionItemAdd">添加选项</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 { |
| | | audioList: [], |
| | | uploadUrl: '/api/upload/upload', |
| | | form: { |
| | | audioFile: '', |
| | | originalFile: '', |
| | | id: null, |
| | | questionType: 6, |
| | | gradeLevel: null, |
| | | subjectId: null, |
| | | title: '', |
| | | items: [ |
| | | { prefix: 'A', content: '' }, |
| | | { prefix: 'B', content: '' }, |
| | | { prefix: 'C', content: '' }, |
| | | { prefix: 'D', content: '' } |
| | | ], |
| | | analyze: '', |
| | | correct: '', |
| | | score: '', |
| | | difficult: 0 |
| | | }, |
| | | subjectFilter: null, |
| | | formLoading: false, |
| | | rules: { |
| | | audioFile: [ |
| | | { required: true, message: '请上传语音', trigger: 'blur' } |
| | | ], |
| | | gradeLevel: [ |
| | | { required: true, message: '请选择年级', trigger: 'change' } |
| | | ], |
| | | subjectId: [ |
| | | { required: true, message: '请选择学科', trigger: 'change' } |
| | | ], |
| | | title: [ |
| | | { required: true, message: '请输入题干', trigger: 'blur' } |
| | | ], |
| | | analyze: [ |
| | | { required: true, message: '请输入解析', trigger: 'blur' } |
| | | ], |
| | | score: [ |
| | | { required: true, message: '请输入分数', trigger: 'blur' } |
| | | ], |
| | | correct: [ |
| | | { required: true, message: '请选择正确答案', trigger: 'change' } |
| | | ] |
| | | }, |
| | | 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.audioList.push({ name: re.data.originalFile, url: re.data.audioFile }) |
| | | _this.formLoading = false |
| | | }) |
| | | } |
| | | }, |
| | | methods: { |
| | | uploadSuccess(response) { |
| | | this.form.audioFile = response.data.url; |
| | | this.form.originalFile = response.data.name; |
| | | }, |
| | | editorReady(instance) { |
| | | this.richEditor.instance = instance |
| | | let currentContent = this.richEditor.object[this.richEditor.parameterName] |
| | | this.richEditor.instance.setContent(currentContent) |
| | | // 光标定位到Ueditor |
| | | 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 |
| | | }, |
| | | questionItemRemove(index) { |
| | | this.form.items.splice(index, 1) |
| | | }, |
| | | questionItemAdd() { |
| | | let items = this.form.items |
| | | let newLastPrefix |
| | | if (items.length > 0) { |
| | | let last = items[items.length - 1] |
| | | newLastPrefix = String.fromCharCode(last.prefix.charCodeAt() + 1) |
| | | } else { |
| | | newLastPrefix = 'A' |
| | | } |
| | | items.push({ id: null, prefix: newLastPrefix, content: '' }) |
| | | }, |
| | | 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: 1, |
| | | gradeLevel: null, |
| | | subjectId: null, |
| | | title: '', |
| | | items: [ |
| | | { prefix: 'A', content: '' }, |
| | | { prefix: 'B', content: '' }, |
| | | { prefix: 'C', content: '' }, |
| | | { prefix: 'D', content: '' } |
| | | ], |
| | | analyze: '', |
| | | correct: '', |
| | | score: '', |
| | | difficult: 0 |
| | | } |
| | | this.form.id = lastId |
| | | this.audioList = [] |
| | | }, |
| | | 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> |