From 0cf09b8da38d1bf963f00d3494564b895145de68 Mon Sep 17 00:00:00 2001 From: zyronon Date: Tue, 7 Nov 2023 15:07:58 +0800 Subject: [PATCH] Fix footer statistics error bug --- src/components/Practice/Footer.vue | 3 - .../Practice/PracticeWord/TypingWord.vue | 67 ++++++++++++------- src/components/Practice/Statistics.vue | 14 +++- src/components/Ring.vue | 24 +++---- src/components/Toolbar/Toolbar.vue | 5 +- src/components/Tooltip.vue | 2 +- src/stores/base.ts | 10 +-- src/types.ts | 2 + 8 files changed, 76 insertions(+), 51 deletions(-) diff --git a/src/components/Practice/Footer.vue b/src/components/Practice/Footer.vue index 0bfade0c..982fcd15 100644 --- a/src/components/Practice/Footer.vue +++ b/src/components/Practice/Footer.vue @@ -3,14 +3,11 @@ import {$computed, $ref} from "vue/macros" import {onMounted, onUnmounted} from "vue" import {useBaseStore} from "@/stores/base.ts" -import Tooltip from "@/components/Tooltip.vue" import {usePracticeStore} from "@/stores/practice.ts"; -import {Icon} from "@iconify/vue"; import {useSettingStore} from "@/stores/setting.ts"; const practiceStore = usePracticeStore() const settingStore = useSettingStore() -const store = useBaseStore() function format(val: number, suffix: string = '', check: number = -1) { return val === check ? '-' : (val + suffix) diff --git a/src/components/Practice/PracticeWord/TypingWord.vue b/src/components/Practice/PracticeWord/TypingWord.vue index 907640f6..f7007b78 100644 --- a/src/components/Practice/PracticeWord/TypingWord.vue +++ b/src/components/Practice/PracticeWord/TypingWord.vue @@ -2,7 +2,15 @@ import {onMounted, onUnmounted, watch} from "vue" import {$computed, $ref} from "vue/macros" import {useBaseStore} from "@/stores/base.ts" -import {DefaultShortcutKeyMap, DictType, DisplayStatistics, ShortcutKey, ShortcutKeyMap, Word} from "../../../types"; +import { + DefaultDisplayStatistics, + DefaultShortcutKeyMap, + DictType, + DisplayStatistics, + ShortcutKey, + ShortcutKeyMap, + Word +} from "../../../types"; import {emitter, EventKey} from "@/utils/eventBus.ts" import {cloneDeep} from "lodash-es" import {usePracticeStore} from "@/stores/practice.ts" @@ -29,19 +37,11 @@ const props = withDefaults(defineProps(), { index: -1 }) -let data = $ref({ - index: props.index, - words: props.words, - wrongWords: [], - originWrongWords: [], -}) - -let typingRef: any = $ref() +const typingRef: any = $ref() const store = useBaseStore() const runtimeStore = useRuntimeStore() const practiceStore = usePracticeStore() const settingStore = useSettingStore() -const playWordAudio = usePlayWordAudio() const { isWordCollect, @@ -50,10 +50,17 @@ const { toggleWordSimple } = useWordOptions() +let data = $ref({ + index: props.index, + words: props.words, + wrongWords: [], +}) + +let stat = cloneDeep(DefaultDisplayStatistics) + watch(() => props.words, () => { data.words = props.words data.index = props.index - data.originWrongWords = [] data.wrongWords = [] practiceStore.wrongWords = [] @@ -62,6 +69,8 @@ watch(() => props.words, () => { practiceStore.correctRate = -1 practiceStore.inputWordNumber = 0 practiceStore.wrongWordNumber = 0 + stat = cloneDeep(DefaultDisplayStatistics) + }, {immediate: true}) watch(data, () => { @@ -88,13 +97,27 @@ const nextWord: Word = $computed(() => { function next(isTyping: boolean = true) { if (data.index === data.words.length - 1) { + + //复制当前错词,因为第一遍错词是最多的,后续的练习都是从错词中练习 + if (stat.total === -1) { + let now = Date.now() + stat = { + startDate: practiceStore.startDate, + endDate: now, + spend: now - practiceStore.startDate, + total: props.words.length, + correctRate: -1, + inputWordNumber: practiceStore.inputWordNumber, + wrongWordNumber: data.wrongWords.length, + wrongWords: data.wrongWords, + } + stat.correctRate = 100 - Math.trunc(((stat.wrongWordNumber) / (stat.total)) * 100) + } + if (data.wrongWords.length) { console.log('当前背完了,但还有错词') data.words = cloneDeep(data.wrongWords) - //如果原始错词没值就复制当前错词的,因为第一遍错词是最多的,后续的练习都是从错词中练习 - if (!data.originWrongWords.length) { - data.originWrongWords = cloneDeep(data.wrongWords) - } + practiceStore.total = data.words.length practiceStore.index = data.index = 0 practiceStore.inputWordNumber = 0 @@ -104,17 +127,11 @@ function next(isTyping: boolean = true) { } else { console.log('这章节完了') isTyping && practiceStore.inputWordNumber++ + let now = Date.now() - let stat: DisplayStatistics = { - startDate: practiceStore.startDate, - endDate: now, - spend: now - practiceStore.startDate, - total: props.words.length, - correctRate: -1, - wrongWordNumber: data.originWrongWords.length, - wrongWords: data.originWrongWords, - } - stat.correctRate = 100 - Math.trunc(((stat.wrongWordNumber) / (stat.total)) * 100) + stat.endDate = now + stat.spend = now - stat.startDate + emitter.emit(EventKey.openStatModal, stat) } } else { diff --git a/src/components/Practice/Statistics.vue b/src/components/Practice/Statistics.vue index bd5f62e8..dba939b2 100644 --- a/src/components/Practice/Statistics.vue +++ b/src/components/Practice/Statistics.vue @@ -21,9 +21,12 @@ let currentStat = reactive(cloneDeep(DefaultDisplayStatistics onMounted(() => { emitter.on(EventKey.openStatModal, (stat: DisplayStatistics) => { - currentStat = {...DefaultDisplayStatistics, ...stat} + if (stat) { + currentStat = {...DefaultDisplayStatistics, ...stat} + store.saveStatistics(stat) + console.log('stat', stat) + } statModalIsOpen = true - store.saveStatistics(stat) }) const close = () => { @@ -68,6 +71,11 @@ const isEnd = $computed(() => { desc="错误数" :percentage="0" /> + { .result { box-sizing: border-box; overflow: hidden; - height: 320rem; + height: 340rem; display: flex; flex-direction: column; border-radius: $card-radius; diff --git a/src/components/Ring.vue b/src/components/Ring.vue index 7e6749e6..a02570a0 100644 --- a/src/components/Ring.vue +++ b/src/components/Ring.vue @@ -2,19 +2,19 @@
@@ -46,11 +46,11 @@ onMounted(() => {