403 lines
10 KiB
Python
403 lines
10 KiB
Python
<template>
|
||
<view>
|
||
<!-- 大标题 -->
|
||
<view class="header" id="header">
|
||
<span class="header-button">第{{currentIndex+1}}/{{currentExam.questions_.length}} 题</span>
|
||
|
||
</view>
|
||
<!-- 小标题栏 -->
|
||
<view class="sub-header">
|
||
<u-row>
|
||
<u-col span="4">
|
||
<u-count-down :timestamp="currentExam.paper_.limit*60" :show-days="false" @end="end" border-color="#2979ff">
|
||
</u-count-down>
|
||
</u-col>
|
||
<u-col span="4">
|
||
<view style="text-align: center;"><span class="header-card">{{currentQuestion.type}}</span></view>
|
||
</u-col>
|
||
<u-col span="4">
|
||
<view style="text-align: right;"><span class="submitButton" @click='handleSubmit()' >交卷</span></view>
|
||
</u-col>
|
||
</u-row>
|
||
</view>
|
||
<scroll-view class="content" scroll-y="true" v-bind:style="{height:scollHeight+'rpx'}">
|
||
<view class="name">
|
||
<view>{{currentIndex+1}}·{{currentQuestion.name}}</view>
|
||
<!-- <rich-text :nodes="currentQuestion.name"></rich-text> -->
|
||
<view v-if="currentQuestion.img">
|
||
{{currentQuestion.img}}
|
||
</view>
|
||
</view>
|
||
<view class="options">
|
||
<checkbox-group @change="checkboxGroupChange" v-if="currentQuestion.type=='多选'">
|
||
<label class="option" v-for="item in currentOptions" :key="item.id" >
|
||
<view class="option-item1">
|
||
<checkbox :value="item.value" :checked="item.checked" color="#2979ff"/>
|
||
</view >
|
||
<view class="option-item2">{{item.value}}.{{item.text}}</view>
|
||
</label>
|
||
</checkbox-group>
|
||
<radio-group v-else @change="checkboxGroupChange">
|
||
<label class="option" v-for="item in currentOptions" :key="item.id">
|
||
<view class="option-item1">
|
||
<radio :value="item.value" :checked="item.checked" color="#2979ff"></radio>
|
||
</view>
|
||
<view class="option-item2">
|
||
{{item.value}}.{{item.text}}
|
||
</view>
|
||
</label>
|
||
</radio-group>
|
||
</view>
|
||
<view style="height:20rpx"></view>
|
||
</scroll-view>
|
||
<u-popup v-model="showM" mode="bottom" height="40%">
|
||
<view class="questionArea" style="display:flex">
|
||
<block v-for="(item, index) in currentExam.questions_" :key="index">
|
||
<view class="questionItem questionItem-select" v-if="item.user_answer" @click="jumpQuestion(index)">{{index+1}}</view>
|
||
<view class="questionItem questionItem-unselect" v-else @click="jumpQuestion(index)">{{index+1}}</view>
|
||
</block>
|
||
</view>
|
||
</u-popup>
|
||
<!-- 底部栏 -->
|
||
<view class="footer" id="footer">
|
||
<u-button @click='previousQ()' throttle-time="200" :plain="true" type="primary">上一题</u-button>
|
||
<u-button @click="showM = !showM" type="primary">答题卡</u-button>
|
||
<u-button @click='nextQ()' throttle-time="200" :plain="true" type="primary">下一题</u-button>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
export default {
|
||
data() {
|
||
return {
|
||
currentExam:{questions_:[]},
|
||
currentIndex:0,
|
||
currentOptions:[],
|
||
currentQuestion:{type:'单选'},
|
||
showM:false,
|
||
keyid:0,
|
||
start_time:null,
|
||
scollHeight:0
|
||
}
|
||
},
|
||
onLoad() {
|
||
//#ifdef MP-WEIXIN
|
||
uni.hideHomeButton()
|
||
//#endif
|
||
this.start_time= (new Date()).getTime()
|
||
this.currentExam = uni.getStorageSync('currentExam')
|
||
let res = uni.getSystemInfoSync();
|
||
let ratio = 750 / res.windowWidth;
|
||
this.scollHeight = res.windowHeight*ratio - 230
|
||
this.initQuestion()
|
||
},
|
||
methods: {
|
||
end(){
|
||
var that = this
|
||
uni.showModal({
|
||
title: '警告',
|
||
content: '时间到,请交卷',
|
||
showCancel:false,
|
||
success: function (res) {
|
||
if (res.confirm) {
|
||
that.handIn();
|
||
}
|
||
}
|
||
});
|
||
|
||
},
|
||
change(){
|
||
|
||
},
|
||
handleSubmit(){
|
||
var that = this
|
||
let questions = that.currentExam.questions_;
|
||
for(var i=0;i<questions.length;i++){
|
||
if(!questions[i].user_answer){
|
||
uni.showModal({
|
||
title: '警告',
|
||
content: '答卷未完成,确认交卷吗?',
|
||
success: function (res) {
|
||
if (res.confirm) {
|
||
that.handIn();
|
||
}
|
||
}
|
||
});
|
||
return
|
||
}
|
||
}
|
||
uni.showModal({
|
||
title: '提示',
|
||
content: '确认交卷吗?',
|
||
success: function (res) {
|
||
if (res.confirm) {
|
||
//直接交卷,不需要判卷了
|
||
that.handIn();
|
||
}
|
||
}
|
||
});
|
||
},
|
||
handIn(){
|
||
var that = this
|
||
uni.showLoading({
|
||
title:'正在提交...',
|
||
mask:true
|
||
})
|
||
let questions_ = [];
|
||
for (let i = 0; i < that.currentExam.questions_.length; i++) {
|
||
let obj = {};
|
||
obj.id=that.currentExam.questions_[i].id;
|
||
obj.user_answer=that.currentExam.questions_[i].user_answer;
|
||
questions_.push(obj);
|
||
}
|
||
that.$u.api.submitExam(that.currentExam.examrecord,{questions_:questions_}).then(res=>{
|
||
uni.showToast({
|
||
title:"提交成功",
|
||
icon:"none"
|
||
})
|
||
uni.setStorageSync('currentExam',res.data)
|
||
uni.hideLoading()
|
||
uni.reLaunch({
|
||
url:'/pages/exam/result'
|
||
})
|
||
|
||
}).catch(e=>{
|
||
if(res.msg){
|
||
uni.showModal({
|
||
title:'提交失败',
|
||
content:res.msg,
|
||
showCancel:false,
|
||
success(res) {
|
||
uni.reLaunch({
|
||
url:'/pages/exam/exam'
|
||
})
|
||
}
|
||
})
|
||
}
|
||
})
|
||
// let questions = this.currentExam.questions
|
||
// let score=0
|
||
// for(var i=0, lenI =questions.length;i<lenI;i++){
|
||
// var ret=this.panTi(questions[i])
|
||
// questions[i].is_right=ret.is_right
|
||
// questions[i].score=ret.score
|
||
// score = score+ret.score
|
||
// }
|
||
// this.currentExam.score = score
|
||
// this.currentExam.start_time = this.$u.timeFormat(this.start_time, 'yyyy-mm-dd hh:MM:ss');
|
||
// this.currentExam.end_time = this.$u.timeFormat((new Date()).getTime(), 'yyyy-mm-dd hh:MM:ss')
|
||
// this.currentExam.took = Math.floor(((new Date()).getTime() - this.start_time) / 1000)
|
||
// if(score>=this.currentExam.pass_score){
|
||
// this.currentExam.is_pass=true
|
||
// }else{
|
||
// this.currentExam.is_pass=false
|
||
// }
|
||
// if(this.vuex_user.id){
|
||
|
||
// }
|
||
// else{
|
||
// uni.setStorageSync('currentExam',this.currentExam)
|
||
// uni.hideLoading()
|
||
// uni.redirectTo({
|
||
// url:'/pages/exam/result'
|
||
// })
|
||
// }
|
||
},
|
||
panTi(tm_current) {
|
||
// 返回当前题目是否正确,得分多少
|
||
let is_right = false, score = 0
|
||
if (tm_current.type == '多选') {
|
||
if (tm_current.user_answer) {
|
||
if (tm_current.user_answer.sort().toString() == tm_current.right.sort().toString()) {
|
||
is_right = true
|
||
score = tm_current.total_score
|
||
}
|
||
}
|
||
} else {
|
||
if(tm_current.right == tm_current.user_answer){
|
||
is_right = true
|
||
score = tm_current.total_score
|
||
}
|
||
}
|
||
return {'is_right':is_right,'score':score}
|
||
},
|
||
initQuestion(){
|
||
var currentQuestion = this.currentExam.questions_[this.currentIndex];
|
||
this.currentQuestion = currentQuestion;
|
||
let options_ = [];
|
||
let origin = currentQuestion.options;
|
||
this.currentOptions = [];
|
||
for (let key in origin) {
|
||
let option = {
|
||
value:key,
|
||
text:origin[key],
|
||
id: this.keyid++,
|
||
checked:false
|
||
}
|
||
if (currentQuestion.user_answer) {
|
||
if (key == currentQuestion.user_answer || currentQuestion.user_answer.indexOf(key) != -1) {
|
||
option.checked = true
|
||
}
|
||
} else {
|
||
option.checked = false
|
||
}
|
||
options_.push(option)
|
||
}
|
||
this.currentOptions = options_
|
||
},
|
||
nextQ(){
|
||
let index = this.currentIndex + 1
|
||
if(index<this.currentExam.questions_.length){
|
||
this.currentIndex = index
|
||
this.initQuestion()
|
||
}
|
||
},
|
||
previousQ(){
|
||
let index = this.currentIndex - 1
|
||
if(index >= 0){
|
||
this.currentIndex = index
|
||
this.initQuestion()
|
||
}
|
||
},
|
||
checkboxGroupChange(e){
|
||
// debugger;
|
||
console.log(e)
|
||
this.currentExam.questions_[this.currentIndex].user_answer = e.detail.value
|
||
},
|
||
jumpQuestion(index){
|
||
this.currentIndex = index
|
||
this.initQuestion()
|
||
this.showM = false
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
page {
|
||
background-color: $u-bg-color;
|
||
}
|
||
.content{
|
||
margin-top:8rpx;
|
||
.name {
|
||
font-size:34rpx;
|
||
padding: 25rpx 30rpx;
|
||
color:$u-content-color;
|
||
line-height:130%;
|
||
background-color: #FFFFFF;
|
||
}
|
||
.options {
|
||
margin-top:8rpx;
|
||
background-color: #FFFFFF;
|
||
padding: 6rpx 30rpx;
|
||
.option {
|
||
padding: 10rpx 0rpx;
|
||
display: flex;
|
||
font-size: 36rpx;
|
||
.option-item1{
|
||
justify-content: flex-start
|
||
}
|
||
.option-item2{
|
||
justify-content: flex-start;
|
||
color:$u-main-color;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
.header {
|
||
width: 750rpx;
|
||
text-align: center;
|
||
height: 60rpx;
|
||
line-height: 60rpx;
|
||
font-size: 36rpx;
|
||
font-weight: 600;
|
||
color: $theme-color;
|
||
background-color: #FFFFFF;
|
||
|
||
&-button {
|
||
position: absolute;
|
||
right: 10rpx;
|
||
font-size:34rpx;
|
||
font-weight: bold;
|
||
color: #000;
|
||
}
|
||
|
||
.scoreText {
|
||
color: #00b060;
|
||
font-size: 35rpx;
|
||
}
|
||
}
|
||
.sub-header {
|
||
padding: 4rpx 20rpx;
|
||
color: #000;
|
||
font-size: 33rpx;
|
||
font-weight: bold;
|
||
background-color: #FFFFFF;
|
||
}
|
||
.submitButton{
|
||
padding: 6rpx 20rpx;
|
||
border-radius: 15rpx;
|
||
font-weight: bold;
|
||
color: #ffffff;
|
||
background-color: $u-type-error;
|
||
}
|
||
.header-card {
|
||
padding: 6rpx 20rpx;
|
||
border-radius: 15rpx;
|
||
color: #FFFFFF;
|
||
background-color: $u-type-primary-dark;
|
||
}
|
||
.footer {
|
||
width: 750rpx;
|
||
height: 100rpx;
|
||
padding: 30rpx 60rpx;
|
||
position: fixed;
|
||
bottom: 20rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
font-size: 32rpx;
|
||
box-sizing: border-box;
|
||
color: #4c8af3;
|
||
box-shadow: 0 0 5px 1px #eee;
|
||
background-color: #FFFFFF;
|
||
|
||
&-card {
|
||
padding: 10rpx 20rpx;
|
||
border: 1px solid $theme-color;
|
||
border-radius: 15rpx;
|
||
color: #FFFFFF;
|
||
background-color: $theme-color;
|
||
}
|
||
}
|
||
.questionArea {
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: wrap;
|
||
margin-bottom: 20rpx;
|
||
|
||
.questionItem {
|
||
width: 80rpx;
|
||
height: 80rpx;
|
||
margin: 10rpx 22rpx;
|
||
line-height: 80rpx;
|
||
font-size: 35rpx;
|
||
text-align: center;
|
||
border-radius: 50%;
|
||
color: #ffffff;
|
||
}
|
||
.questionItem-select {
|
||
background-color: $theme-color;
|
||
}
|
||
|
||
.questionItem-unselect {
|
||
background-color: #bbbbbb;
|
||
}
|
||
}
|
||
|
||
|
||
</style> |