QA-UniApp-wlaq/pages/application/onlinexxks/my-exam-curriculum.vue

479 lines
14 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view>
<view class="cu-custom" :style="[{height:CustomBar + 'px'}]">
<view class="cu-bar fixed bg-gradual-blueness" :style="style">
<view class="action" @tap="BackPage">
<text class="cuIcon-back"></text>
<slot name="backText">返回</slot>
</view>
<view class="content" :style="[{top:StatusBar + 'px'}]">
<slot name="content">{{ titleContext }}</slot>
</view>
<view class="right">
<slot name="right"></slot>
</view>
<!-- <slot name="right"></slot> -->
</view>
</view>
<view class="course">
<!-- <view v-show="!isExamStart" class="course-header">
<view class="course-name">
<text>试卷名称:{{ form.EXAMNAME }}</text>
</view>
<view class="course-name">
<text>答卷时间:{{ form.ANSWERSHEETTIME }}</text>
</view>
<view class="course-obj">
<text>试卷总共{{ form.QUESTIONNUM }}道题,答题时间共计{{ form.ANSWERSHEETTIME }}分钟,开始答题后计时到答卷时间后会自动提交试卷,请学员尽快答题。</text>
</view>
<view >
<button class="cu-btn bg-green" @click="$noMultipleClicks(handleBegin)" >开始答题</button>
</view>
</view> -->
<view v-show="isExamStart" class="course-aa">
<view class="course-items" v-for="(row,i) in form.QUESTIONLIST" :key="row.QUESTION_ID">
<view class="course-ask">
{{ i + 1 }}.
<text v-if="row.QUESTIONTYPE === '1'" class="mark">(单选题)</text>
<text v-if="row.QUESTIONTYPE === '2'" class="mark">(多选题)</text>
<text v-if="row.QUESTIONTYPE === '3'" class="mark">(判断题)</text>
{{ row.QUESTIONDRY }}
</view>
<view class="course-answer">
<radio-group v-if="row.QUESTIONTYPE == '1'" :disabled="isDisabled" v-model="form.ANSWER[i]" @change="radioQuestionChange($event,i)">
<label class="answer-lable">
<radio class="blue" :class="form.ANSWER[i]=='A'?'checked':''" :checked="form.ANSWER[i]=='A'?true:false"
value="A"></radio>
<text class="title">A.{{ row.OPTIONA }}</text>
</label>
<label class="answer-lable">
<radio class="blue" :class="form.ANSWER[i]=='B'?'checked':''" :checked="form.ANSWER[i]=='B'?true:false"
value="B"></radio>
<text class="title">B.{{ row.OPTIONB }}</text>
</label>
<label class="answer-lable">
<radio class="blue" :class="form.ANSWER[i]=='C'?'checked':''" :checked="form.ANSWER[i]=='C'?true:false"
value="C"></radio>
<text class="title">C.{{ row.OPTIONC }}</text>
</label>
<label class="answer-lable">
<radio class="blue" :class="form.ANSWER[i]=='D'?'checked':''" :checked="form.ANSWER[i]=='D'?true:false"
value="D"></radio>
<text class="title">D.{{ row.OPTIOND }}</text>
</label>
</radio-group>
<checkbox-group v-if="row.QUESTIONTYPE == '2'" class="checkbox" :disabled="isDisabled" v-model="form.ANSWER[i]" @change="checkQuestionChange($event,i)">
<label class="answer-lable">
<checkbox :id="'checkA'+i" value="A"></checkbox>
<text class="title">A.{{ row.OPTIONA }}</text>
</label>
<label class="answer-lable">
<checkbox :id="'checkB'+i" value="B" :checked="form.ANSWER[i].includes('B')?true:false"></checkbox>
<text class="title">B.{{ row.OPTIONB }}</text>
</label>
<label class="answer-lable">
<checkbox :id="'checkC'+i" value="C" :checked="form.ANSWER[i].includes('C')?true:false"></checkbox>
<text class="title">C.{{ row.OPTIONC }}</text>
</label>
<label class="answer-lable">
<checkbox :id="'checkD'+i" value="D" :checked="form.ANSWER[i].includes('D')?true:false"></checkbox>
<text class="title">D.{{ row.OPTIOND }}</text>
</label>
</checkbox-group>
<radio-group v-if="row.QUESTIONTYPE == '3'" :disabled="isDisabled" v-model="form.ANSWER[i]" @change="radioQuestionChange($event,i)">
<label class="answer-lable">
<radio class="blue" :class="form.ANSWER[i]=='A'?'checked':''" :checked="form.ANSWER[i]=='A'?true:false"
value="A"></radio>
<text class="title">A.{{ row.OPTIONA }}</text>
</label>
<label class="answer-lable">
<radio class="blue" :class="form.ANSWER[i]=='B'?'checked':''" :checked="form.ANSWER[i]=='B'?true:false"
value="B"></radio>
<text class="title">B.{{ row.OPTIONB }}</text>
</label>
</radio-group>
</view>
</view>
</view>
</view>
<view class="cu-tabbar-height"></view>
<view v-show="isExamStart" class="bottom-fixed">
<button class="cu-btn bg-green" @click="$noMultipleClicks(confirm)" >提交</button>
</view>
</view>
</template>
<script>
import {
basePath,
corpinfoId,
deptId,
loginSession,
formatDate,
loginUser
} from '@/common/tool.js'
export default {
components: {},
data() {
return {
StatusBar: this.StatusBar,
CustomBar: this.CustomBar,
bgImage: '',
isExamStart: false,
isDisabled: true,
titleContext: '课程考试',
CURRICULUM_ID: '',
COURSESTUDENTRELATION_ID: '',
timer: '',
hour: 0,
minutes: 0,
seconds: 0,
showRight: false,
dataFlag: 'noData',
sTop: 0,
totalHeight: 0,
form: {
CURRICULUMID: '', // 课程ID
EXAMNAME: '', // 试卷名称
EXAMTIME: '', // 考试时间(开始时间)
ANSWERSHEETTIME: '', // 答卷时间(持续时间)
EXAMSCORE: 100, // 试卷分数
QUESTIONNUM: '', // 试题数量10、20、50、100
QUESTION_ID: [], // 试题ID数组
QUESTIONTYPE: [], // 试题类型数组
ANSWER: [], // 学员答案
ANSWERRIGHT: [] ,// 正确答案
QUESTIONLIST: [] //考题List
}, //页面数据
subForm: {}, //交卷数据
list: [], //返回数据
page: 1, //分页参数--页数
rows: 10, //分页参数--每页数据条数
totalCount: 0, //分页参数--初始化页数
isEnd: false, //防止多次刷新
totalPage: 0, //分页参数--分页数量
noClick: true
}
},
computed: {
style() {
var StatusBar= this.StatusBar;
var CustomBar= this.CustomBar;
var bgImage = this.bgImage;
var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
if (this.bgImage) {
style = `${style}background-image:url(${bgImage});`;
}
return style
}
},
onReady() {
},
onLoad(event) {
this.CURRICULUM_ID = event.CURRICULUM_ID
this.COURSESTUDENTRELATION_ID = event.COURSESTUDENTRELATION_ID
this.getData();
loginSession();
},
onBackPress(options) {
this.BackPage()
return true
},
beforeDestroy(){
if(this.timer) {
clearInterval(this.timer) // 满足条件时 停止计时
this.timer = null
this.seconds = 0
this.minutes = 0
}
},
methods: {
getData() {
var _this = this;
uni.showLoading({
title: '请稍候'
})
uni.request({
url: basePath + '/app/coursepapers/findByCurriculumExam',
method: 'POST',
dataType: 'json',
header: {
'Content-type': 'application/x-www-form-urlencoded'
},
data: {
CURRICULUMID: this.CURRICULUM_ID},
success: (res) => {
if ("success" == res.data.result) {
uni.hideLoading();
// _this.pd = res.data.pd;
_this.form = Object.assign(_this.form, res.data.pd)
_this.handleBegin()
}
}
});
},
handleBegin() {
if(this.timer) {
clearInterval(this.timer) // 满足条件时 停止计时
this.timer = null
this.seconds = 0
this.minutes = 0
}
this.form.EXAMTIME = formatDate(new Date(),'yyyy-MM-dd hh:mm:ss')
this.isExamStart = true
this.isDisabled = false
this.titleContext = '00:00'
this.timer = setInterval(this.startTimer, 1000)
},
startTimer() {
this.seconds += 1
if (this.seconds >= 60) {
this.seconds = 0
this.minutes = this.minutes + 1
}
this.titleContext = (this.minutes < 10 ? '0' + this.minutes : this.minutes) + ':' + (this.seconds < 10 ? '0' + this.seconds : this.seconds)
if (this.titleContext == this.form.ANSWERSHEETTIME + ':00') {
if(this.timer) {
clearInterval(this.timer) // 满足条件时 停止计时
this.timer = null
this.seconds = 0
this.minutes = 0
}
this.subForm = Object.assign({}, this.form)
for (let i = 0; i < this.subForm.ANSWER.length; i++) {
if (this.subForm.QUESTIONTYPE[i] == '2') {
this.subForm.ANSWER[i] = this.trimSpace(this.subForm.ANSWER[i])
this.subForm.ANSWER[i] = this.subForm.ANSWER[i].length > 0 ? this.subForm.ANSWER[i].sort() : []
if (this.subForm.ANSWER[i].length == 0) {
this.subForm.ANSWER[i] = '-'
}
} else {
if (this.subForm.ANSWER[i].length == 0) {
this.subForm.ANSWER[i] = '-'
}
}
}
this.assignSubFormData()
uni.showModal({
title: '',
content: '计时时间已到提交试卷!',
showCancel: false,
confirmText: '确定',
success: res => {
if (res.confirm) {
this.submitForm()
}
}
})
}
},
radioQuestionChange(e,i) {
this.form.ANSWER[i] = e.detail.value;
},
checkQuestionChange(e,i) {
this.form.ANSWER[i] = e.detail.value;
},
confirm() {
var confirmMsg = '试卷试题第'
this.subForm = Object.assign({}, this.form)
for (let i = 0; i < this.subForm.ANSWER.length; i++) {
if (this.subForm.QUESTIONTYPE[i] == '2') {
this.subForm.ANSWER[i] = this.trimSpace(this.subForm.ANSWER[i])
this.subForm.ANSWER[i] = this.subForm.ANSWER[i].length > 0 ? this.subForm.ANSWER[i].sort() : []
if (this.subForm.ANSWER[i].length == 0) {
confirmMsg += (i + 1) + ','
this.subForm.ANSWER[i] = '-'
}
} else {
if (this.subForm.ANSWER[i].length == 0) {
confirmMsg += (i + 1) + ','
this.subForm.ANSWER[i] = '-'
}
}
}
confirmMsg = confirmMsg.length == 5 ? '确定要提交试卷吗?' : (confirmMsg.slice(0, confirmMsg.length - 1) + '题还没有作答,确定要提交试卷吗?')
this.assignSubFormData()
uni.showModal({
title: '',
content: confirmMsg,
cancelColor:'#000000',
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
this.submitForm()
}
}
})
},
assignSubFormData() {
var ANSWER_STR = ''
for (let i = 0; i < this.subForm.ANSWER.length; i++) {
if (this.subForm.QUESTIONTYPE[i] == '2') {
ANSWER_STR += (this.subForm.ANSWER[i] == '-' ? '-' : this.subForm.ANSWER[i].join('')) + ','
} else {
ANSWER_STR += this.subForm.ANSWER[i] + ','
}
}
this.subForm.ANSWER = ANSWER_STR.length > 0 ? ANSWER_STR.slice(0, ANSWER_STR.length - 1) : ''
this.subForm.QUESTION_ID = this.subForm.QUESTION_ID.join(',')
this.subForm.QUESTIONTYPE = this.subForm.QUESTIONTYPE.join(',')
this.subForm.COURSEWAREID = this.subForm.COURSEWAREID.join(',')
this.subForm.COURSEWARETYPE = this.subForm.COURSEWARETYPE.join(',')
this.subForm.ANSWERRIGHT = this.subForm.ANSWERRIGHT.join(',')
this.subForm.QUESTIONLIST = ''
this.subForm.CORPINFO_ID = corpinfoId
this.subForm.USER_ID = loginUser.USER_ID
this.subForm.USERNAME=loginUser.USERNAME
this.subForm.COURSESTUDENTRELATION_ID = this.COURSESTUDENTRELATION_ID
},
submitForm() {
uni.showLoading({
title: '处理中'
})
if(this.timer) {
clearInterval(this.timer) // 满足条件时 停止计时
this.timer = null
this.seconds = 0
this.minutes = 0
}
this.isDisabled = true
uni.request({
url: basePath+'/app/courseexam/submit',
method: 'POST',
dataType: 'json',
header: {
'Content-type':'application/x-www-form-urlencoded'
},
data: this.subForm,
success: (res) => {
uni.hideLoading();
const examScore = res.data.pd.EXAMSCORE
var modelContent = '本次考试成绩' + examScore + '分'
if (examScore >= 60) {
modelContent += ',考试通过'
} else {
modelContent += ',考试未通过'
}
uni.showModal({
title: '考试结果',
content: modelContent,
showCancel: false,
confirmText: '确定',
success: res => {
if (res.confirm) {
uni.redirectTo({
url: '/pages/application/onlinexxks/my-curriculum',
})
}
}
})
},
fail: (err) => {
uni.hideLoading();
uni.showModal({
content: err.errMsg,
showCancel: false
});
}
})
},
trimSpace(array) {
for (var i = 0; i < array.length; i++) {
if (array[i] == '' || array[i] == null || typeof (array[i]) == 'undefined') {
array.splice(i, 1)
i = i - 1
}
}
return array
},
BackPage() {
if (!this.isDisabled) {
uni.showModal({
title: '',
content: '课程考试已开始,确定要退出考试么?',
cancelColor:'#000000',
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
if(this.timer) {
clearInterval(this.timer) // 满足条件时 停止计时
this.timer = null
this.seconds = 0
this.minutes = 0
}
uni.redirectTo({
url: '/pages/application/onlinexxks/my-curriculum',
})
}
}
})
} else {
uni.redirectTo({
url: '/pages/application/onlinexxks/my-curriculum',
})
}
}
}
}
</script>
<style>
.course {
background-color: #fff;
}
.course-header {
padding: 20upx;
border-bottom: 1upx solid #F1F1F1;
line-height: 1.6;
}
.course-name {
font-weight: bold;
font-size: 30upx;
}
.course-int {
color: #888;
}
.course-obj {
color: #888;
}
.course-aa {
padding: 0 20upx;
}
.course-items {
border-bottom: 1px dashed #F1F1F1;
padding: 20upx 0;
}
.course-items .course-ask {
line-height: 1.6;
font-size: 28upx;
/* margin-bottom: 10upx; */
}
.course-answer{
padding-left: 40upx;
margin-top: 20upx;
}
.answer-lable{
display: block;
margin-bottom: 20upx;
}
.answer-lable:last-child{
margin-bottom: 0;
}
.answer-lable radio{
margin-right: 20upx;
}
</style>