From dc51b0904da03dbfec530761bd6b8c0259fc46ff Mon Sep 17 00:00:00 2001 From: Zyronon Date: Wed, 10 Dec 2025 00:53:26 +0800 Subject: [PATCH] feat:new option: the review ratio can be adjusted --- src/assets/css/style.scss | 2 +- src/components/SettingDialog.vue | 6 ++ src/hooks/dict.ts | 81 ++++++++++--------- .../word/components/PracticeSettingDialog.vue | 72 +++++++++++------ src/stores/setting.ts | 2 + 5 files changed, 99 insertions(+), 64 deletions(-) diff --git a/src/assets/css/style.scss b/src/assets/css/style.scss index f591b53f..9e56e804 100644 --- a/src/assets/css/style.scss +++ b/src/assets/css/style.scss @@ -14,7 +14,7 @@ --color-tooltip-bg: white; --color-tooltip-shadow: #d9d9d9; --color-font-2: rgb(46, 46, 46); - --color-font-3: rgb(75, 85, 99); + --color-font-3: rgb(102, 116, 135); --color-font-active-1: white; --color-scrollbar: #c1c1c1; diff --git a/src/components/SettingDialog.vue b/src/components/SettingDialog.vue index 7f23d95d..ad5c7b0e 100644 --- a/src/components/SettingDialog.vue +++ b/src/components/SettingDialog.vue @@ -169,6 +169,7 @@ const simpleWords = $computed({ + 1 @@ -187,6 +188,11 @@ const simpleWords = $computed({ + + + diff --git a/src/hooks/dict.ts b/src/hooks/dict.ts index 541fb915..1989ff1e 100644 --- a/src/hooks/dict.ts +++ b/src/hooks/dict.ts @@ -87,13 +87,13 @@ export function useArticleOptions() { export function getCurrentStudyWord(): TaskWords { const store = useBaseStore() - let data = {new: [], review: [], write: [], shuffle: []} + let data = { new: [], review: [], write: [], shuffle: [] } let dict = store.sdict; let isTest = false let words = dict.words.slice() if (isTest) { - words = Array.from({length: 10}).map((v, i) => { - return getDefaultWord({word: String(i)}) + words = Array.from({ length: 10 }).map((v, i) => { + return getDefaultWord({ word: String(i) }) }) } if (words?.length) { @@ -119,7 +119,6 @@ export function getCurrentStudyWord(): TaskWords { } end++ } - } else { //从start往后取perDay个单词,作为当前练习单词 for (let item of list) { @@ -131,15 +130,17 @@ export function getCurrentStudyWord(): TaskWords { end++ } - //从start往前取perDay个单词,作为当前复习单词,取到0为止 - list = dict.words.slice(0, start).reverse() - for (let item of list) { - if (!ignoreList.includes(item.word.toLowerCase())) { - if (data.review.length < perDay) { - data.review.push(item) - } else break + if (settingStore.wordReviewRatio >= 1) { + //从start往前取perDay个单词,作为当前复习单词,取到0为止 + list = dict.words.slice(0, start).reverse() + for (let item of list) { + if (!ignoreList.includes(item.word.toLowerCase())) { + if (data.review.length < perDay) { + data.review.push(item) + } else break + } + start-- } - start-- } } @@ -152,35 +153,37 @@ export function getCurrentStudyWord(): TaskWords { // 上上次更早的单词 //默认只取start之前的单词 - let candidateWords = dict.words.slice(0, start).reverse() - //但如果已完成,则滚动取值 - if (complete) candidateWords = candidateWords.concat(dict.words.slice(end).reverse()) - candidateWords = candidateWords.filter(w => !ignoreList.includes(w.word.toLowerCase())); - // console.log(candidateWords.map(v => v.word)) - //最终要获取的单词数量 - const totalNeed = perDay * 3; - if (candidateWords.length <= totalNeed) { - data.write = candidateWords - } else { - //write数组放的是上上次之前的单词,总的数量为perDayStudyNumber * 3,取单词的规则为:从后往前取6个perDayStudyNumber的,越靠前的取的单词越多。 - let days = 6 - // 分6组,每组最多 perDay 个 - const groups: Word[][] = splitIntoN(candidateWords.slice(0, days * perDay), 6) - // console.log('groups', groups) + if (settingStore.wordReviewRatio >= 2) { + let candidateWords = dict.words.slice(0, start).reverse() + //但如果已完成,则滚动取值 + if (complete) candidateWords = candidateWords.concat(dict.words.slice(end).reverse()) + candidateWords = candidateWords.filter(w => !ignoreList.includes(w.word.toLowerCase())); + // console.log(candidateWords.map(v => v.word)) + //最终要获取的单词数量 + const totalNeed = perDay * (settingStore.wordReviewRatio - 1); + if (candidateWords.length <= totalNeed) { + data.write = candidateWords + } else { + //write数组放的是上上次之前的单词,总的数量为perDayStudyNumber * 3,取单词的规则为:从后往前取6个perDayStudyNumber的,越靠前的取的单词越多。 + let days = 6 + // 分6组,每组最多 perDay 个 + const groups: Word[][] = splitIntoN(candidateWords.slice(0, days * perDay), 6) + // console.log('groups', groups) - // 分配数量,靠前组多,靠后组少,例如分配比例 [6,5,4,3,2,1] - const ratio = Array.from({length: days}, (_, i) => i + 1).reverse(); - const ratioSum = ratio.reduce((a, b) => a + b, 0); - const realRatio = ratio.map(r => Math.round(r / ratioSum * totalNeed)); - // console.log(ratio, ratioSum, realRatio, realRatio.reduce((a, b) => a + b, 0)) + // 分配数量,靠前组多,靠后组少,例如分配比例 [6,5,4,3,2,1] + const ratio = Array.from({ length: days }, (_, i) => i + 1).reverse(); + const ratioSum = ratio.reduce((a, b) => a + b, 0); + const realRatio = ratio.map(r => Math.round(r / ratioSum * totalNeed)); + // console.log(ratio, ratioSum, realRatio, realRatio.reduce((a, b) => a + b, 0)) - // 按比例从每组随机取单词 - let writeWords: Word[] = []; - groups.map((v, i) => { - writeWords = writeWords.concat(getRandomN(v, realRatio[i])) - }) - // console.log('writeWords', writeWords) - data.write = writeWords; + // 按比例从每组随机取单词 + let writeWords: Word[] = []; + groups.map((v, i) => { + writeWords = writeWords.concat(getRandomN(v, realRatio[i])) + }) + // console.log('writeWords', writeWords) + data.write = writeWords; + } } } // console.log('data-new', data.new.map(v => v.word)) diff --git a/src/pages/word/components/PracticeSettingDialog.vue b/src/pages/word/components/PracticeSettingDialog.vue index f0968d4e..b43ae319 100644 --- a/src/pages/word/components/PracticeSettingDialog.vue +++ b/src/pages/word/components/PracticeSettingDialog.vue @@ -1,16 +1,17 @@