|
|
|
<template>
|
|
|
|
<view class="content">
|
|
|
|
<view class="flex ai-c jc-c">
|
|
|
|
<view class="flex type_box jc-sb ai-c" v-if="navTitle!=='考前密卷'">
|
|
|
|
<view class="type_item" v-for="(item,index) of tabsList" :key="index" :class="tCurrent==item.value?'checked':'unchecked'" @tap="sectionChange(item.value)">{{item.label}}</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<swiper class="swiper mt20" :current="swiperIndex" :duration="duration" :autoplay="false" :disable-programmatic-animation="true" @change="onChange" @animationfinish="onAnimationfinish" @touchend="touchEnd" >
|
|
|
|
<swiper-item v-for="(quesItem,quesIndex) in swiperList" :key="quesIndex">
|
|
|
|
<scroll-view scroll-y="true" class="swiper-scroll">
|
|
|
|
<view>
|
|
|
|
<view class="m14lr">
|
|
|
|
<text class="tag_box">{{getQuestType(quesItem.type)}}</text>
|
|
|
|
<text class="fs18" style="line-height: 42rpx;vertical-align: middle;">{{quesItem.question}}</text>
|
|
|
|
</view>
|
|
|
|
<view class="p14" v-if="quesItem.imageUrl">
|
|
|
|
<image style="width: 100%;" mode="widthFix" :src="quesItem.imageUrl"></image>
|
|
|
|
</view>
|
|
|
|
<template v-if="quesItem.type!='3'">
|
|
|
|
<view class="flex m14lr ai-c mt20" v-for="(item,index) in quesItem.optionList"
|
|
|
|
:key="item.op" @tap="answerQues(item.opValue,index)">
|
|
|
|
<template v-if="item.opDesc">
|
|
|
|
<template
|
|
|
|
v-if="quesItem.clickAnswer&&quesItem.trueAnswer.includes(item.opValue)">
|
|
|
|
<u-icon class="mr15" name="checkmark-circle-fill" color="#05C341" size="32"></u-icon>
|
|
|
|
</template>
|
|
|
|
<template
|
|
|
|
v-else-if="quesItem.clickAnswer&&quesItem.clickAnswer?.includes(item.opValue)&&!quesItem.trueAnswer.includes(item.opValue)">
|
|
|
|
<u-icon class="mr15" name="close-circle-fill" color="red" size="32"></u-icon>
|
|
|
|
</template>
|
|
|
|
<template v-else-if="!item.chooseOption">
|
|
|
|
<view class="option_item">{{item.op}}</view>
|
|
|
|
</template>
|
|
|
|
<text class="fs18">{{item.opDesc}}</text>
|
|
|
|
</template>
|
|
|
|
</view>
|
|
|
|
<view class="m14lr mt30"
|
|
|
|
v-if="quesItem.clickAnswer&&!quesItem.trueAnswer.includes(quesItem.clickAnswer) || showBestAnswer">
|
|
|
|
<view class="answer_box">
|
|
|
|
<text class="fs18 fw600 cor-000">答案:{{getRightOp(quesItem.trueAnswer)}}</text>
|
|
|
|
<view class="fs18 cor-000" style="text-indent:2em;"> {{quesItem.bestAnswer}}</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
<template v-else>
|
|
|
|
<view class="flex m14lr ai-c mt20" v-for="(item,index) in quesItem.optionList"
|
|
|
|
:key="item.op" @tap="answerQues(item.opValue,index)">
|
|
|
|
<template v-if="item.opDesc">
|
|
|
|
<template
|
|
|
|
v-if="quesItem.isChoose&&quesItem.trueAnswer.includes(item.opValue)&&quesItem.clickAnswer&&quesItem.clickAnswer.includes(item.opValue)">
|
|
|
|
<u-icon class="mr15" name="checkmark-circle-fill" color="#05C341" size="32"></u-icon>
|
|
|
|
</template>
|
|
|
|
<template
|
|
|
|
v-else-if="quesItem.isChoose&&quesItem.clickAnswer&&quesItem.clickAnswer.includes(item.opValue)&&!quesItem.trueAnswer.includes(item.opValue)">
|
|
|
|
<u-icon class="mr15" name="close-circle-fill" color="red" size="32"></u-icon>
|
|
|
|
</template>
|
|
|
|
<template v-else-if="!quesItem.isChoose||quesItem.clickAnswer&&!quesItem.clickAnswer.includes(item.opValue)&&quesItem.isChoose">
|
|
|
|
<template v-if="quesItem.isChoose">
|
|
|
|
<view class="option_item" :class="quesItem.trueAnswer.includes(item.opValue)&&quesItem.clickAnswer&&!quesItem.clickAnswer.includes(item.opValue)?'right_option':''">{{item.op}}</view>
|
|
|
|
</template>
|
|
|
|
<template v-else>
|
|
|
|
<view class="option_item" :class="quesItem.clickAnswer&&quesItem.clickAnswer.includes(item.opValue)&&!quesItem.isChoose?'checked_option':''">{{item.op}}</view>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
<text class="fs18">{{item.opDesc}}</text>
|
|
|
|
</template>
|
|
|
|
</view>
|
|
|
|
<view class="p14">
|
|
|
|
<button :class="quesItem.clickAnswer&&quesItem.clickAnswer.length>1?'dx_checked':'dx_btn'" @click="duoxuan(quesItem.clickAnswer)">确认</button>
|
|
|
|
</view>
|
|
|
|
<view class="m14lr mt30"
|
|
|
|
v-if="isShowAnswer">
|
|
|
|
<view class="answer_box">
|
|
|
|
<text class="fs18 fw600 cor-000">答案:{{getRightOp(quesItem.trueAnswer)}}</text>
|
|
|
|
<view class="fs18 cor-000" style="text-indent:2em;"> {{quesItem.bestAnswer}}</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
</view>
|
|
|
|
</scroll-view>
|
|
|
|
</swiper-item>
|
|
|
|
</swiper>
|
|
|
|
<view class="wp100 flex jc-sb ai-c p14 bc-fff" v-if="isShowAll" style="position: fixed;bottom: 0;left: 0;">
|
|
|
|
<view style="width: 220rpx;">
|
|
|
|
<view v-if="type==='practice'" style="width: 220rpx;height: 80rpx;"></view>
|
|
|
|
<view v-else-if="type=='exam'" class="btn" style="text-align: center;" @tap="submitPaper">
|
|
|
|
<u-count-down ref="countDown_1" :time=" 1*60*60 * 1000" format="HH:mm:ss" @change="timeChange"></u-count-down>
|
|
|
|
<text>交卷</text>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="text-center flex jc-c ai-c" style="flex-direction: column;" @tap="toCollect">
|
|
|
|
<u-icon name="star-fill" v-if="questionList[topicIndex].isCollect" color="rgb(249,236,141)" size="24"></u-icon>
|
|
|
|
<u-icon name="star" v-else size="24"></u-icon>
|
|
|
|
<text class="cor-666">{{questionList[topicIndex].isCollect?'已收藏':'收藏'}}</text>
|
|
|
|
</view>
|
|
|
|
<view class="text-center">
|
|
|
|
<view style="color: #00B74F;">{{rightList.length}}</view>
|
|
|
|
<text class="cor-666">答对</text>
|
|
|
|
</view>
|
|
|
|
<view class="text-center">
|
|
|
|
<view style="color: #FF6E02;">{{wrongList.length}}</view>
|
|
|
|
<text class="cor-666">答错</text>
|
|
|
|
</view>
|
|
|
|
<view class="text-center" @tap="popupShow=!popupShow">
|
|
|
|
<view><text class="cor-333">{{topicIndex+1}}</text><text style="color:#999;">/{{questionList.length}}</text></view>
|
|
|
|
<text class="cor-666">题板</text>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view v-else class="wp100 p14" style="position: fixed;bottom: 30rpx;left: 0;">
|
|
|
|
<button class="vip_btn" @click="toVip">立即查看全部题目</button>
|
|
|
|
</view>
|
|
|
|
<u-modal :show="tipShow">
|
|
|
|
<view class="relative wp100">
|
|
|
|
<view class="text-center">
|
|
|
|
<text>{{title}}</text>
|
|
|
|
<view class="mt20">{{content}}</view>
|
|
|
|
</view>
|
|
|
|
<view style="position: absolute;right:0px;top:0" @tap="cancel">
|
|
|
|
<u-icon name="close-circle-fill" color="rgb(204,204,204)" size="24"></u-icon>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<template #confirmButton>
|
|
|
|
<view class="p10" >
|
|
|
|
<u-button :customStyle="{width:'100%',height:'68rpx',borderRadius:'34rpx',color:'#fff',backgroundColor:'#05C341'}" @click="toResult">查看练题结果</u-button>
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
</u-modal>
|
|
|
|
<u-modal :show="isSubmit">
|
|
|
|
<view class="wp100">
|
|
|
|
<view class="text-center">
|
|
|
|
<text>确认交卷</text>
|
|
|
|
<view class="mt20 flex ai-c jc-sb">
|
|
|
|
<view class="text-center">
|
|
|
|
<text style="color:#FF6E02">{{questionList.length-rightList.length-wrongList.length}}</text>
|
|
|
|
<view class="cor-333">未答题数</view>
|
|
|
|
</view>
|
|
|
|
<view class="text-center">
|
|
|
|
<u-count-down ref="countDown_3" class="balckColor" :time="1*60*60 * 1000" format="HH:mm:ss"></u-count-down>
|
|
|
|
<view>剩余时间</view>
|
|
|
|
</view>
|
|
|
|
<view class="text-center">
|
|
|
|
<text style="color:#333">{{(rightList.length/questionList.length * 100).toFixed(0)}}</text>
|
|
|
|
<view class="cor-333">考试得分</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<template #confirmButton>
|
|
|
|
<view class="p10" >
|
|
|
|
<template v-if="isShowAll">
|
|
|
|
<u-button :customStyle="{width:'45%',marginRight:'10px',height:'68rpx',lineHeight:'68rpx',borderRadius:'34rpx',color:'#666',border:'1px solid #666',display:'inline-block'}" @click="continueExam">继续考试</u-button>
|
|
|
|
<u-button :customStyle="{width:'45%',marginLeft:'10px',height:'68rpx',lineHeight:'68rpx',borderRadius:'34rpx',color:'#fff',backgroundColor:'#05C341',display:'inline-block'}" @click="toSubmit">现在交卷</u-button>
|
|
|
|
</template>
|
|
|
|
<template v-else>
|
|
|
|
<u-button :customStyle="{width:'45%',marginRight:'10px',height:'68rpx',lineHeight:'68rpx',borderRadius:'34rpx',color:'#666',border:'1px solid #666',display:'inline-block'}" @click="toLeave">确定离开</u-button>
|
|
|
|
<u-button :customStyle="{width:'45%',marginLeft:'10px',height:'68rpx',lineHeight:'68rpx',borderRadius:'34rpx',color:'#fff',backgroundColor:'#05C341',display:'inline-block'}" @click="continueExam">继续考试</u-button>
|
|
|
|
</template>
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
</u-modal>
|
|
|
|
<u-popup :show="popupShow" mode="bottom" :closeOnClickOverlay="true" @close="popupShow=false">
|
|
|
|
<view>
|
|
|
|
<view class="wp100 flex jc-sb p14 bc-fff">
|
|
|
|
<view style="width: 220rpx;">
|
|
|
|
<view v-if="type==='practice'" style="width: 220rpx;height: 80rpx;"></view>
|
|
|
|
<view v-else-if="type=='exam'" class="btn" style="text-align: center;" @tap="submitPaper">
|
|
|
|
<u-count-down ref="countDown_2" :time="1 * 60 * 60 * 1000" format="HH:mm:ss"></u-count-down>
|
|
|
|
<text>交卷</text>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="text-center flex jc-c ai-c" style="flex-direction: column;" @tap="toCollect">
|
|
|
|
<u-icon name="star-fill" v-if="questionList[topicIndex].isCollect" color="rgb(249,236,141)" size="24"></u-icon>
|
|
|
|
<u-icon name="star" v-else size="24"></u-icon>
|
|
|
|
<text class="cor-666">{{questionList[topicIndex].isCollect?'已收藏':'收藏'}}</text>
|
|
|
|
</view>
|
|
|
|
<view class="text-center">
|
|
|
|
<view style="color: #00B74F;">{{rightList.length}}</view>
|
|
|
|
<text class="cor-666">答对</text>
|
|
|
|
</view>
|
|
|
|
<view class="text-center">
|
|
|
|
<view style="color: #FF6E02;">{{wrongList.length}}</view>
|
|
|
|
<text class="cor-666">答错</text>
|
|
|
|
</view>
|
|
|
|
<view class="text-center" @tap="popupShow=!popupShow">
|
|
|
|
<view><text class="cor-333">{{topicIndex+1}}</text><text style="color:#999;">/{{questionList.length}}</text></view>
|
|
|
|
<text class="cor-666">题板</text>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="flex ai-c jc-fs p14" style="flex-wrap: wrap;max-height: 400px;overflow-y: scroll;">
|
|
|
|
<view v-for="(item,index) of questionList" :key="index" style="width:20%;" class="flex ai-c jc-c" @tap="chooseQueston(index)">
|
|
|
|
<view class="tCircle mb10" :class="{
|
|
|
|
'active':index == topicIndex,
|
|
|
|
'success':rightList.includes(item.questionId),
|
|
|
|
'error':wrongList.includes(item.questionId)
|
|
|
|
}">
|
|
|
|
{{index+1}}
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</u-popup>
|
|
|
|
<!-- <u-popup :show="showVip" mode="bottom" :closeOnClickOverlay="true" :round="16" @close="showVip=false">
|
|
|
|
<view class="p14" style="z-index: 9;">
|
|
|
|
<view class="wp100 flex ai-c jc-sb">
|
|
|
|
<text class="fs30 fw600 cor-000">VIP题库</text>
|
|
|
|
<u-icon name="close" color="#c2c2c2" size="20" @tap="showVip=false"></u-icon>
|
|
|
|
</view>
|
|
|
|
<text class="fs16 cor-666">精准刷题,更高效</text>
|
|
|
|
<view style="width:100%;height: 110rpx;background-image: url(../../static/image/practice/vip_question.png);background-size: 100% 100%;" class="mt15 relative">
|
|
|
|
<view style="position: absolute;left:0,top:0;height: 110rpx;" class="wp100 flex jc-c ai-c">
|
|
|
|
<text class="fs16" style="color: #994800;">科一+科四精简500题</text>
|
|
|
|
</view>
|
|
|
|
<image style="width: 65rpx;height: 65rpx; position: absolute;right: 20px;top: -5px;" src="../../static/image/practice/vip_include.png"></image>
|
|
|
|
</view>
|
|
|
|
<view style="width:100%;height: 110rpx;background-image: url(../../static/image/practice/vip_test.png);background-size: 100% 100%;z-index: 9;" class="mt15 relative">
|
|
|
|
<view style="position: absolute;left:0,top:0;height: 110rpx;" class="wp100 flex jc-c ai-c">
|
|
|
|
<text class="fs16" style="color: #994800;">科一+科四考前密卷2套</text>
|
|
|
|
</view>
|
|
|
|
<image style="width: 65rpx;height: 65rpx; position: absolute;right: 20px;top: -5px;" src="../../static/image/practice/vip_include.png"></image>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view style="height: 528rpx;width: 100%;background-image: url(../../static/image/practice/vip_bg.jpg);background-size: 100% 100%;margin-top: -65px;position: relative;">
|
|
|
|
<text style="position: absolute;top: 151px;left:117px;rotate: 16deg;" class="fs25 cor-fff">VIP题库</text>
|
|
|
|
</view>
|
|
|
|
<view class="wp100 p14" style="position: absolute;left: 0;bottom:20px">
|
|
|
|
<view class="sub_btn flex ai-c jc-sb">
|
|
|
|
<text class="cor-fff fs14">¥<text class="fs24 cor-fff">{{nowPrice}}</text></text>
|
|
|
|
<image style="width: 276rpx;height: 88rpx;margin-top: -5px;" src="../../static/image/index/buy.png"></image>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</u-popup> -->
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import {
|
|
|
|
mapState,
|
|
|
|
mapActions
|
|
|
|
} from 'pinia' //引入映射函数
|
|
|
|
import storage from '@/jtools/storage';
|
|
|
|
import useQuestionStore from '@/jtools/store/question' //引入store
|
|
|
|
import {
|
|
|
|
submitTest
|
|
|
|
} from '@/jtools/api/question';
|
|
|
|
export default {
|
|
|
|
props:{
|
|
|
|
tabsList:{
|
|
|
|
type:Array
|
|
|
|
},
|
|
|
|
type:{
|
|
|
|
type:String,
|
|
|
|
default:'practice'
|
|
|
|
},
|
|
|
|
isSubmit:{
|
|
|
|
type:Boolean,
|
|
|
|
default:false
|
|
|
|
},
|
|
|
|
isShowAll:{
|
|
|
|
type:Boolean,
|
|
|
|
default:true
|
|
|
|
},
|
|
|
|
subject:{
|
|
|
|
type:[String,Number],
|
|
|
|
default:1,
|
|
|
|
},
|
|
|
|
navTitle:{
|
|
|
|
type:String
|
|
|
|
}
|
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
originArray:'',
|
|
|
|
showBestAnswer:false,
|
|
|
|
nowPrice:68,
|
|
|
|
showVip:false,
|
|
|
|
popupShow:false,
|
|
|
|
content:'太棒啦,已答完最后一题~',
|
|
|
|
tipShow:false,
|
|
|
|
title:'提示',
|
|
|
|
tCurrent:0,
|
|
|
|
index:0,
|
|
|
|
qIndex:0,
|
|
|
|
rightList:[],
|
|
|
|
wrongList:[],
|
|
|
|
collectList:storage.get(`collectList_subject${this.subject}`) || [],
|
|
|
|
questionList: [{isCollect:true}],//数据源
|
|
|
|
swiperList: [], // 轮播图数据列表
|
|
|
|
swiperIndex: 0, // 轮播图当前位置
|
|
|
|
isChange: false, // 是否切换
|
|
|
|
topicIndex: 0, // 题目位置
|
|
|
|
duration: 200, // 动画过渡时长
|
|
|
|
time:0,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
computed: {
|
|
|
|
...mapState(useQuestionStore, ["currentIndex_subject1","currentIndex_subject2"]) ,//映射函数,取出tagslist
|
|
|
|
isShowAnswer(){
|
|
|
|
// quesItem.isChoose&&quesItem.clickAnswer&&!quesItem.trueAnswer.includes(quesItem.clickAnswer)
|
|
|
|
if(this.questionList[this.topicIndex].isChoose){
|
|
|
|
const arr1=this.questionList[this.topicIndex].clickAnswer.split('')
|
|
|
|
const arr2=this.questionList[this.topicIndex].trueAnswer.split('')
|
|
|
|
if(!this.isArrEqual(arr1,arr2)){
|
|
|
|
return true
|
|
|
|
}else{
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
...mapActions(useQuestionStore,['getCurrentIndex']),
|
|
|
|
toLeave(){
|
|
|
|
uni.switchTab({
|
|
|
|
url:'/pages/index/index'
|
|
|
|
})
|
|
|
|
},
|
|
|
|
isShowBest(val){
|
|
|
|
this.showBestAnswer=val
|
|
|
|
},
|
|
|
|
duoxuan(val){
|
|
|
|
if(val&&val.length>1){
|
|
|
|
this.questionList[this.topicIndex].isChoose=true
|
|
|
|
const falseList =storage.get(`wrongList_subject${this.subject}`) || []
|
|
|
|
const trueList =storage.get(`rightList_subject${this.subject}`) || []
|
|
|
|
if(this.tCurrent!==1){
|
|
|
|
const arr1=this.questionList[this.topicIndex].clickAnswer.split('')
|
|
|
|
const arr2=this.questionList[this.topicIndex].trueAnswer.split('')
|
|
|
|
if(this.isArrEqual(arr1,arr2)){
|
|
|
|
//判断选择的答案和实际的答案是否相同,如果相同,判断如果该题的ID在不在正确的数组中,不在则Push(存储的的同理)
|
|
|
|
//如果这道题在错误的数组中则把这道题在错误数组中删掉
|
|
|
|
if(!this.rightList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
this.rightList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
}
|
|
|
|
if(!trueList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
trueList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
storage.set(`rightList_subject${this.subject}`,trueList)
|
|
|
|
}
|
|
|
|
if(this.wrongList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
const wIndex=this.wrongList.indexOf(this.questionList[this.topicIndex].questionId)
|
|
|
|
this.wrongList.splice(wIndex,1)
|
|
|
|
}
|
|
|
|
if(falseList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
const wIndex=falseList.indexOf(this.questionList[this.topicIndex].questionId)
|
|
|
|
falseList.splice(wIndex,1)
|
|
|
|
storage.set(`wrongList_subject${this.subject}`,falseList)
|
|
|
|
}
|
|
|
|
//答对题目 如果不是最后一题,跳下一题
|
|
|
|
if(this.topicIndex<this.questionList.length-1){
|
|
|
|
this.topicIndex ++;
|
|
|
|
this.qIndex=this.topicIndex
|
|
|
|
setTimeout(()=>{
|
|
|
|
this.renderSwiper(this.topicIndex);
|
|
|
|
},1000)
|
|
|
|
}
|
|
|
|
if(this.topicIndex===this.questionList.length-1){
|
|
|
|
this.qIndex=this.topicIndex+1
|
|
|
|
}
|
|
|
|
if(this.qIndex>this.questionList.length-1){
|
|
|
|
setTimeout(()=>{
|
|
|
|
this.tipShow=true
|
|
|
|
},1000)
|
|
|
|
}else{
|
|
|
|
this.tipShow=false
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
if(!this.wrongList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
this.wrongList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
}
|
|
|
|
if(!falseList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
falseList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
storage.set(`wrongList_subject${this.subject}`,falseList)
|
|
|
|
}
|
|
|
|
if(trueList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
const rIndex=trueList.indexOf(this.questionList[this.topicIndex].questionId)
|
|
|
|
trueList.splice(rIndex,1)
|
|
|
|
storage.set(`rightList_subject${this.subject}`,trueList)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
timeChange(e){
|
|
|
|
this.time=e
|
|
|
|
if(e.hours==0&&e.minutes==0&&e.seconds==0&&e.milliseconds==0){
|
|
|
|
uni.showToast({
|
|
|
|
title:"考试结束,将为您自动交卷~",
|
|
|
|
icon:'none'
|
|
|
|
})
|
|
|
|
setTimeout(()=>{
|
|
|
|
this.toSubmit()
|
|
|
|
},1000)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
//获取正确选项
|
|
|
|
getRightOp(val){
|
|
|
|
let rightOp=''
|
|
|
|
this.questionList[this.topicIndex].optionList.forEach(item=>{
|
|
|
|
if(this.questionList[this.topicIndex].trueAnswer.includes(item.opValue)){
|
|
|
|
if(rightOp){
|
|
|
|
rightOp=rightOp+'、'+item.op
|
|
|
|
}else{
|
|
|
|
rightOp=item.op
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
return rightOp
|
|
|
|
},
|
|
|
|
//获取题类型
|
|
|
|
getQuestType(val){
|
|
|
|
if(val=='1'){
|
|
|
|
return '判断'
|
|
|
|
}else if(val=='2'){
|
|
|
|
return '单选'
|
|
|
|
}else if(val=='3'){
|
|
|
|
return '多选'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
//开通VIP
|
|
|
|
toVip(){
|
|
|
|
uni.navigateTo({
|
|
|
|
url:"/pages/index/videoVip?subject="+this.subject
|
|
|
|
})
|
|
|
|
},
|
|
|
|
submitPaper(){
|
|
|
|
if(this.isShowAll){
|
|
|
|
this.$refs.countDown_1.pause();
|
|
|
|
this.$refs.countDown_2.pause();
|
|
|
|
}
|
|
|
|
this.$refs.countDown_3.pause();
|
|
|
|
this.$emit('update:isSubmit',true)
|
|
|
|
},
|
|
|
|
continueExam(){
|
|
|
|
this.$refs.countDown_1.start();
|
|
|
|
this.$refs.countDown_2.start();
|
|
|
|
this.$refs.countDown_3.start();
|
|
|
|
this.$emit('update:isSubmit',false)
|
|
|
|
},
|
|
|
|
//切换题目
|
|
|
|
chooseQueston(index){
|
|
|
|
this.popupShow=false
|
|
|
|
this.pickerTopic(index)
|
|
|
|
},
|
|
|
|
//交卷
|
|
|
|
toSubmit(){
|
|
|
|
const restTime=this.time.hours*60*60+this.time.minutes*60+this.time.seconds
|
|
|
|
const score=(this.rightList.length/this.questionList.length * 100).toFixed(0)
|
|
|
|
submitTest({
|
|
|
|
"carTypeId": storage.get('carType') || '1001',
|
|
|
|
"score": score,
|
|
|
|
"testTime": 60*60-restTime,
|
|
|
|
subject:this.subject
|
|
|
|
}).then(resp=>{
|
|
|
|
const doNotNum=this.questionList.length-this.rightList.length-this.wrongList.length
|
|
|
|
const list = JSON.stringify(this.wrongList)
|
|
|
|
if(resp.code==='0000'){
|
|
|
|
uni.navigateTo({
|
|
|
|
url:"/pages/questionBank/examResult?doNotNum="+doNotNum+"&wrongList="+list+"&score="+score+"&subject="+this.subject+"&navTitle="+this.navTitle
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
},
|
|
|
|
//查看考试结果
|
|
|
|
toResult(){
|
|
|
|
const allDoNum=this.wrongList.length+this.rightList.length
|
|
|
|
const list = JSON.stringify(this.wrongList)
|
|
|
|
uni.navigateTo({
|
|
|
|
url:"/pages/questionBank/practiceResult?allDoNum="+allDoNum+"&wrongList="+list+"&subject="+this.subject+"&navTitle="+this.navTitle
|
|
|
|
})
|
|
|
|
},
|
|
|
|
toCollect(){
|
|
|
|
if(this.questionList[this.topicIndex].isCollect){
|
|
|
|
if(this.collectList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
const idx=this.collectList.indexOf(this.questionList[this.topicIndex].questionId)
|
|
|
|
this.collectList.splice(idx,1)
|
|
|
|
}
|
|
|
|
this.questionList[this.topicIndex].isCollect=false
|
|
|
|
uni.showToast({
|
|
|
|
title:"取消收藏",
|
|
|
|
icon:'none'
|
|
|
|
})
|
|
|
|
}else{
|
|
|
|
this.collectList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
this.questionList[this.topicIndex].isCollect=true
|
|
|
|
uni.showToast({
|
|
|
|
title:"已收藏",
|
|
|
|
icon:'none'
|
|
|
|
})
|
|
|
|
}
|
|
|
|
storage.set(`collectList_subject${this.subject}`,this.collectList)
|
|
|
|
},
|
|
|
|
cancel(){
|
|
|
|
this.tipShow=false
|
|
|
|
},
|
|
|
|
touchEnd(e){
|
|
|
|
if(this.topicIndex<this.questionList.length-1){
|
|
|
|
this.index=this.topicIndex
|
|
|
|
}else{
|
|
|
|
this.index++
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// 渲染 swiper
|
|
|
|
renderSwiper(index) {
|
|
|
|
let list = [];
|
|
|
|
let current = 1;
|
|
|
|
if (this.questionList[index - 1]) {
|
|
|
|
list.push(this.questionList[index - 1]);
|
|
|
|
} else {
|
|
|
|
current = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
list.push(this.questionList[index])
|
|
|
|
|
|
|
|
if (this.questionList[index + 1]) {
|
|
|
|
list.push(this.questionList[index + 1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.duration = 0;
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
this.swiperList = list;
|
|
|
|
this.swiperIndex = current;
|
|
|
|
setTimeout(() => {
|
|
|
|
this.duration = 200;
|
|
|
|
}, 100)
|
|
|
|
}, 50)
|
|
|
|
},
|
|
|
|
|
|
|
|
// 轮播图切换
|
|
|
|
onChange(e) {
|
|
|
|
// 非触摸事件不做轮播图状态更新
|
|
|
|
if (e.detail.source != "touch") return;
|
|
|
|
|
|
|
|
// 标识已切换
|
|
|
|
this.isChange = true;
|
|
|
|
// 轮播图当前位置大于原来时则表示为下一题
|
|
|
|
if (e.detail.current > this.swiperIndex) {
|
|
|
|
this.topicIndex++;
|
|
|
|
} else {
|
|
|
|
// 轮播图当前位置小于原来时则表示为上一题
|
|
|
|
this.topicIndex--;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.getCurrentIndex(this.topicIndex,this.subject)
|
|
|
|
// 更新轮播图位置数值,为更新时让 Vue 能监听到数据有改变
|
|
|
|
this.swiperIndex = e.detail.current;
|
|
|
|
},
|
|
|
|
// 轮播图动画结束
|
|
|
|
onAnimationfinish(e) {
|
|
|
|
if(this.index>=this.questionList.length){
|
|
|
|
if(this.isShowAll){
|
|
|
|
this.tipShow=true
|
|
|
|
}else{
|
|
|
|
this.showVip=true
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
this.showVip=false
|
|
|
|
this.tipShow=false
|
|
|
|
}
|
|
|
|
if (!this.isChange) return;
|
|
|
|
|
|
|
|
this.isChange = false;
|
|
|
|
setTimeout(() => {
|
|
|
|
this.renderSwiper(this.topicIndex);
|
|
|
|
}, 10);
|
|
|
|
},
|
|
|
|
// 选择题目
|
|
|
|
pickerTopic(index) {
|
|
|
|
this.topicIndex = index;
|
|
|
|
this.index=this.topicIndex
|
|
|
|
this.getCurrentIndex(this.topicIndex,this.subject)
|
|
|
|
this.renderSwiper(index);
|
|
|
|
},
|
|
|
|
isArrEqual(arr1, arr2){
|
|
|
|
return arr1.length === arr2.length && arr1.every((ele) => arr2.includes(ele));
|
|
|
|
},
|
|
|
|
//答题
|
|
|
|
answerQues(op, index) {
|
|
|
|
const falseList =storage.get(`wrongList_subject${this.subject}`) || []
|
|
|
|
const trueList =storage.get(`rightList_subject${this.subject}`) || []
|
|
|
|
if (!this.questionList[this.topicIndex].clickAnswer) {
|
|
|
|
this.questionList[this.topicIndex].optionList[index].chooseOption =`${this.questionList[this.topicIndex].optionList[index].chooseOption?this.questionList[this.topicIndex].optionList[index].chooseOption:''}${op}`
|
|
|
|
this.questionList[this.topicIndex].clickAnswer = `${this.questionList[this.topicIndex].optionList[index].clickAnswer?this.questionList[this.topicIndex].optionList[index].clickAnswer:''}${op}`
|
|
|
|
}else{
|
|
|
|
//如果是多选 点击的选项中不包含该选项则拼接进去,如果包含则能删除
|
|
|
|
if(this.questionList[this.topicIndex].type=='3'&&!this.questionList[this.topicIndex].clickAnswer.includes(op)){
|
|
|
|
this.questionList[this.topicIndex].optionList[index].chooseOption =`${this.questionList[this.topicIndex].optionList[index].chooseOption?this.questionList[this.topicIndex].optionList[index].chooseOption:''}${op}`
|
|
|
|
this.questionList[this.topicIndex].clickAnswer =`${this.questionList[this.topicIndex].clickAnswer}${op}`
|
|
|
|
}else if(this.questionList[this.topicIndex].type=='3'&&this.questionList[this.topicIndex].clickAnswer.includes(op)){
|
|
|
|
this.questionList[this.topicIndex].optionList[index].chooseOption =''
|
|
|
|
let reg2 = new RegExp(op); // 不加'g',仅删除字符串里第一个"a"
|
|
|
|
this.questionList[this.topicIndex].clickAnswer = this.questionList[this.topicIndex].clickAnswer.replace(reg2,"");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.originArray=JSON.stringify(this.questionList)
|
|
|
|
if(this.tCurrent!==1&&this.questionList[this.topicIndex].type!='3'){
|
|
|
|
const arr1=this.questionList[this.topicIndex].clickAnswer.split('')
|
|
|
|
const arr2=this.questionList[this.topicIndex].trueAnswer.split('')
|
|
|
|
if(this.isArrEqual(arr1,arr2)){
|
|
|
|
//判断选择的答案和实际的答案是否相同,如果相同,判断如果该题的ID在不在正确的数组中,不在则Push(存储的的同理)
|
|
|
|
//如果这道题在错误的数组中则把这道题在错误数组中删掉
|
|
|
|
if(!this.rightList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
this.rightList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
}
|
|
|
|
if(!trueList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
trueList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
storage.set(`rightList_subject${this.subject}`,trueList)
|
|
|
|
}
|
|
|
|
if(this.wrongList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
const wIndex=this.wrongList.indexOf(this.questionList[this.topicIndex].questionId)
|
|
|
|
this.wrongList.splice(wIndex,1)
|
|
|
|
}
|
|
|
|
if(falseList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
const wIndex=falseList.indexOf(this.questionList[this.topicIndex].questionId)
|
|
|
|
falseList.splice(wIndex,1)
|
|
|
|
storage.set(`wrongList_subject${this.subject}`,falseList)
|
|
|
|
}
|
|
|
|
//答对题目 如果不是最后一题,跳下一题
|
|
|
|
if(this.topicIndex<this.questionList.length-1){
|
|
|
|
this.topicIndex ++;
|
|
|
|
this.qIndex=this.topicIndex
|
|
|
|
setTimeout(()=>{
|
|
|
|
this.renderSwiper(this.topicIndex);
|
|
|
|
},1000)
|
|
|
|
}
|
|
|
|
if(this.topicIndex===this.questionList.length-1){
|
|
|
|
this.qIndex=this.topicIndex+1
|
|
|
|
}
|
|
|
|
if(this.qIndex>this.questionList.length-1){
|
|
|
|
setTimeout(()=>{
|
|
|
|
this.tipShow=true
|
|
|
|
},1000)
|
|
|
|
}else{
|
|
|
|
this.tipShow=false
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
if(!this.wrongList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
this.wrongList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
}
|
|
|
|
if(!falseList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
falseList.push(this.questionList[this.topicIndex].questionId)
|
|
|
|
storage.set(`wrongList_subject${this.subject}`,falseList)
|
|
|
|
}
|
|
|
|
if(trueList.includes(this.questionList[this.topicIndex].questionId)){
|
|
|
|
const rIndex=trueList.indexOf(this.questionList[this.topicIndex].questionId)
|
|
|
|
trueList.splice(rIndex,1)
|
|
|
|
storage.set(`rightList_subject${this.subject}`,trueList)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
sectionChange(index) {
|
|
|
|
this.tCurrent = index
|
|
|
|
// this.getQuestionList()
|
|
|
|
// this.renderSwiper(0)
|
|
|
|
this.$emit('changeTab',index)
|
|
|
|
},
|
|
|
|
getQuestionList(val) {
|
|
|
|
if(val&&val.length){
|
|
|
|
const arr = JSON.parse(val)
|
|
|
|
this.questionList=[]
|
|
|
|
arr.forEach(item=>{
|
|
|
|
let isCollect=false
|
|
|
|
if(this.collectList.includes(item.questionId)){
|
|
|
|
isCollect=true
|
|
|
|
}
|
|
|
|
this.questionList.push({
|
|
|
|
isChoose:false,
|
|
|
|
isCollect:isCollect,
|
|
|
|
...item
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}else{
|
|
|
|
this.questionList=JSON.parse(this.originArray)
|
|
|
|
}
|
|
|
|
|
|
|
|
if(this.navTitle==='顺序答题'){
|
|
|
|
this.pickerTopic(this[`currentIndex_subject${this.subject}`])
|
|
|
|
}else{
|
|
|
|
this.renderSwiper(0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
.checked_option{
|
|
|
|
background-color: #000;
|
|
|
|
border: 1px solid #000;
|
|
|
|
color:#fff
|
|
|
|
}
|
|
|
|
.type_box {
|
|
|
|
width: 350rpx;
|
|
|
|
height: 72rpx;
|
|
|
|
background-color: #FFFFFF;
|
|
|
|
border-radius: 8rpx;
|
|
|
|
}
|
|
|
|
|
|
|
|
.type_item {
|
|
|
|
text-align: center;
|
|
|
|
line-height: 64rpx;
|
|
|
|
width: 160rpx;
|
|
|
|
height: 64rpx;
|
|
|
|
border-radius: 8rpx;
|
|
|
|
}
|
|
|
|
|
|
|
|
.checked {
|
|
|
|
color: #fff;
|
|
|
|
background-color: #05C341;
|
|
|
|
}
|
|
|
|
|
|
|
|
.unchecked {
|
|
|
|
color: #666;
|
|
|
|
}
|
|
|
|
|
|
|
|
.tag_box {
|
|
|
|
vertical-align: middle;
|
|
|
|
display: inline-block;
|
|
|
|
width: 78rpx;
|
|
|
|
height: 42rpx;
|
|
|
|
background: #05C341;
|
|
|
|
border-radius: 8rpx;
|
|
|
|
text-align: center;
|
|
|
|
line-height: 42rpx;
|
|
|
|
color: #fff;
|
|
|
|
font-size: 12px;
|
|
|
|
margin-right: 5px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.option_item {
|
|
|
|
width: 60rpx;
|
|
|
|
height: 60rpx;
|
|
|
|
border: 1px solid #666;
|
|
|
|
border-radius: 50%;
|
|
|
|
text-align: center;
|
|
|
|
line-height: 60rpx;
|
|
|
|
margin-right: 30rpx;
|
|
|
|
}
|
|
|
|
|
|
|
|
.swiper {
|
|
|
|
height: 100vh;
|
|
|
|
}
|
|
|
|
|
|
|
|
.answer_box {
|
|
|
|
width: 100%;
|
|
|
|
padding: 30rpx;
|
|
|
|
background: #EEEEEE;
|
|
|
|
border-radius: 20rpx;
|
|
|
|
}
|
|
|
|
.btn{
|
|
|
|
width: 220rpx;
|
|
|
|
height: 80rpx;
|
|
|
|
border-radius: 40rpx;
|
|
|
|
color:#fff;
|
|
|
|
background: linear-gradient(90deg, #11DF20 0%, #00B74F 100%);
|
|
|
|
font-size: 28rpx;
|
|
|
|
line-height: 80rpx;
|
|
|
|
}
|
|
|
|
.tCircle{
|
|
|
|
width: 80rpx;
|
|
|
|
height: 80rpx;
|
|
|
|
background-color: #fff;
|
|
|
|
border: #ddd solid 1px;
|
|
|
|
border-radius: 50%;
|
|
|
|
line-height: 80rpx;
|
|
|
|
text-align: center;
|
|
|
|
|
|
|
|
&.active {
|
|
|
|
border: #05C341 solid 1px;
|
|
|
|
}
|
|
|
|
|
|
|
|
&.success {
|
|
|
|
background-color:rgb(236,247,241);
|
|
|
|
color: #05C341;
|
|
|
|
border: none;
|
|
|
|
|
|
|
|
&.active {
|
|
|
|
border: #05C341 solid 1px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
&.error {
|
|
|
|
background-color: #ffeceb;
|
|
|
|
color: #f84d27;
|
|
|
|
border: none;
|
|
|
|
|
|
|
|
&.active {
|
|
|
|
border: #f84d27 solid 1px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.content{
|
|
|
|
padding-top: calc(var(--window-top) + 10px);
|
|
|
|
}
|
|
|
|
.vip_btn{
|
|
|
|
width:100%;
|
|
|
|
height: 100rpx;
|
|
|
|
line-height: 100rpx;
|
|
|
|
text-align: center;
|
|
|
|
font-size: 18px;
|
|
|
|
color:#fff;
|
|
|
|
background: linear-gradient(90deg, #FF9804 0%, #E95B0E 100%);
|
|
|
|
border-radius: 50rpx;
|
|
|
|
}
|
|
|
|
.sub_btn{
|
|
|
|
width:100%;
|
|
|
|
height: 110rpx;
|
|
|
|
border: 4px solid #F59B26;
|
|
|
|
background: linear-gradient(0deg, #E66501 0%, #F8A42C 100%);
|
|
|
|
box-shadow: 0rpx 16rpx 20rpx 1rpx rgba(245,155,38,0.78);
|
|
|
|
border-radius: 55rpx;
|
|
|
|
padding: 14rpx;
|
|
|
|
}
|
|
|
|
.dx_btn{
|
|
|
|
width:100%;
|
|
|
|
height: 100rpx;
|
|
|
|
line-height: 100rpx;
|
|
|
|
text-align: center;
|
|
|
|
color:#fff;
|
|
|
|
background: rgb(204,204,204);
|
|
|
|
border-radius:100rpx;
|
|
|
|
}
|
|
|
|
.dx_checked{
|
|
|
|
width:100%;
|
|
|
|
height: 100rpx;
|
|
|
|
line-height: 100rpx;
|
|
|
|
text-align: center;
|
|
|
|
color:#fff;
|
|
|
|
background: #05C341;
|
|
|
|
border-radius:100rpx;
|
|
|
|
}
|
|
|
|
.right_option{
|
|
|
|
border-color: #05C341;
|
|
|
|
background-color: #fff;
|
|
|
|
color: #05C341
|
|
|
|
}
|
|
|
|
</style>
|