<template> <view v-if="quData!=null && quData.id!=null" style="padding-bottom: 80px;"> <uni-row :gutter="1" v-if="mode!=='13'"> <uni-col :span="8"> <view class="st-item"> <uni-icons type="checkbox-filled" size="20" color="#4c9d44" style="margin-right: 5px;" /> {{ trueCount }} </view> </uni-col> <uni-col :span="8"> <view class="st-item"> <uni-icons type="clear" size="20" color="#ff0000" style="margin-right: 5px;" /> {{ wrongCount }} </view> </uni-col> <uni-col :span="8"> <view class="st-item"> 正确率:{{ calcRate() }}% </view> </uni-col> </uni-row> <view style="padding: 12px 15px"> <!-- 引用题目组件 --> <train-qu-item v-model="quData" :card="cardItem" @rest="handleRest" :mode="mode" /> <view class="true-next" v-if="mode!=='13'"> <checkbox :checked="nextIfTrue" @click="nextChange">答对继续下一题</checkbox> </view> <view class="bottom-bar"> <uni-row :gutter="20"> <uni-col :span="6"> <button @click="fetchPrevious" :disabled="currentSort === 1">上题</button> </uni-col> <uni-col :span="6"> <button @click="fetchNext" :disabled="currentSort >= maxSort">下题</button> </uni-col> <uni-col :span="6"> <button type="warn" @click="handleFinish">结束</button> </uni-col> <uni-col :span="6"> <button type="primary" @click="showCard">答题卡</button> </uni-col> </uni-row> </view> </view> <uni-drawer ref="cardDrawer"> <view class="card-title">答题卡</view> <scroll-view scroll-y="true" class="scroll-y"> <view class="card-context"> <view v-for="item in cardList" :key="item.quId" :class="{'card-num': true, 'current':item.quId === quData.id, 'right':item.quId !== quData.id && item.answered && item.isRight, 'error':item.quId !== quData.id && item.answered && !item.isRight}" @click="switchQu(item)"> {{ item.sort }} </view> </view> </scroll-view> </uni-drawer> </view> </template> <script> import { hasTrain, startTrain, listCard, finishTrain, quDetail } from '@/api/repo/train' import TrainQuItem from './components/TrainQuItem.vue' export default { components: { TrainQuItem }, data() { return { trainId: '', cardShow: true, currentSort: 1, maxSort: 100, trueCount: 0, wrongCount: 0, totalCount: 0, rightRate: 0, repoId: '', quId: '', mode: 0, cardList: [], cardItem: {}, quData: { quType: 1, content: '' }, nextIfTrue: false } }, onLoad(option) { this.repoId = option.repoId this.mode = option.mode this.handlerStart(true) }, computed: { }, methods: { calcRate() { if (this.trueCount === 0 || this.totalCount === 0) { return 0 } let rate = parseInt(this.trueCount * 100 / this.totalCount) if (!rate) { rate = 0 } return rate }, nextChange(e) { this.nextIfTrue = !this.nextIfTrue }, // 显示答题卡 showCard() { this.$refs.cardDrawer.open() }, handleRest(data) { let that = this this.cardItem.isRight = data.isRight this.cardItem.answers = data.answers this.cardItem.answered = true if (data.isRight) { this.trueCount += 1 // 继续下一题 if (this.nextIfTrue) { uni.showToast({ icon: 'none', title: '回答正确,继续下一题...' }) setTimeout(function() { that.fetchNext() }, 1500) } } else { this.wrongCount += 1 } }, // 查找答题卡 fetchCard() { uni.showLoading({ title: '获取答题卡...' }) // 正确树立 let that = this listCard(this.trainId).then(data => { this.cardList = data this.totalCount = data.length // 最后一个 this.maxSort = this.cardList[this.cardList.length - 1].sort this.cardList.forEach(function(item) { if (item.isRight) { that.trueCount += 1 } if (!item.isRight && item.answered) { that.wrongCount += 1 } }) // 查找第一题 this.switchQu(this.cardList[0]) // 关闭 uni.hideLoading() }) }, handlerStart(clear) { uni.showLoading({ title: '加载中...' }); // 开始训练 startTrain(this.mode, this.repoId, this.userId, clear).then(data => { // 返回训练 this.trainId = data.id uni.hideLoading() // 获取答题卡 this.fetchCard() }).catch(e => { setTimeout(()=>{ // 错题训练。题库=考试 this.handleBack() // 关闭 uni.hideLoading() }, 1500) }) }, handleBack() { // 错题训练。题库=考试 if (this.mode == 0) { uni.redirectTo({ url: '/pages/paper/book?id=' + this.repoId }); } else { // 跳回题库详情 uni.redirectTo({ url: '/pages/repo/detail?id=' + this.repoId + '&mode=' + this.mode }); } }, // 切换试题 switchQu(item) { this.quId = item.quId this.currentSort = item.sort this.cardItem = item this.fetchQuDetail() }, // 查找试题详细 fetchQuDetail() { // 打开 uni.showLoading({ title: '加载中...' }); quDetail(this.trainId, this.quId).then(data => { // 试题信息 this.quData = data uni.hideLoading() // 切换题目后滑动到顶部 uni.pageScrollTo({ duration: 500, scrollTop: 0, }) }) }, // 上一题 fetchNext() { const index = this.currentSort const item = this.cardList[index] this.switchQu(item) }, // 下一题 fetchPrevious() { const index = this.currentSort - 2 const item = this.cardList[index] this.switchQu(item) }, handleFinish() { const that = this uni.showModal({ title: '提示', content: '确实要结束本次训练吗?', success: function(res) { if (res.confirm) { finishTrain(that.trainId).then(() => { uni.showToast({ title: '结束成功,您随时可以在个人中心查看此训练记录!!', duration: 2000 }); // 跳回题库详情 that.handleBack() }) } } }); }, // 答题卡样式 itemClass(quId, isRight, answered) { if (quId === this.quData.id) { return 'current' } if (isRight) { return 'right' } else if (answered) { return 'error' } } } } </script> <style> .st-item { height: 50px; text-align: center; background: #eee; display: flex; flex-direction: row; align-items: center; justify-content: center; } .true-next { font-size: 12px; color: #666; margin-top: 15px; } .uni-card { margin: 15px 0px !important; z-index: 0 !important; } .scroll-y { width: 100%; height: 90%; white-space: nowrap; } </style>