|
@@ -3,6 +3,8 @@ import {
|
|
|
Button,
|
|
|
Cell,
|
|
|
CountDown,
|
|
|
+ Grid,
|
|
|
+ GridItem,
|
|
|
Icon,
|
|
|
Image,
|
|
|
Popup,
|
|
@@ -10,11 +12,9 @@ import {
|
|
|
SwipeItem,
|
|
|
Tag
|
|
|
} from 'vant'
|
|
|
-import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue'
|
|
|
+import { computed, defineComponent, nextTick, onMounted, reactive, ref } from 'vue'
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
import styles from './index.module.less'
|
|
|
-import iconQuestionNums from '../images/icon-question-nums.png'
|
|
|
-import iconCountDown from '../images/icon-count-down.png'
|
|
|
import iconButtonList from '../images/icon-button-list.png'
|
|
|
|
|
|
import OSticky from '@/components/o-sticky'
|
|
@@ -39,33 +39,34 @@ export default defineComponent({
|
|
|
const countDownRef = ref()
|
|
|
const swipeRef = ref()
|
|
|
const state = reactive({
|
|
|
+ name: route.query.id,
|
|
|
visiableError: false,
|
|
|
visiableAnswer: false,
|
|
|
visiableResult: false,
|
|
|
id: route.query.id,
|
|
|
- examDetail: {} as any,
|
|
|
currentIndex: 0,
|
|
|
questionList: [],
|
|
|
+ questionResultList: [],
|
|
|
time: 0,
|
|
|
visiableSure: false,
|
|
|
resultInfo: {} as any,
|
|
|
resultStatusType: 'SUCCESS', // 'SUCCESS' | 'FAIL'
|
|
|
visiableExam: false, // 考试已结束
|
|
|
nextStatus: false,
|
|
|
- swipeHeight: 'auto' as any
|
|
|
+ swipeHeight: 'auto' as any,
|
|
|
+ answerAnalysis: ''
|
|
|
})
|
|
|
|
|
|
const getExamDetails = async () => {
|
|
|
try {
|
|
|
- const { data } = await request.post('/api-student/examinationQuestion/page', {
|
|
|
+ const { data } = await request.post('/api-student/examinationQuestion/randomPage', {
|
|
|
data: {
|
|
|
page: 1,
|
|
|
row: 50,
|
|
|
categoryId: state.id
|
|
|
}
|
|
|
})
|
|
|
- const { questionJson, studentAnswerJson, ...res } = data
|
|
|
- const temp = data.rows || []
|
|
|
+ const temp = data || []
|
|
|
temp.forEach((item: any) => {
|
|
|
item.showAnalysis = false // 默认不显示解析
|
|
|
item.analysis = {
|
|
@@ -76,8 +77,6 @@ export default defineComponent({
|
|
|
item.userAnswer = [] // 用户答题
|
|
|
})
|
|
|
state.questionList = temp
|
|
|
-
|
|
|
- state.examDetail = { ...res } || {}
|
|
|
} catch {
|
|
|
//
|
|
|
}
|
|
@@ -89,15 +88,15 @@ export default defineComponent({
|
|
|
const onNextQuestion = async () => {
|
|
|
try {
|
|
|
const questionList = state.questionList || []
|
|
|
- const userAnswerList: any = [] // 所有题目的答案
|
|
|
- // let currentResult = false // 当前题目是否已经答题
|
|
|
- questionList.forEach((question: any) => {
|
|
|
+
|
|
|
+ let result: any = {}
|
|
|
+ questionList.forEach((question: any, index: number) => {
|
|
|
// 格式化所有题目的答案
|
|
|
- if (question.userAnswer && question.userAnswer.length > 0) {
|
|
|
- userAnswerList.push({
|
|
|
+ if (index === state.currentIndex) {
|
|
|
+ result = {
|
|
|
questionId: question.id,
|
|
|
- details: question.userAnswer
|
|
|
- })
|
|
|
+ details: question.userAnswer || []
|
|
|
+ }
|
|
|
}
|
|
|
})
|
|
|
|
|
@@ -107,12 +106,52 @@ export default defineComponent({
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- swipeRef.value?.next()
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/api-school/studentUnitExamination/submitTrainingAnswer',
|
|
|
+ {
|
|
|
+ data: result
|
|
|
+ }
|
|
|
+ )
|
|
|
+ // 初始化是否显示解析
|
|
|
+ questionList.forEach((question: any, index: number) => {
|
|
|
+ // 格式化所有题目的答案
|
|
|
+ if (index === state.currentIndex) {
|
|
|
+ state.answerAnalysis = question.answerAnalysis
|
|
|
+ question.showAnalysis = true
|
|
|
+ question.analysis.userResult = data
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if (data) {
|
|
|
+ swipeRef.value?.next()
|
|
|
+ } else {
|
|
|
+ state.visiableError = true
|
|
|
+ }
|
|
|
} catch {
|
|
|
//
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //
|
|
|
+ const getAnswerResult = computed(() => {
|
|
|
+ const questionList = state.questionList || []
|
|
|
+ let passCount = 0
|
|
|
+ let noPassCount = 0
|
|
|
+ questionList.forEach((item: any) => {
|
|
|
+ if (item.showAnalysis) {
|
|
|
+ if (item.analysis.userResult) {
|
|
|
+ passCount += 1
|
|
|
+ } else {
|
|
|
+ noPassCount += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ return {
|
|
|
+ passCount: passCount,
|
|
|
+ noPassCount: noPassCount
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
/**
|
|
|
* @description 重置当前的题目高度
|
|
|
*/
|
|
@@ -128,6 +167,10 @@ export default defineComponent({
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+ const onCloseExam = () => {
|
|
|
+ state.visiableSure = true
|
|
|
+ }
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
getExamDetails()
|
|
|
|
|
@@ -139,12 +182,7 @@ export default defineComponent({
|
|
|
<OHeader
|
|
|
v-slots={{
|
|
|
right: () => (
|
|
|
- <span
|
|
|
- style="color: var(--van-primary-color)"
|
|
|
- onClick={() => {
|
|
|
- // router.push('/create-message')
|
|
|
- }}
|
|
|
- >
|
|
|
+ <span style="color: var(--van-primary-color)" onClick={onCloseExam}>
|
|
|
结束练习
|
|
|
</span>
|
|
|
)
|
|
@@ -153,20 +191,16 @@ export default defineComponent({
|
|
|
</OSticky>
|
|
|
<Cell center class={styles.unitSection}>
|
|
|
{{
|
|
|
- title: () => (
|
|
|
- <div class={[styles.unitTitle]}>
|
|
|
- {state.examDetail.unitExaminationName}i门口看门口看看门口看看门口看看门口看看看
|
|
|
- </div>
|
|
|
- ),
|
|
|
+ title: () => <div class={[styles.unitTitle]}>{state.name}</div>,
|
|
|
value: () => (
|
|
|
<div class={styles.unitCount}>
|
|
|
<div class={styles.countSection}>
|
|
|
- <span class={styles.nums}>12</span>
|
|
|
+ <span class={styles.nums}>{getAnswerResult.value.passCount}</span>
|
|
|
<span>答对</span>
|
|
|
</div>
|
|
|
<div class={styles.countSection}>
|
|
|
<span class={styles.nums} style={{ color: '#F44541' }}>
|
|
|
- 12
|
|
|
+ {getAnswerResult.value.noPassCount}
|
|
|
</span>
|
|
|
<span>答错</span>
|
|
|
</div>
|
|
@@ -181,6 +215,7 @@ export default defineComponent({
|
|
|
ref={swipeRef}
|
|
|
duration={300}
|
|
|
touchable={false}
|
|
|
+ style={{ paddingBottom: '12px' }}
|
|
|
lazyRender
|
|
|
height={state.swipeHeight}
|
|
|
onChange={(index: number) => {
|
|
@@ -189,17 +224,6 @@ export default defineComponent({
|
|
|
}}
|
|
|
>
|
|
|
{state.questionList.map((item: any, index: number) => (
|
|
|
- // item.questionTypeCode === QuestionType.PLAY && (
|
|
|
- // <SwipeItem>
|
|
|
- // <KeepLookQuestion v-model:value={item.userAnswer} data={item} index={index + 1} />
|
|
|
- // <PlayQuestion
|
|
|
- // v-model:value={item.userAnswer}
|
|
|
- // data={item}
|
|
|
- // index={index + 1}
|
|
|
- // unitId={state.id as any}
|
|
|
- // />
|
|
|
- // </SwipeItem>
|
|
|
- // )
|
|
|
<SwipeItem>
|
|
|
<div class="swipe-item-question">
|
|
|
{item.questionTypeCode === QuestionType.RADIO && (
|
|
@@ -321,8 +345,10 @@ export default defineComponent({
|
|
|
>
|
|
|
<ErrorMode
|
|
|
onClose={() => (state.visiableError = false)}
|
|
|
+ answerAnalysis={state.answerAnalysis}
|
|
|
onConform={() => {
|
|
|
swipeRef.value?.next()
|
|
|
+ state.answerAnalysis = ''
|
|
|
}}
|
|
|
/>
|
|
|
</Popup>
|
|
@@ -333,7 +359,7 @@ export default defineComponent({
|
|
|
style={{ background: 'transparent', width: '96%' }}
|
|
|
>
|
|
|
<ResultFinish
|
|
|
- // status="FAIL"
|
|
|
+ status="PRACTICE"
|
|
|
confirmButtonText="继续练习本考点"
|
|
|
cancelButtonText="下一个考点"
|
|
|
onClose={() => (state.visiableResult = false)}
|
|
@@ -341,13 +367,40 @@ export default defineComponent({
|
|
|
console.log('Success')
|
|
|
state.visiableResult = false
|
|
|
}}
|
|
|
+ v-slots={{
|
|
|
+ content: () => (
|
|
|
+ <div class={styles.practiceResult}>
|
|
|
+ <div class={styles.practiceTitle}>本次练习正确率</div>
|
|
|
+ <div class={styles.practiceRate}>80%</div>
|
|
|
+ <Grid border={false} columnNum={3}>
|
|
|
+ <GridItem>
|
|
|
+ <p class={styles.title}>12</p>
|
|
|
+ <p class={styles.name}>练习时长</p>
|
|
|
+ </GridItem>
|
|
|
+ <GridItem>
|
|
|
+ <p class={[styles.title]}>12</p>
|
|
|
+ <p class={styles.name}>答题数</p>
|
|
|
+ </GridItem>
|
|
|
+ <GridItem>
|
|
|
+ <p class={styles.title}>12</p>
|
|
|
+ <p class={styles.name}>错题数</p>
|
|
|
+ </GridItem>
|
|
|
+ </Grid>
|
|
|
+ <div class={styles.practiceTips}>
|
|
|
+ 继续努力!
|
|
|
+ <br />
|
|
|
+ 争取在测验中获得高分!
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
/>
|
|
|
</Popup>
|
|
|
|
|
|
<ODialog
|
|
|
v-model:show={state.visiableSure}
|
|
|
- title="测验完成"
|
|
|
- message="确认本次测验的题目都完成了吗?\n提交后不可修改哦"
|
|
|
+ title="练习完成"
|
|
|
+ message="确认本次练习的题目都完成了吗?"
|
|
|
messageAlign="left"
|
|
|
showCancelButton
|
|
|
cancelButtonText="再等等"
|