Files
learning-system-portal/src/components/Exam/EditPaper.vue
2022-12-24 13:59:18 +08:00

334 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<!--编辑试卷-->
<div >
<el-dialog title="修改试卷" :visible.sync="editShow" width="800px" >
<!--试卷的标题可以编辑-->
<div class="paper-title">
<div>{{title}}</div>
</div>
<!--查询项-->
<!-- <div>
<el-form :inline="true" size="mini">
<el-form-item>
<el-select clearable v-model="qpaper.qtype" placeholder="请选择题型" class="search-width-120">
<el-option label="单选题" :value="1"></el-option>
<el-option label="多选题" :value="2"></el-option>
<el-option label="判断题" :value="3"></el-option>
</el-select>
</el-form-item>
<el-form-item><el-input class="search-width-120" v-model="qpaper.keyword" clearable placeholder="题干"></el-input></el-form-item>
<el-form-item>
<el-button type="primary" @click="selectQuery()">搜索</el-button>
<el-button type="primary" @click="resetQuery()">重置</el-button>
</el-form-item>
<el-form-item></el-form-item>
</el-form>
</div> -->
<div style="display: flex;justify-content: space-between;line-height:30px;">
<div>
<el-checkbox v-model="optionShow">显示选项</el-checkbox>
</div>
<div>
双击题干或选项编辑
</div>
<div style="text-align: right;font-size: 14px;">
本卷共
<span class="bigred">{{paperLength}}</span>
, 总分
<span class="bigred">{{totalScore}}</span>
</div>
</div>
<!--试卷内容-->
<div class="paper-box">
<div v-if="qitems.length>0" v-for="(item,idx) in qitems" :key="idx">
<div v-if="item.type < 900">
<div style="display: flex;justify-content: space-between;background-color: #dcf1ff;padding: 5px;">
<div>
<!-- <span style="padding-right: 5px;" v-if="paperQEdit"><el-checkbox v-model="item.checked" @change="checkedChange"></el-checkbox></span> -->
<span v-if="item.type == 1">单选题</span>
<span v-if="item.type == 2">多选题</span>
<span v-if="item.type == 3">判断题</span>
<span style="padding-left: 5px;">难度[{{item.difficulty == 1? '简单' : item.difficulty == 2? '中等': '困难'}}]</span>
<!-- <span style="padding-left: 5px;">知识点[{{item.analysis}}]</span> -->
</div>
<div>
<el-input @input="changeInput($event)" v-model="item.defaultScore" style="width: 120px;" size="mini" placeholder="分数" @blur="paperCalculation()">
<template slot="append"></template>
</el-input>
<el-button v-if="paperQEdit" icon="el-icon-delete" @click="checkDelete(idx)" size="mini"></el-button>
</div>
</div>
<div style="padding: 15px;">
<div style="font-weight: 700px;padding-bottom: 10px;cursor: pointer;" @dblclick="showCellEdit(idx,-1)">
<div> {{ item.title }}</div>
<div v-if="item.images" class="qimg"><img class="qimg-fit" :src="imageBaseUrl + item.images" alt=""> </div>
</div>
<div v-if="optionShow">
<div v-if="item.type == 3">
<div class="opt" @click="setJudgeAnswer(item,'true')" :class="{optanswer:item.answer=='true'}"><span class="optanswer-span">{{item.answer=='true'? '√':''}} </span> 1. 正确 </div>
<div class="opt" @click="setJudgeAnswer(item,'false')" :class="{optanswer:item.answer=='false'}"><span class="optanswer-span">{{item.answer=='false'? '√':''}} </span> 2. 错误 </div>
</div>
<div v-else v-for="(opt, optIdx) in item.optionList" :key="optIdx" class="opt" @click="setOptAnswer(item,opt)" @dblclick="showCellEdit(idx,optIdx)">
<div :class="{optanswer:opt.isAnswer}"><span class="optanswer-span">{{opt.isAnswer? '√':''}} </span> {{ optIdx + 1 }}, {{ opt.content }}</div>
<div v-if="opt.images" class="qimg"><img class="qimg-fit" :src="imageBaseUrl + opt.images" alt=""> </div>
</div>
</div>
</div>
</div>
<div v-if="item.type > 900">
<div style="height: 25px;">
<span style="float: right;margin-top: -5px;cursor: pointer;" class="el-icon-delete" @click="checkDelete(idx)"></span>
<div style="border-bottom: 2px dotted #000000;margin-right: 50px;"></div>
</div>
</div>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button :loading="loading" type="primary" @click="save()"> </el-button>
<el-button @click="cancel()"> 取消 </el-button>
</span>
</el-dialog>
<el-dialog :title="cellData.title" :visible.sync="cellData.show" width="500px">
<div>
<div><el-input type="textarea" rows="2" v-model="cellData.text"></el-input> </div>
<div style="height: 160px;padding-top: 10px;">
<imgupload :value="cellData.img" @success="cellImageSuccss" @remove="cellImageRemove"></imgupload>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button :loading="loading" type="primary" @click="cellConfirm()"> 确定 </el-button>
<el-button @click="cellCancel()"> 取消 </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import apiPaper from '@/api/modules/paper.js';
import imgupload from '@/components/ImageUpload/single.vue';
import apiExamTask from '@/api/modules/examTask.js';
import examQuestionApi from "@/api/modules/question";
import {numberToLetter, deepCopy} from '../../utils/tools.js';
export default {
name: 'comEditPaper',
components:{imgupload},
props:{
id:{
type:String,
default:''
}
},
data() {
return {
editShow:false,
loading:false,
paperId:'',
imageBaseUrl:process.env.VUE_APP_FILE_BASE_URL,
title:'',
optionShow:false,
qpaper:{qtype:'',keyword:''},
paperLength:0,
totalScore:0,
qitems:[],
tempItems:[],
paper: {
id:'',
testName: '',
remark: '',
difficulty: ''
},
paperQEdit:false,
cellData:{
show:false,
title:'修改题干',
item:null,
optIndex:-1,
text:'',
img:''
}
}
},
mounted() {
if(this.id){
this.paperId=this.id;
}
},
methods:{
loadTestPaper(){
if(this.paperId){
this.editShow=true;
this.loading=true;
apiPaper.detail(this.paperId).then(res=>{
if(res.status === 200) {
this.paper=res.result;
//转化试题
this.qitems=JSON.parse(res.result.paperContent);
//console.log(this.qitems,this.qitems)
this.tempItems=this.qitems;
this.paperCalculation();
} else {
this.$message.error(res.message);
}
this.loading=false;
})
}
},
show(paperId){
this.paperId=paperId;
this.editShow=true;
this.loadTestPaper();
},
selectQuery(){
this.qitems=this.tempItems;
if(this.qpaper.qtype == '' && this.qpaper.keyword == '') {
this.$forceUpdate();
return
}
// let data = deepCopy(this.paperData);
if(this.qpaper.qtype) {
this.qitems=this.qitems.filter(item=>{
if(item.type === this.qpaper.qtype){
return true;
}else{
return false;
}
})
}
if(this.qpaper.keyword) {
this.qitems = this.qitems.filter(item => {
return item.title.toLowerCase().indexOf(this.qpaper.keyword.toLowerCase()) > -1;
});
}
//this.paper.data = data;
this.$forceUpdate();
},
resetQuery(){
this.qpaper.qtype='';
this.qpaper.keyword='';
this.qitems=this.tempItems;
},
checkedChange(){
this.$forceUpdate();
},
changeInput(e){
this.$forceUpdate();
},
setJudgeAnswer(item,flag){
item.answer=flag;
},
setOptAnswer(item,opt){
if(item.type!=2){//单选的情况,先清空
item.optionList.forEach(op=>{
op.isAnswer=false;
})
}
if(opt.isAnswer){
opt.isAnswer=false;
}else{
opt.isAnswer=true;
}
},
paperCalculation() {
this.totalScore=0;
this.paperLength=0;
this.qitems.forEach(item=>{
if(item.type < 900) {
this.paperLength++;
this.totalScore += Number(item.defaultScore);
}
})
},
save(){
this.loading=true;
this.paper.paperContent=JSON.stringify(this.qitems);
apiPaper.update(this.paper).then((res)=>{
if(res.status === 200) {
this.$message.success('保存成功!')
this.editShow=false;
} else {
this.$message.error(res.message);
}
this.loading=false;
})
},
cancel(){
this.editShow=false;
},
showCellEdit(itemIdx,optIdx){
this.cellData.item=this.qitems[itemIdx];
this.cellData.optIndex=optIdx;
this.cellData.img='';
if(optIdx==-1){
this.cellData.text=this.cellData.item.title;
this.cellData.img=this.cellData.item.images;
this.cellData.title="修改题干";
}else{
this.cellData.text=this.cellData.item.optionList[this.cellData.optIndex].content;
this.cellData.img=this.cellData.item.optionList[this.cellData.optIndex].images;
this.cellData.title="修改选项";
}
//console.log(this.cellData,'this.cellData');
this.cellData.show=true;
},
cellConfirm(){
if(this.cellData.optIndex==-1){
this.cellData.item.title=this.cellData.text;
this.cellData.item.images=this.cellData.img;
}else{
this.cellData.item.optionList[this.cellData.optIndex].content=this.cellData.text;
this.cellData.item.optionList[this.cellData.optIndex].images=this.cellData.img;
}
this.cellData.show=false;
},
cellCancel(){
this.cellData.show=false;
},
cellImageSuccss(res){
//console.log(res,'res');
this.cellData.img=res.result.filePath;
},
cellImageRemove(){
this.cellData.img='';
}
}
}
</script>
<style scoped lang="scss">
.paper-title{
text-align: center;
font-size: 18px;
}
.paper-box{
max-height: 500px;
overflow-y: auto;
}
.bigred {
color: red;
font-size: 20px;
}
.opt{
padding-top:10px;cursor: pointer;
}
.optanswer{
color: green;
background-color: #fffaf7;
}
.optanswer-span{
color: green;
display: inline-block;
width: 20px;
}
.qimg{
padding-left: 30px;
max-width: 200px;
.qimg-fit{
width:100%;
object-fit:scale-down
}
}
</style>