qa-prevention-xgf-app/pages/train_management/course_exam.vue

464 lines
14 KiB
Vue
Raw Normal View History

<template>
<view class="content">
<view class="top">
<view class="time">
<text style="margin-right: 14rpx;" class="iconfont">&#xed63;</text>
<text>倒计时</text>
<u-count-down :time="info.ANSWERSHEETTIME * 60 * 1000" format="mm 分 ss 秒" auto-start millisecond @finish="fnCountDownFinish" />
</view>
</view>
<view class="topic">
<view class="title">
<text>
<text class="tag_title">
{{ handleCalcQuestType(options[current].QUESTIONTYPE) }}
</text>
{{ current + 1 }}.{{ options[current].QUESTIONDRY }}
</text>
</view>
<view v-show="options[current].QUESTIONTYPE === '1'" class="options">
<view class="item" :class="{ active: options[current].checked === 'A' }" @click="fnChooseTopic('radio', 'A')">
<text class="option">A</text>
<text class="text">{{ options[current].OPTIONA }}</text>
</view>
<view class="item" :class="{ active: options[current].checked === 'B' }" @click="fnChooseTopic('radio', 'B')">
<text class="option">B</text>
<text class="text">{{ options[current].OPTIONB }}</text>
</view>
<view class="item" :class="{ active: options[current].checked === 'C' }" @click="fnChooseTopic('radio', 'C')">
<text class="option">C</text>
<text class="text">{{ options[current].OPTIONC }}</text>
</view>
<view class="item" :class="{ active: options[current].checked === 'D' }" @click="fnChooseTopic('radio', 'D')">
<text class="option">D</text>
<text class="text">{{ options[current].OPTIOND }}</text>
</view>
</view>
<view v-show="options[current].QUESTIONTYPE === '2'" class="options">
<view class="item" :class="{
active:
options[current].checked &&
options[current].checked.indexOf('A') !== -1,
}" @click="fnChooseTopic('multiple', 'A')">
<text class="option">A</text>
<text class="text">{{ options[current].OPTIONA }}</text>
</view>
<view class="item" :class="{
active:
options[current].checked &&
options[current].checked.indexOf('B') !== -1,
}" @click="fnChooseTopic('multiple', 'B')">
<text class="option">B</text>
<text class="text">{{ options[current].OPTIONB }}</text>
</view>
<view class="item" :class="{
active:
options[current].checked &&
options[current].checked.indexOf('C') !== -1,
}" @click="fnChooseTopic('multiple', 'C')">
<text class="option">C</text>
<text class="text">{{ options[current].OPTIONC }}</text>
</view>
<view class="item" :class="{
active:
options[current].checked &&
options[current].checked.indexOf('D') !== -1,
}" @click="fnChooseTopic('multiple', 'D')">
<text class="option">D</text>
<text class="text">{{ options[current].OPTIOND }}</text>
</view>
</view>
<view v-show="options[current].QUESTIONTYPE === '3'" class="options">
<view class="item" :class="{ active: options[current].checked === 'A' }" @click="fnChooseTopic('judge', 'A')">
<text class="option">{{ options[current].OPTIONA }}</text>
<text class="text"></text>
</view>
<view class="item" :class="{ active: options[current].checked === 'B' }" @click="fnChooseTopic('judge', 'B')">
<text class="option">{{ options[current].OPTIONB }}</text>
<text class="text"></text>
</view>
</view>
<view v-show="options[current].QUESTIONTYPE === '4'" class="options">
<view class="item">
<u-textarea v-model="options[current].checked" auto-height count />
</view>
</view>
</view>
<view class="footer">
<u-button v-show="current !== 0" :style="{ width: '45%' }" text="上一题" @click="fnPreviousQuestion" />
<u-button v-show="current !== options.length - 1" type="primary"
:style="{ width: current === 0 ? '100%' : '45%' }" text="下一题" @click="fnNextQuestion" />
<u-button v-show="current === options.length - 1" type="primary" :style="{ width: '45%' }" text="交卷"
@click="fnHandInThePaper" />
</view>
</view>
</template>
<script>
// import {
// getExamExercises,
// getStrengthenExam,
// setTestPaperSubmission,
// } from "@/api";
export default {
data() {
return {
STAGEEXAMPAPERINPUT_ID: "",
STAGEEXAMPAPER_ID: "",
CLASS_ID: "",
POST_ID: "",
STUDENT_ID: "",
NUMBEROFEXAMS: "",
entrySite: "",
info: {},
options: [{}],
current: 0,
questionTypeMap: {
1: '单选',
2: '多选',
3: '判断',
4: '填空',
}
};
},
onLoad(query) {
// this.STAGEEXAMPAPERINPUT_ID = query.STAGEEXAMPAPERINPUT_ID;
// this.STAGEEXAMPAPER_ID = query.STAGEEXAMPAPER_ID;
// this.CLASS_ID = query.CLASS_ID;
// this.POST_ID = query.POST_ID;
// this.STUDENT_ID = query.STUDENT_ID;
// this.NUMBEROFEXAMS = query.NUMBEROFEXAMS;
// this.entrySite = query.entrySite;
this.fnGetData();
},
onBackPress(event) {
if (event.from === "backbutton") {
uni.$u.toast("考试过程中不允许退出");
return true;
}
return false;
},
computed: {
userInfo() {
return this.$store.getters.getUserInfo;
},
},
methods: {
async fnGetData() {
let resData = {};
// if (this.entrySite === "strengththen") {
// resData = await getStrengthenExam({
// STRENGTHEN_STAGEEXAMPAPER_INPUT_ID: this.STAGEEXAMPAPERINPUT_ID,
// CLASS_ID: this.CLASS_ID,
// POST_ID: this.POST_ID,
// STUDENT_ID: this.STUDENT_ID,
// NUMBEROFEXAMS: this.NUMBEROFEXAMS,
// });
// } else {
// resData = await getExamExercises({
// STAGEEXAMPAPERINPUT_ID: this.STAGEEXAMPAPERINPUT_ID,
// STAGEEXAMPAPER_ID: this.STAGEEXAMPAPER_ID,
// CLASS_ID: this.CLASS_ID,
// POST_ID: this.POST_ID,
// STUDENT_ID: this.STUDENT_ID,
// NUMBEROFEXAMS: this.NUMBEROFEXAMS,
// });
// }
// this.info = resData.pd;
this.info = { ...this.info, ANSWERSHEETTIME: 30 }
this.options = [
{
QUESTIONDRY: "题干题干题干题干题干1 ( ) .",
QUESTIONTYPE: "1",
OPTIONA: '这是选项A',
OPTIONB: '这是选项B',
OPTIONC: '这是选项C',
OPTIOND: '这是选项D',
},
{
QUESTIONDRY: "题干题干题干题干题干2 ()",
QUESTIONTYPE: "2",
OPTIONA: '这是选项A',
OPTIONB: '这是选项B',
OPTIONC: '这是选项C',
OPTIOND: '这是选项D',
},
{
QUESTIONDRY: "未带安全头盔可正常进入堆场进行工业,以上说法是否正确?",
QUESTIONTYPE: "3",
OPTIONA: '对',
OPTIONB: '错',
},
{
QUESTIONDRY: "当进入施工现场后, 应立刻对_____设施做全面检查?",
QUESTIONTYPE: "4",
OPTIONA: '对',
OPTIONB: '错',
},
];
// if (resData.NUMBEROFEXAMS > 0) {
// uni.showModal({
// title: "温馨提示",
// content: `您还可以考试${resData.NUMBEROFEXAMS}次!`,
// showCancel: false,
// });
// } else if (resData.NUMBEROFEXAMS === "-9999") {
// uni.showModal({
// title: "温馨提示",
// content: `加强学习考试开始限时60分钟请注意答题时间`,
// showCancel: false,
// });
// } else {
// uni.showModal({
// title: "温馨提示",
// content: `您无考试次数!`,
// showCancel: false,
// success: (res) => {
// if (res.confirm) {
// uni.navigateBack();
// }
// },
// });
// }
},
fnChooseTopic(type, checked) {
if (!this.options[this.current].checked) {
this.$set(this.options[this.current], "checked", "");
}
if (type === "judge" || type === "radio") {
if (this.options[this.current].checked === checked) {
this.options[this.current].checked = "";
} else {
this.options[this.current].checked = checked;
}
}
if (type === "multiple") {
if (this.options[this.current].checked) {
const checkedArr = this.options[this.current].checked.split(",");
if (checkedArr.indexOf(checked) !== -1) {
checkedArr.splice(checkedArr.indexOf(checked), 1);
this.options[this.current].checked = checkedArr.join(",");
} else {
checkedArr.push(checked);
checkedArr.sort();
this.options[this.current].checked = checkedArr.join(",");
}
} else {
this.options[this.current].checked = checked;
}
}
},
handleCalcQuestType(type) {
return `(${this.questionTypeMap[type]})`
},
fnIsFinish() {
if (!this.options[this.current].checked) {
uni.showModal({
title: "温馨提示",
content: "请对本题进行作答。",
showCancel: false,
});
return false;
}
return true;
},
/**
* 下一题按钮点击事件
*/
fnNextQuestion() {
if (!this.fnIsFinish()) return;
this.current++;
},
/**
* 上一题按钮点击事件
*/
fnPreviousQuestion() {
this.current--;
},
/**
* 交卷按钮点击事件
*/
fnHandInThePaper() {
if (!this.fnIsFinish()) return;
uni.showModal({
title: "温馨提示",
content: `题目已全部做完,确认交卷吗?`,
success: (res) => {
if (res.confirm) {
this.fnSubmit();
}
}
});
},
fnCountDownFinish() {
uni.$u.toast("考试时间已结束");
for (let i = 0; i < this.options.length; i++) {
if (!this.options[i].checked) {
this.options[i].checked = "";
}
}
this.fnSubmit();
},
async fnSubmit() {
uni.navigateBack({ delta: 2 });
// for (let i = 0; i < this.options.length; i++) {
// if (this.options[i].QUESTIONTYPE === "2") {
// this.options[i].checked = this.options[i].checked.replace(/,/g, "");
// }
// }
// const resData = await setTestPaperSubmission({
// USERNAME: this.userInfo.NAME,
// entrySite: this.entrySite,
// STAGEEXAMPAPERINPUT_ID: this.STAGEEXAMPAPERINPUT_ID,
// CLASS_ID: this.CLASS_ID,
// STUDENT_ID: this.STUDENT_ID,
// NUMBEROFEXAMS: this.NUMBEROFEXAMS,
// PASSSCORE: this.info.PASSSCORE,
// EXAMSCORE: this.info.EXAMSCORE,
// EXAMTIMEBEGIN: this.info.EXAMTIMEBEGIN,
// options: JSON.stringify(this.options),
// });
// if (resData.examResult === "0") {
// uni.showModal({
// title: "温馨提示",
// content: `您的成绩为${resData.examScore}分,很遗憾您没有通过本次考试,请再接再厉!`,
// showCancel: false,
// success: (res) => {
// if (res.confirm) {
// if (this.entrySite === "video_study")
// uni.navigateBack({ delta: 3 });
// else uni.navigateBack();
// }
// },
// });
// } else {
// uni.showModal({
// title: "温馨提示",
// content: `您的成绩为${resData.examScore}分,恭喜您通过本次考试,请继续保持!`,
// showCancel: false,
// success: (res) => {
// if (res.confirm) {
// if (this.entrySite === "video_study")
// uni.navigateBack({ delta: 3 });
// else if (this.entrySite === "strengththen")
// uni.navigateBack({ delta: 2 });
// else uni.navigateBack();
// }
// },
// });
// }
},
},
};
</script>
<style scoped lang="scss">
@import '/static/fonts/iconfont_timer.css';
.content {
.top {
padding: 17rpx;
.time {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
color: #363636;
font-size: 28rpx;
::v-deep {
.u-count-down__text {
display: inline;
color: #363636;
font-size: 28rpx;
line-height: normal;
}
}
}
}
.topic {
margin: 20rpx;
padding: 20rpx 20rpx 150rpx;
box-sizing: border-box;
.title {
font-size: 32rpx;
font-weight: 600;
.question-type {
border-radius: 40rpx;
padding: 4rpx 14rpx;
border: 1rpx solid #3c9cff;
font-size: 24rpx;
color: #3c9cff;
}
.tag_title {
font-size: 28rpx;
background-color: #b3b3b3;
color: #FFF;
border-radius: 8rpx;
padding: 2rpx 10rpx;
margin-right: 10rpx;
}
}
.options {
margin-top: 40rpx;
.item {
position: relative;
margin-top: 40rpx;
color: #696868;
&.active {
color: #3c9cff;
.option {
background-color: #3c9cff;
color: #fff;
}
}
.option {
background-color: #eee;
border-radius: 80rpx;
width: 65rpx;
height: 65rpx;
line-height: 65rpx;
text-align: center;
font-size: 30rpx;
display: inline-block;
}
.text {
margin-left: 30rpx;
height: 60rpx;
line-height: 60rpx;
}
}
}
}
.footer {
display: flex;
position: fixed;
bottom: 0;
justify-content: space-between;
width: 100%;
left: 0;
padding: 20rpx;
box-sizing: border-box;
background: #fff;
button {
border-radius: 10rpx;
}
}
}
</style>