|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
|
|
|
2
|
+<template>
|
|
|
3
|
+ <van-popup v-model:show="innerShow" position="top" style="height: 100%">
|
|
|
4
|
+ <van-sticky>
|
|
|
5
|
+ <van-nav-bar title="错题回顾" left-arrow @click-left="close" />
|
|
|
6
|
+ </van-sticky>
|
|
|
7
|
+
|
|
|
8
|
+ <div v-if="loading" class="loading-wrapper">
|
|
|
9
|
+ <van-loading>加载中...</van-loading>
|
|
|
10
|
+ </div>
|
|
|
11
|
+
|
|
|
12
|
+ <div v-else-if="error" class="error">加载失败:{{ error }}</div>
|
|
|
13
|
+
|
|
|
14
|
+ <div v-else>
|
|
|
15
|
+ <div style="margin: 10px 20px; font-weight: bold;">
|
|
|
16
|
+ 本次得分:{{ totalScore }}
|
|
|
17
|
+ </div>
|
|
|
18
|
+ <van-divider />
|
|
|
19
|
+
|
|
|
20
|
+ <!-- 遍历错题/全部题 -->
|
|
|
21
|
+ <div v-for="item in mistakeData" :key="item.id" class="question">
|
|
|
22
|
+ <p>
|
|
|
23
|
+ <span v-if="item.category === '单选'">[单选]</span>
|
|
|
24
|
+ <span v-if="item.category === '多选'">[多选]</span>
|
|
|
25
|
+ <span v-if="item.category === '判断'">[判断]</span>
|
|
|
26
|
+ {{ item.stem }}
|
|
|
27
|
+ </p>
|
|
|
28
|
+
|
|
|
29
|
+ <p>
|
|
|
30
|
+ <span :style="{ color: item.userAnswer === item.answer ? '#007aff' : 'red' }">
|
|
|
31
|
+ 提交答案: {{ item.userAnswer || '未作答' }}
|
|
|
32
|
+ </span>
|
|
|
33
|
+ </p>
|
|
|
34
|
+ <p style="color: #007aff">正确答案: {{ item.answer }}</p>
|
|
|
35
|
+
|
|
|
36
|
+ <div v-if="item.category === '单选' || item.category === '多选'" class="kong">
|
|
|
37
|
+ <div>A. {{ item.optionA }}</div>
|
|
|
38
|
+ <div>B. {{ item.optionB }}</div>
|
|
|
39
|
+ <div>C. {{ item.optionC }}</div>
|
|
|
40
|
+ <div v-if="item.optionD">D. {{ item.optionD }}</div>
|
|
|
41
|
+ <div v-if="item.optionE">E. {{ item.optionE }}</div>
|
|
|
42
|
+ </div>
|
|
|
43
|
+ <div v-if="item.category === '判断'" class="kong">
|
|
|
44
|
+ <div>A. 正确</div>
|
|
|
45
|
+ <div>B. 错误</div>
|
|
|
46
|
+ </div>
|
|
|
47
|
+
|
|
|
48
|
+ <van-divider />
|
|
|
49
|
+ </div>
|
|
|
50
|
+
|
|
|
51
|
+ <!-- ✅ 新增:底部确定按钮 -->
|
|
|
52
|
+ <div style="text-align: center; margin: 20px 0;">
|
|
|
53
|
+ <van-button type="primary" size="large" @click="close">确定</van-button>
|
|
|
54
|
+ </div>
|
|
|
55
|
+ </div>
|
|
|
56
|
+ </van-popup>
|
|
|
57
|
+</template>
|
|
|
58
|
+
|
|
|
59
|
+<script setup>
|
|
|
60
|
+import { getCurrentInstance, ref, watch } from 'vue';
|
|
|
61
|
+import { showFailToast } from 'vant';
|
|
|
62
|
+const { proxy } = getCurrentInstance();
|
|
|
63
|
+const props = defineProps({
|
|
|
64
|
+ show: Boolean,
|
|
|
65
|
+ courseId: String,
|
|
|
66
|
+ userId: String
|
|
|
67
|
+});
|
|
|
68
|
+
|
|
|
69
|
+const emit = defineEmits(['update:show']);
|
|
|
70
|
+
|
|
|
71
|
+const innerShow = ref(false);
|
|
|
72
|
+const loading = ref(false);
|
|
|
73
|
+const error = ref('');
|
|
|
74
|
+const mistakeData = ref([]);
|
|
|
75
|
+const totalScore = ref(0);
|
|
|
76
|
+
|
|
|
77
|
+// 同步外部 show 控制
|
|
|
78
|
+watch(() => props.show, (val) => {
|
|
|
79
|
+ innerShow.value = val;
|
|
|
80
|
+ if (val) {
|
|
|
81
|
+ loadMistakeData();
|
|
|
82
|
+ }
|
|
|
83
|
+});
|
|
|
84
|
+
|
|
|
85
|
+const close = () => {
|
|
|
86
|
+ innerShow.value = false;
|
|
|
87
|
+ emit('update:show', false);
|
|
|
88
|
+};
|
|
|
89
|
+
|
|
|
90
|
+const loadMistakeData = async () => {
|
|
|
91
|
+ loading.value = true;
|
|
|
92
|
+ error.value = '';
|
|
|
93
|
+ try {
|
|
|
94
|
+ const query = { headId: props.courseId };
|
|
|
95
|
+ const res = await proxy.$axios.post('/sgsafe/ExamLine/queryMistake', {
|
|
|
96
|
+ params: JSON.stringify(query)
|
|
|
97
|
+ });
|
|
|
98
|
+
|
|
|
99
|
+ if (res.data.code === 0) {
|
|
|
100
|
+ const data = res.data.data || [];
|
|
|
101
|
+ mistakeData.value = data;
|
|
|
102
|
+
|
|
|
103
|
+ // 注意:queryMistake 返回的是每道题的 userAnswer 和 answer
|
|
|
104
|
+ // 总分通常是 userScore 字段之和
|
|
|
105
|
+ totalScore.value = data.reduce((sum, item) => sum + (Number(item.userScore) || 0), 0);
|
|
|
106
|
+ } else {
|
|
|
107
|
+ error.value = res.data.msg || '获取错题失败';
|
|
|
108
|
+ showFailToast(error.value);
|
|
|
109
|
+ }
|
|
|
110
|
+ } catch (err) {
|
|
|
111
|
+ console.error('加载错题失败', err);
|
|
|
112
|
+ error.value = '网络错误';
|
|
|
113
|
+ showFailToast('加载错题失败');
|
|
|
114
|
+ } finally {
|
|
|
115
|
+ loading.value = false;
|
|
|
116
|
+ }
|
|
|
117
|
+};
|
|
|
118
|
+</script>
|