diff --git a/src/components/Footer.vue b/src/components/Footer.vue index 0a6cd627..e57d376f 100644 --- a/src/components/Footer.vue +++ b/src/components/Footer.vue @@ -14,7 +14,7 @@ function format(val: number, suffix: string = '') { const progress = $computed(() => { if (!store.chapter.length) return 0 - return ((store.current.index / store.current.words.length) * 100) + return ((store.current.index / store.current.statistics.wordNumber) * 100) }) let speedMinute = $ref(0) @@ -51,7 +51,7 @@ onUnmounted(() => {
时间
-
{{ store.current.words.length }}
+
{{ store.current.statistics.wordNumber }}
单词总数
diff --git a/src/components/Type.vue b/src/components/Type.vue index 613a6528..dc9dc8d9 100644 --- a/src/components/Type.vue +++ b/src/components/Type.vue @@ -13,7 +13,7 @@ import correct from '../assets/sound/correct.wav' import {$computed, $ref} from "vue/macros" import {useSound} from "@/hooks/useSound.ts" import {useBaseStore} from "@/stores/base.ts" -import {DictType, SaveKey, Word} from "../types"; +import {DictType, SaveKey, ShortKeyMap, Word} from "../types"; import {usePlayWordAudio} from "@/hooks/usePlayWordAudio.ts" import useTheme from "@/hooks/useTheme.ts"; import Tooltip from "@/components/Tooltip.vue"; @@ -38,12 +38,7 @@ const [playBeep] = useSound([beep], 1) const [playCorrect] = useSound([correct], 1) const [playAudio] = usePlayWordAudio() -const keyMap = { - Show: 'Escape', - Ignore: 'Tab', - Remove: '`', - Collect: 'Enter', -} + const resetWord = $computed(() => { return store.word.name.slice(input.length + wrong.length) @@ -139,7 +134,7 @@ async function onKeyDown(e: KeyboardEvent) { input = input.slice(0, -1) } break - case keyMap.Collect: + case ShortKeyMap.Collect: if (!store.newWordDict.originWords.find((v: Word) => v.name === store.word.name)) { store.newWordDict.originWords.push(store.word) store.newWordDict.words.push(store.word) @@ -147,7 +142,7 @@ async function onKeyDown(e: KeyboardEvent) { } activeIndex = 1 break - case keyMap.Remove: + case ShortKeyMap.Remove: if (!store.skipWordNames.includes(store.word.name)) { store.skipWordDict.originWords.push(store.word) store.skipWordDict.words.push(store.word) @@ -156,12 +151,12 @@ async function onKeyDown(e: KeyboardEvent) { activeIndex = 0 next() break - case keyMap.Ignore: + case ShortKeyMap.Ignore: e.preventDefault() activeIndex = 2 next() break - case keyMap.Show: + case ShortKeyMap.Show: showFullWord = true break } diff --git a/src/components/TypeArticle.vue b/src/components/TypeArticle.vue index aaf31d42..bae806cf 100644 --- a/src/components/TypeArticle.vue +++ b/src/components/TypeArticle.vue @@ -15,7 +15,9 @@ import beep from '../assets/sound/beep.wav' import correct from '../assets/sound/correct.wav' import {useSound} from "@/hooks/useSound.ts" import {CnKeyboardMap, useSplitArticle} from "@/hooks/useSplitArticle"; -import {$computed} from "vue/macros"; +import {$computed, $ref} from "vue/macros"; +import {DictType, SaveKey, ShortKeyMap, Word} from "@/types"; +import {useBaseStore} from "@/stores/base"; let article1 = `How does the older investor differ in his approach to investment from the younger investor? There is no shortage of tipsters around offering 'get-rich-quick' opportunities. But if you are a serious private investor, leave the Las Vegas mentality to those with money to fritter. The serious investor needs a proper 'portfolio' -- a well-planned selection of investments, with a definite structure and a clear aim. But exactly how does a newcomer to the stock market go about achieving that? @@ -52,6 +54,8 @@ const [playKeySound, setAudio] = useSound([老式机械], 3) const [playBeep] = useSound([beep], 1) const [playCorrect] = useSound([correct], 1) +const store = useBaseStore() + export interface Sentence { sentence: string, words: string[] @@ -65,6 +69,20 @@ export interface Article { }[], } +let sectionIndex = $ref(0) +let sentenceIndex = $ref(0) +let wordIndex = $ref(6) +let index = $ref(0) +let input = $ref('') +let wrong = $ref('') +let isSpace = $ref(false) +let isDictation = $ref(true) +let showFullWord = $ref(false) +let hoverIndex = $ref({ + sectionIndex: 0, + sentenceIndex: 0, +}) + let article = reactive
({ sections: [], translate: [] @@ -72,7 +90,33 @@ let article = reactive
({ onMounted(() => { let t1 = useSplitArticle(article1) + let wordNumber = 0 + t1.map(v => { + v.map(w => { + wordNumber += w.words.length + }) + }) console.log('t1', t1) + console.log('wordNumber', wordNumber) + + setTimeout(() => { + store.current = { + dictType: DictType.inner, + words: [], + index: wordIndex, + wrongWords: [], + originWrongWords: [], + repeatNumber: 0, + statistics: { + startDate: Date.now(), + endDate: -1, + spend: -1, + wordNumber: wordNumber, + correctRate: -1, + wrongWordNumber: -1, + } + } + }, 1000) let a = `上星期我去看戏。我的座位很好,戏很有意思,但我却无法欣赏。一青年男子与一青年女子坐在我的身后,大声地说着话。我非常生气,因为我听不见演员在说什么。我回过头去,怒视着那一男一女,他们却毫不理会。最后,我忍不住了,又一次回过头去,生气地说,“我一个字也听不见了!” “不关你的事,”那男的毫不客气地说,“这是私人间的谈话!”` let t = useSplitArticle(a, 'cn', CnKeyboardMap) @@ -130,21 +174,13 @@ function focus() { inputRef.focus() } -let sectionIndex = $ref(0) -let sentenceIndex = $ref(0) -let wordIndex = $ref(6) -let index = $ref(0) -let input = $ref('') -let wrong = $ref('') -let isSpace = $ref(false) -let isDictation = $ref(true) const currentIndex = computed(() => { return `${sectionIndex}${sentenceIndex}${wordIndex}` }) -function keyDown(e: KeyboardEvent) { - console.log('keyDown', e.key, e.code, e.keyCode) +function onKeyDown(e: KeyboardEvent) { + // console.log('keyDown', e.key, e.code, e.keyCode) wrong = '' @@ -157,6 +193,8 @@ function keyDown(e: KeyboardEvent) { isSpace = false index = 0 wordIndex++ + store.current.index++ + playCorrect() if (!currentSentence.words[wordIndex]) { wordIndex = 0 @@ -219,6 +257,22 @@ function keyDown(e: KeyboardEvent) { } } } else { + let word: Word = { + name: currentWord, + usphone: '', + ukphone: '', + trans: [] + } + if (!store.wrongWordDict.originWords.find((v: Word) => v.name === currentWord)) { + store.wrongWordDict.originWords.push(word) + store.wrongWordDict.words.push(word) + store.wrongWordDict.chapters = [store.wrongWordDict.words] + } + if (!store.current.wrongWords.find((v: Word) => v.name === currentWord)) { + store.current.wrongWords.push(word) + } + store.current.statistics.correctRate = Math.trunc(((store.current.index + 1 - store.current.wrongWords.length) / (store.current.index + 1)) * 100) + wrong = letter playBeep() setTimeout(() => { @@ -228,32 +282,75 @@ function keyDown(e: KeyboardEvent) { console.log('未匹配') } playKeySound() + } else { + switch (e.key) { + case 'Backspace': + if (wrong) { + wrong = '' + } else { + input = input.slice(0, -1) + } + break + case ShortKeyMap.Collect: + + break + case ShortKeyMap.Remove: + + break + case ShortKeyMap.Ignore: + + break + case ShortKeyMap.Show: + hoverIndex = { + sectionIndex: sectionIndex, + sentenceIndex: sentenceIndex, + } + break + } } } - console.log( - 'sectionIndex', sectionIndex, - 'sentenceIndex', sentenceIndex, - 'wordIndex', wordIndex, - 'index', index, - ) + // console.log( + // 'sectionIndex', sectionIndex, + // 'sentenceIndex', sentenceIndex, + // 'wordIndex', wordIndex, + // 'index', index, + // ) inputRef.value = '' e.preventDefault() } +function onKeyUp() { + hoverIndex = { + sectionIndex: -1, + sentenceIndex: -1, + } +} + + function playWord(word: string) { playAudio(word) } -function currentWordInput(word: string) { +function currentWordInput(word: string, i: number, i2: number,) { + let str = word.slice(input.length + wrong.length, input.length + wrong.length + 1) + + if (hoverIndex.sectionIndex === i && hoverIndex.sentenceIndex === i2) { + return str + } + if (isDictation) { return ' ' } - return word.slice(input.length + wrong.length, input.length + wrong.length + 1) + return str } -function currentWordEnd(word: string) { +function currentWordEnd(word: string, i: number, i2: number,) { let str = word.slice(input.length + wrong.length + 1) + if (hoverIndex.sectionIndex === i && hoverIndex.sentenceIndex === i2) { + return str + } + if (isDictation) { return str.split('').map(v => '_').join('') } @@ -263,6 +360,10 @@ function currentWordEnd(word: string) { function otherWord(word: string, i: number, i2: number, i3: number) { let str = word + if (hoverIndex.sectionIndex === i && hoverIndex.sentenceIndex === i2) { + return str + } + //剩100是因为,可能存在特殊情况,比如003,010这种,0 12 24,100 if (sectionIndex * 10000 + sentenceIndex * 100 + wordIndex < i * 10000 + i2 * 100 + i3 && isDictation @@ -287,6 +388,8 @@ function otherWord(word: string, i: number, i2: number, i3: number) { :class="[ sectionIndex === indexI && sentenceIndex === indexJ ?'isDictation':'' ]" + @mouseenter="hoverIndex = {sectionIndex : indexI,sentenceIndex :indexJ}" + @mouseleave="hoverIndex = {sectionIndex : -1,sentenceIndex :-1}" @click="playAudio(sentence.sentence)" v-for="(sentence,indexJ) in section"> {{ input }} {{ wrong }} - {{ currentWordInput(word) }} - {{ currentWordEnd(word) }} + {{ currentWordInput(word, indexI, indexJ) }} + {{ currentWordEnd(word, indexI, indexJ,) }} {{ otherWord(word, indexI, indexJ, indexW) }} + @keyup="onKeyUp" + @keydown="onKeyDown"> diff --git a/src/types.ts b/src/types.ts index 1e0b99ec..274eb007 100644 --- a/src/types.ts +++ b/src/types.ts @@ -148,3 +148,10 @@ export interface State { value4: boolean, } } + +export const ShortKeyMap = { + Show: 'Escape', + Ignore: 'Tab', + Remove: '`', + Collect: 'Enter', +} \ No newline at end of file