From af99db67cb01302984c28ef7ee8569825ed7c57e Mon Sep 17 00:00:00 2001 From: taiyi Date: Mon, 27 Apr 2026 12:37:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A1=AB=E7=A9=BA=E5=A4=8D?= =?UTF-8?q?=E4=B9=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- review-config/review-config.js | 10 ++-- review-result/review-result.js | 20 ++++++++ review-result/review-result.wxml | 17 +++++++ review-result/review-result.wxss | 2 +- review-session/review-session.js | 75 +++++++++++++++++++++++++----- review-session/review-session.wxml | 26 +++++++++-- review-session/review-session.wxss | 2 +- settings/settings.js | 23 +++++++++ settings/settings.wxml | 8 ++++ 9 files changed, 161 insertions(+), 22 deletions(-) diff --git a/review-config/review-config.js b/review-config/review-config.js index 3ce1d7a..781b6b2 100644 --- a/review-config/review-config.js +++ b/review-config/review-config.js @@ -10,6 +10,7 @@ Page({ activeMode: 0, onlyReview: true, shuffle: false, + reviewOrder: 'sequential', questionCount: 30, loading: false, error: '', @@ -21,7 +22,8 @@ Page({ activeContentType: plan.contentTypeIndex, activeMode: plan.modeIndex, onlyReview: plan.onlyReview, - shuffle: plan.shuffle, + shuffle: plan.reviewOrder === 'shuffle' || plan.shuffle, + reviewOrder: plan.reviewOrder || (plan.shuffle ? 'shuffle' : 'sequential'), questionCount: plan.questionCount, }) }, @@ -50,8 +52,8 @@ Page({ }, toggleShuffle() { const shuffle = !this.data.shuffle - this.setData({ shuffle }) - this.persistPatch({ shuffle }) + this.setData({ shuffle, reviewOrder: shuffle ? 'shuffle' : 'sequential' }) + this.persistPatch({ shuffle, reviewOrder: shuffle ? 'shuffle' : 'sequential' }) }, onQuestionCountInput(e) { const questionCount = Number(e.detail.value || 0) @@ -77,7 +79,7 @@ Page({ content_type, question_mode, review_strategy: this.data.onlyReview ? 'review_only' : 'all', - sort_mode: this.data.shuffle ? 'shuffle' : 'sequential', + sort_mode: this.data.reviewOrder === 'shuffle' ? 'shuffle' : 'sequential', total_count: this.data.questionCount, }, success: (res) => { diff --git a/review-result/review-result.js b/review-result/review-result.js index c3ad070..d72a6a6 100644 --- a/review-result/review-result.js +++ b/review-result/review-result.js @@ -11,6 +11,7 @@ Page({ regressed: 0, loading: false, error: '', + clozeResults: [], }, onLoad() { this.loadResult() @@ -36,6 +37,24 @@ Page({ const correct = Number(data.correct || 0) const wrong = Number(data.wrong || Math.max(0, total - correct)) const accuracy = total ? Math.round((correct / total) * 100) : 0 + const clozeResults = Array.isArray(data.cloze_results) + ? data.cloze_results.map((item) => ({ + record_id: item.record_id, + entry_id: item.entry_id, + question_mode: item.question_mode, + user_answer: item.user_answer || '', + prompt_text: item.cloze_question?.prompt_text || '', + blanks: Array.isArray(item.blanks) + ? item.blanks.map((blank) => ({ + index: blank.index, + user_answer: blank.user_answer || '', + correct_answers: Array.isArray(blank.correct_answers) ? blank.correct_answers : [], + is_correct: !!blank.is_correct, + })) + : [], + is_correct: !!item.blanks?.every?.((blank) => blank.is_correct), + })) + : [] this.setData({ total, accuracy, @@ -44,6 +63,7 @@ Page({ improved: Number(data.improved ?? 0), regressed: Number(data.regressed ?? 0), timeUsed: data.time_used || '--:--', + clozeResults, }) }, fail: () => this.setData({ error: '结果加载失败' }), diff --git a/review-result/review-result.wxml b/review-result/review-result.wxml index 646a373..3a8e7be 100644 --- a/review-result/review-result.wxml +++ b/review-result/review-result.wxml @@ -65,6 +65,23 @@ + + 填空逐空反馈 + + + 题目 {{itemIndex + 1}} + {{item.is_correct ? '正确' : '错误'}} + + {{item.prompt_text}} + + + 空 {{blankIndex + 1}}:{{blank.user_answer || '(空)'}} + 答案:{{blank.correct_answers.join(' / ') || '—'}} + + + + + diff --git a/review-result/review-result.wxss b/review-result/review-result.wxss index 826a5bf..4137ac1 100644 --- a/review-result/review-result.wxss +++ b/review-result/review-result.wxss @@ -1 +1 @@ -page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;padding:48rpx 32rpx 60rpx;box-sizing:border-box;background:#0c0e12;position:relative;overflow:hidden}.bg-orb{position:absolute;border-radius:9999rpx;pointer-events:none;filter:blur(120rpx);opacity:.2;z-index:0}.orb1{top:18%;left:50%;width:520rpx;height:520rpx;transform:translate(-50%,-50%);background:#ff6c95}.orb2{bottom:18%;left:50%;width:380rpx;height:380rpx;transform:translate(-50%,50%);background:#00e5ff}.hero,.grid,.actions{position:relative;z-index:1}.hero{display:flex;flex-direction:column;align-items:center;gap:22rpx;margin:26rpx 0 44rpx}.badge{width:144rpx;height:144rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.06);box-shadow:0 0 30rpx rgba(255,108,149,.2)}.badge-inner{width:100%;height:100%;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,rgba(255,108,149,.2),rgba(0,229,255,.2));font-size:56rpx}.headline{display:block;font-size:54rpx;font-weight:800;text-align:center}.subtitle{display:block;margin-top:8rpx;color:#00e5ff;letter-spacing:4rpx;text-transform:uppercase;text-align:center}.grid{display:grid;grid-template-columns:1fr 1fr;gap:18rpx}.hero-card{grid-column:1/-1;background:rgba(29,32,37,.7);backdrop-filter:blur(20rpx);border:1rpx solid rgba(255,255,255,.1);border-radius:28rpx;padding:32rpx;box-sizing:border-box;box-shadow:0 20rpx 40rpx rgba(0,0,0,.4);position:relative;overflow:hidden}.hero-card:after{content:'';position:absolute;top:-40rpx;right:-40rpx;width:160rpx;height:160rpx;border-radius:9999rpx;background:rgba(193,156,255,.1);filter:blur(48rpx)}.hero-card-head{display:flex;justify-content:space-between;align-items:center;position:relative;z-index:1}.metric-label{display:block;color:#aaabb0;font-size:20rpx;letter-spacing:4rpx;text-transform:uppercase}.metric-row{display:flex;align-items:baseline;gap:10rpx}.metric-big{font-size:88rpx;font-weight:800;color:#fff;line-height:1}.metric-unit{font-size:32rpx;color:#aaabb0;font-weight:700}.ring{width:124rpx;height:124rpx;border-radius:9999rpx;border:4rpx solid #23262c;display:flex;align-items:center;justify-content:center;color:#c19cff;font-size:52rpx;position:relative}.mini-card{background:rgba(29,32,37,.7);backdrop-filter:blur(20rpx);border:1rpx solid rgba(255,255,255,.1);border-radius:28rpx;padding:24rpx;box-sizing:border-box;box-shadow:0 20rpx 40rpx rgba(0,0,0,.4);display:flex;flex-direction:column;gap:18rpx}.mini-head{display:flex;align-items:center;gap:14rpx}.mini-ico{width:56rpx;height:56rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;font-size:28rpx}.mini-label{color:#aaabb0;font-size:20rpx;letter-spacing:4rpx;text-transform:uppercase}.mini-value{font-size:36rpx;font-weight:800}.breakdown{grid-column:1/-1;display:grid;grid-template-columns:1fr 1fr;gap:0;border-radius:28rpx;overflow:hidden;border:1rpx solid rgba(255,255,255,.1)}.break-item{background:#1d2025;padding:30rpx;text-align:center}.break-num{display:block;font-size:54rpx;font-weight:800}.cyan{color:#00e5ff}.pink{color:#ff6c95}.break-label{display:block;margin-top:10rpx;color:#aaabb0;font-size:24rpx}.achievement{grid-column:1/-1;display:flex;align-items:center;gap:22rpx;padding:26rpx 24rpx;border-radius:28rpx;background:linear-gradient(90deg,#1d2025,#171a1f);border:1rpx solid rgba(255,255,255,.08);box-shadow:0 20rpx 40rpx rgba(0,0,0,.4)}.ach-ico{width:96rpx;height:96rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#ff6c95,#00e5ff);font-size:44rpx;flex-shrink:0}.ach-sub{display:block;color:#ff6c95;font-size:20rpx;letter-spacing:4rpx;text-transform:uppercase;font-weight:700}.ach-title{display:block;margin-top:6rpx;font-size:32rpx;font-weight:700}.actions{display:flex;gap:18rpx;margin-top:28rpx;position:relative;z-index:1}.primary-btn,.secondary-btn{flex:1;border-radius:9999rpx;padding:24rpx 0;font-weight:800}.primary-btn{background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff}.secondary-btn{background:#23262c;color:#f6f6fc} +page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;padding:48rpx 32rpx 60rpx;box-sizing:border-box;background:#0c0e12;position:relative;overflow:hidden}.bg-orb{position:absolute;border-radius:9999rpx;pointer-events:none;filter:blur(120rpx);opacity:.2;z-index:0}.orb1{top:18%;left:50%;width:520rpx;height:520rpx;transform:translate(-50%,-50%);background:#ff6c95}.orb2{bottom:18%;left:50%;width:380rpx;height:380rpx;transform:translate(-50%,50%);background:#00e5ff}.hero,.grid,.actions{position:relative;z-index:1}.hero{display:flex;flex-direction:column;align-items:center;gap:22rpx;margin:26rpx 0 44rpx}.badge{width:144rpx;height:144rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.06);box-shadow:0 0 30rpx rgba(255,108,149,.2)}.badge-inner{width:100%;height:100%;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,rgba(255,108,149,.2),rgba(0,229,255,.2));font-size:56rpx}.headline{display:block;font-size:54rpx;font-weight:800;text-align:center}.subtitle{display:block;margin-top:8rpx;color:#00e5ff;letter-spacing:4rpx;text-transform:uppercase;text-align:center}.grid{display:grid;grid-template-columns:1fr 1fr;gap:18rpx}.hero-card{grid-column:1/-1;background:rgba(29,32,37,.7);backdrop-filter:blur(20rpx);border:1rpx solid rgba(255,255,255,.1);border-radius:28rpx;padding:32rpx;box-sizing:border-box;box-shadow:0 20rpx 40rpx rgba(0,0,0,.4);position:relative;overflow:hidden}.hero-card:after{content:'';position:absolute;top:-40rpx;right:-40rpx;width:160rpx;height:160rpx;border-radius:9999rpx;background:rgba(193,156,255,.1);filter:blur(48rpx)}.hero-card-head{display:flex;justify-content:space-between;align-items:center;position:relative;z-index:1}.metric-label{display:block;color:#aaabb0;font-size:20rpx;letter-spacing:4rpx;text-transform:uppercase}.metric-row{display:flex;align-items:baseline;gap:10rpx}.metric-big{font-size:88rpx;font-weight:800;color:#fff;line-height:1}.metric-unit{font-size:32rpx;color:#aaabb0;font-weight:700}.ring{width:124rpx;height:124rpx;border-radius:9999rpx;border:4rpx solid #23262c;display:flex;align-items:center;justify-content:center;color:#c19cff;font-size:52rpx;position:relative}.mini-card{background:rgba(29,32,37,.7);backdrop-filter:blur(20rpx);border:1rpx solid rgba(255,255,255,.1);border-radius:28rpx;padding:24rpx;box-sizing:border-box;box-shadow:0 20rpx 40rpx rgba(0,0,0,.4);display:flex;flex-direction:column;gap:18rpx}.mini-head{display:flex;align-items:center;gap:14rpx}.mini-ico{width:56rpx;height:56rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;font-size:28rpx}.mini-label{color:#aaabb0;font-size:20rpx;letter-spacing:4rpx;text-transform:uppercase}.mini-value{font-size:36rpx;font-weight:800}.breakdown{grid-column:1/-1;display:grid;grid-template-columns:1fr 1fr;gap:0;border-radius:28rpx;overflow:hidden;border:1rpx solid rgba(255,255,255,.1)}.break-item{background:#1d2025;padding:30rpx;text-align:center}.break-num{display:block;font-size:54rpx;font-weight:800}.cyan{color:#00e5ff}.pink{color:#ff6c95}.break-label{display:block;margin-top:10rpx;color:#aaabb0;font-size:24rpx}.cloze-panel{grid-column:1/-1;margin-top:8rpx;padding:28rpx;border-radius:28rpx;background:rgba(29,32,37,.7);border:1rpx solid rgba(255,255,255,.1);box-shadow:0 20rpx 40rpx rgba(0,0,0,.28)}.panel-title{display:block;font-size:28rpx;font-weight:800;margin-bottom:18rpx;color:#f6f6fc}.cloze-result-card{padding:22rpx 20rpx;border-radius:22rpx;background:rgba(255,255,255,.04);border:1rpx solid rgba(255,255,255,.06);margin-bottom:16rpx}.cloze-result-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:12rpx}.cloze-result-index{font-size:24rpx;color:#aaabb0}.cloze-result-status{font-size:22rpx;font-weight:700;padding:8rpx 16rpx;border-radius:9999rpx}.cloze-result-status.ok{background:rgba(0,229,255,.12);color:#00e5ff}.cloze-result-status.bad{background:rgba(255,108,149,.12);color:#ff6c95}.cloze-result-prompt{margin-bottom:14rpx;color:#d8c7ff;font-size:24rpx;line-height:1.6}.cloze-result-body{display:flex;flex-direction:column;gap:10rpx}.cloze-blank-line{display:flex;flex-direction:column;gap:6rpx;padding:14rpx 14rpx;border-radius:16rpx;background:rgba(255,255,255,.03)}.cloze-result-answer{font-size:24rpx;line-height:1.6;color:#e8e9ee}.actions{display:flex;gap:18rpx;margin-top:28rpx;position:relative;z-index:1}.primary-btn,.secondary-btn{flex:1;border-radius:9999rpx;padding:24rpx 0;font-weight:800}.primary-btn{background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff}.secondary-btn{background:#23262c;color:#f6f6fc} diff --git a/review-session/review-session.js b/review-session/review-session.js index 0604d66..729b1a2 100644 --- a/review-session/review-session.js +++ b/review-session/review-session.js @@ -18,6 +18,8 @@ Page({ word: '', meaning: '', answer: '', + answers: [], + clozeAnswers: [], feedback: '', revealAnswer: '', feedbackType: '', @@ -28,6 +30,12 @@ Page({ loading: false, error: '', settings: getReviewSettings(), + questionBadge: '', + entryTypeHint: '', + isCloze: false, + currentClozeQuestion: null, + currentClozeResults: [], + showClozeFeedback: false, }, submitting: false, judged: false, @@ -68,7 +76,8 @@ Page({ if (item.question_mode === 'C') { return { ...item, - blank_prompt: item.blank_prompt || item.prompt, + blank_prompt: item.blank_prompt || item.cloze_question?.prompt_text || item.prompt, + cloze_question: item.cloze_question || null, } } return { @@ -83,6 +92,7 @@ Page({ wrongCount: 0, completed: false, currentAnswer: '', + currentAnswers: [], startedAt: Date.now(), } this.setData({ questions }) @@ -96,25 +106,50 @@ Page({ const session = app.globalData.reviewSession const current = session.deck[session.currentIndex] const total = session.deck.length || 1 + const isCloze = current?.question_mode === 'C' + const clozeQuestion = isCloze ? (current?.cloze_question || null) : null this.setData({ progress: Math.round((session.currentIndex / total) * 100), current: session.currentIndex + 1, total, - word: current?.question_mode === 'C' ? (current?.blank_prompt || current?.prompt || '') : (current?.prompt || ''), - meaning: current?.question_mode === 'C' ? (current?.answer_hint || '') : '', + word: isCloze ? (current?.blank_prompt || clozeQuestion?.prompt_text || current?.prompt || '') : (current?.prompt || ''), + meaning: isCloze ? (current?.answer_hint || '') : '', answer: session.currentAnswer || '', + clozeAnswers: isCloze ? (session.currentAnswers || []) : [], feedback: '', revealAnswer: '', feedbackType: '', showFeedback: false, completed: session.completed, masterHint: false, + questionBadge: isCloze ? `填空 · ${current?.entry_type === 'sentence' ? '句子' : '单词'}` : `${current?.entry_type === 'sentence' ? '句子' : '单词'} · ${current?.question_mode || 'A'}`, + entryTypeHint: isCloze ? '请逐空作答,提交后会显示每个空的结果。' : (current?.entry_type === 'sentence' ? '当前题目来自句子库,注意上下文表达。' : ''), + isCloze, + currentClozeQuestion: clozeQuestion, + currentClozeResults: session.lastClozeResults || [], + showClozeFeedback: false, }) }, onAnswerInput(e) { const answer = e.detail.value app.globalData.reviewSession.currentAnswer = answer - this.setData({ answer, showFeedback: false, revealAnswer: '', feedback: '', feedbackType: '', judged: false }) + this.setData({ answer, showFeedback: false, revealAnswer: '', feedback: '', feedbackType: '', judged: false, showClozeFeedback: false }) + }, + onClozeAnswerInput(e) { + const { index } = e.currentTarget.dataset + const value = e.detail.value + const answers = [...(app.globalData.reviewSession.currentAnswers || [])] + answers[index] = value + app.globalData.reviewSession.currentAnswers = answers + this.setData({ + [`clozeAnswers[${index}]`]: value, + showFeedback: false, + revealAnswer: '', + feedback: '', + feedbackType: '', + judged: false, + showClozeFeedback: false, + }) }, submitAnswer(showExplanation = false, advanceAfterSubmit = false) { const session = app.globalData.reviewSession @@ -122,7 +157,21 @@ Page({ if (!current || this.submitting || this.judged) return const answer = (this.data.answer || '').trim() - if (!answer) { + const clozeQuestion = current.cloze_question + const payload = { + session_id: app.globalData.reviewSessionMeta.id, + record_id: current.record_id, + user_answer: answer, + } + if (current.question_mode === 'C' && clozeQuestion?.blanks?.length) { + const answers = (this.data.clozeAnswers || []).map((item) => (item || '').trim()) + while (answers.length < clozeQuestion.blanks.length) answers.push('') + if (!answers.some((item) => item)) { + wx.showToast({ title: '请先输入答案', icon: 'none' }) + return + } + payload.user_answers = answers + } else if (!answer) { wx.showToast({ title: '请先输入答案', icon: 'none' }) return } @@ -132,22 +181,26 @@ Page({ url: `${app.globalData.baseUrl}/api/v1/review/submit`, method: 'POST', header: { 'Content-Type': 'application/json', 'X-OpenID': app.globalData.openid || '' }, - data: { - session_id: app.globalData.reviewSessionMeta.id, - record_id: current.record_id, - user_answer: answer, - }, + data: payload, success: (res) => { const result = res.data?.data || {} session.correctCount += result.is_correct ? 1 : 0 session.wrongCount += result.is_correct ? 0 : 1 this.judged = true const shouldShowAnswer = showExplanation || this.data.settings.showAnswerAfterSubmit + const correctAnswerText = result.correct_answer_text || '' + const clozeResults = Array.isArray(result.cloze_results) ? result.cloze_results : [] + if (clozeResults.length) { + session.lastClozeResults = clozeResults + app.globalData.reviewSession.lastClozeResults = clozeResults + } this.setData({ feedback: result.is_correct ? '回答正确' : '回答错误', feedbackType: result.is_correct ? 'correct' : 'wrong', - revealAnswer: shouldShowAnswer ? `正确答案:${result.correct_answer}` : '', + revealAnswer: shouldShowAnswer && correctAnswerText ? `正确答案:${correctAnswerText}` : '', showFeedback: true, + showClozeFeedback: clozeResults.length > 0, + currentClozeResults: clozeResults, }) if (this.data.settings.autoNextQuestion || advanceAfterSubmit) { setTimeout(() => this.nextQuestion(), shouldShowAnswer ? 1200 : 0) diff --git a/review-session/review-session.wxml b/review-session/review-session.wxml index 02ddfeb..b2a7e9d 100644 --- a/review-session/review-session.wxml +++ b/review-session/review-session.wxml @@ -16,26 +16,42 @@ - {{questions[current-1].entry_type === 'sentence' ? '句子' : '单词'}} · {{questions[current-1].question_mode || 'C'}} + {{questionBadge}} {{meaning}} - - {{questions[current-1].blank_prompt || word}} + + {{word}} + + + 空 {{blankIndex + 1}} + 提示:首字母 {{blank.hint.first_letter}} · 长度 {{blank.hint.length}} + + + {{word}} - 当前题目来自句子库,注意上下文表达。 + {{entryTypeHint}} - + diff --git a/review-session/review-session.wxss b/review-session/review-session.wxss index 49efde0..98c4827 100644 --- a/review-session/review-session.wxss +++ b/review-session/review-session.wxss @@ -1 +1 @@ -page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12}.topbar{display:flex;justify-content:space-between;align-items:center;padding:24rpx 32rpx;background:rgba(12,14,18,.8);border-bottom:1rpx solid rgba(255,255,255,.08);backdrop-filter:blur(24px);box-shadow:0 1rpx 20rpx rgba(0,0,0,.08)}.topbar-left{display:flex;align-items:center;gap:18rpx}.avatar-shell{width:80rpx;height:80rpx;border-radius:9999rpx;overflow:hidden;border:2rpx solid rgba(193,156,255,.2);flex-shrink:0}.avatar-img{width:100%;height:100%}.brand-text{font-size:38rpx;font-weight:800;color:#c19cff}.topbar-icon{width:72rpx;height:72rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center}.content{height:calc(100vh - 120rpx);padding:32rpx;box-sizing:border-box}.progress-box{margin-bottom:28rpx}.progress-head{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:16rpx}.progress-label{font-size:24rpx;color:#aaabb0}.progress-count{font-size:28rpx;font-weight:700;color:#00e3fd}.progress-total{color:#aaabb0;font-size:22rpx;font-weight:400}.progress-bar{height:12rpx;background:#23262c;border-radius:9999rpx;overflow:hidden}.ghost-border{border:1rpx solid rgba(255,255,255,.1)}.progress-fill{height:100%;background:linear-gradient(90deg,#c19cff,#00e3fd)}.glass-card{background:rgba(29,32,37,.4);backdrop-filter:blur(24rpx)}.question-card{position:relative;overflow:hidden;border-radius:32rpx;padding:40rpx 32rpx;text-align:center;box-shadow:0 20rpx 40rpx rgba(0,0,0,.4);border:1rpx solid rgba(255,255,255,.1)}.ambient-glow{position:absolute;inset:0;background:linear-gradient(to bottom,rgba(193,156,255,.05),transparent);pointer-events:none}.mode-tag-wrap{display:flex;justify-content:center;margin-bottom:20rpx}.mode-tag{display:inline-flex;align-items:center;gap:10rpx;padding:10rpx 22rpx;border-radius:9999rpx;background:rgba(193,156,255,.12);border:1rpx solid rgba(193,156,255,.18);color:#d8c7ff;font-size:22rpx;letter-spacing:2rpx}.meaning-wrap{margin-bottom:28rpx}.meaning{display:block;color:#aaabb0;font-size:26rpx;letter-spacing:2rpx}.cloze-wrap,.word-wrap{margin:14rpx 0 10rpx}.cloze,.word{display:block;font-size:58rpx;font-weight:800;letter-spacing:2rpx;line-height:1.25}.cloze{color:#f6f6fc}.word{color:#f6f6fc}.entry-type-hint{margin-top:14rpx;color:#8f9198;font-size:22rpx;line-height:1.6}.gap{color:#9146ff;opacity:.5}.input-shell{margin:26rpx auto 0;max-width:520rpx;background:rgba(255,255,255,.04);border:1rpx solid rgba(255,255,255,.08);border-radius:9999rpx}.answer{padding:22rpx 28rpx;text-align:center;color:#f6f6fc;font-size:32rpx;caret-color:#c19cff}.answer::placeholder{color:rgba(170,171,176,.72)}.answer::-webkit-input-placeholder{color:rgba(170,171,176,.72)}.answer::-moz-placeholder{color:rgba(170,171,176,.72)}.answer:-ms-input-placeholder{color:rgba(170,171,176,.72)}.feedback-box{margin-top:22rpx;padding:20rpx 24rpx;border-radius:24rpx;background:rgba(255,255,255,.04);border:1rpx solid rgba(255,255,255,.06)}.feedback{display:block;color:#00e3fd}.reveal-answer{display:block;margin-top:10rpx;color:#f6f6fc;font-weight:700}.actions-cluster{display:flex;flex-direction:row;gap:18rpx;justify-content:center;align-items:center;margin-top:24rpx}.secondary-btn,.primary-btn{flex:1;border-radius:9999rpx;padding:24rpx 0;font-weight:700}.secondary-btn{background:#23262c;color:#f6f6fc}.primary-btn{background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff}.master-action{margin-top:34rpx;text-align:center}.master-text{color:#aaabb0;font-size:22rpx;border-bottom:1rpx solid transparent}.master-text.active{color:#00e3fd;border-color:#00e3fd} +page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12}.topbar{display:flex;justify-content:space-between;align-items:center;padding:24rpx 32rpx;background:rgba(12,14,18,.8);border-bottom:1rpx solid rgba(255,255,255,.08);backdrop-filter:blur(24px);box-shadow:0 1rpx 20rpx rgba(0,0,0,.08)}.topbar-left{display:flex;align-items:center;gap:18rpx}.avatar-shell{width:80rpx;height:80rpx;border-radius:9999rpx;overflow:hidden;border:2rpx solid rgba(193,156,255,.2);flex-shrink:0}.avatar-img{width:100%;height:100%}.brand-text{font-size:38rpx;font-weight:800;color:#c19cff}.topbar-icon{width:72rpx;height:72rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center}.content{height:calc(100vh - 120rpx);padding:32rpx;box-sizing:border-box}.progress-box{margin-bottom:28rpx}.progress-head{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:16rpx}.progress-label{font-size:24rpx;color:#aaabb0}.progress-count{font-size:28rpx;font-weight:700;color:#00e3fd}.progress-total{color:#aaabb0;font-size:22rpx;font-weight:400}.progress-bar{height:12rpx;background:#23262c;border-radius:9999rpx;overflow:hidden}.ghost-border{border:1rpx solid rgba(255,255,255,.1)}.progress-fill{height:100%;background:linear-gradient(90deg,#c19cff,#00e3fd)}.glass-card{background:rgba(29,32,37,.4);backdrop-filter:blur(24rpx)}.question-card{position:relative;overflow:hidden;border-radius:32rpx;padding:40rpx 32rpx;text-align:center;box-shadow:0 20rpx 40rpx rgba(0,0,0,.4);border:1rpx solid rgba(255,255,255,.1)}.ambient-glow{position:absolute;inset:0;background:linear-gradient(to bottom,rgba(193,156,255,.05),transparent);pointer-events:none}.mode-tag-wrap{display:flex;justify-content:center;margin-bottom:20rpx}.mode-tag{display:inline-flex;align-items:center;gap:10rpx;padding:10rpx 22rpx;border-radius:9999rpx;background:rgba(193,156,255,.12);border:1rpx solid rgba(193,156,255,.18);color:#d8c7ff;font-size:22rpx;letter-spacing:2rpx}.meaning-wrap{margin-bottom:28rpx}.meaning{display:block;color:#aaabb0;font-size:26rpx;letter-spacing:2rpx}.cloze-wrap,.word-wrap{margin:14rpx 0 10rpx}.cloze,.word{display:block;font-size:58rpx;font-weight:800;letter-spacing:2rpx;line-height:1.25}.cloze{color:#f6f6fc}.word{color:#f6f6fc}.entry-type-hint{margin-top:14rpx;color:#8f9198;font-size:22rpx;line-height:1.6}.cloze-input-list{margin-top:28rpx;display:flex;flex-direction:column;gap:20rpx}.cloze-input-item{padding:20rpx 18rpx;border-radius:24rpx;background:rgba(255,255,255,.04);border:1rpx solid rgba(255,255,255,.08);text-align:left}.cloze-input-label{display:block;margin-bottom:12rpx;color:#d8c7ff;font-size:22rpx;font-weight:700;letter-spacing:1rpx}.cloze-hint{margin-bottom:12rpx;color:#8f9198;font-size:20rpx;line-height:1.5}.input-shell{margin:26rpx auto 0;max-width:520rpx;background:rgba(255,255,255,.04);border:1rpx solid rgba(255,255,255,.08);border-radius:9999rpx}.answer{padding:22rpx 28rpx;text-align:center;color:#f6f6fc;font-size:32rpx;caret-color:#c19cff}.cloze-answer{max-width:100%;background:rgba(12,14,18,.35);border-radius:18rpx;border:1rpx solid rgba(255,255,255,.08);text-align:left;padding:22rpx 24rpx;margin:0 4rpx}.answer::placeholder{color:rgba(170,171,176,.72)}.answer::-webkit-input-placeholder{color:rgba(170,171,176,.72)}.answer::-moz-placeholder{color:rgba(170,171,176,.72)}.answer:-ms-input-placeholder{color:rgba(170,171,176,.72)}.feedback-box{margin-top:22rpx;padding:20rpx 24rpx;border-radius:24rpx;background:rgba(255,255,255,.04);border:1rpx solid rgba(255,255,255,.06)}.feedback{display:block;color:#00e3fd}.reveal-answer{display:block;margin-top:10rpx;color:#f6f6fc;font-weight:700}.cloze-feedback-list{margin-top:18rpx;display:flex;flex-direction:column;gap:14rpx}.cloze-feedback-item{padding:18rpx 16rpx;border-radius:18rpx;background:rgba(255,255,255,.04);border:1rpx solid rgba(255,255,255,.06)}.cloze-feedback-title{display:block;margin-bottom:8rpx;font-size:22rpx;font-weight:700;color:#c19cff}.cloze-feedback-text{display:block;font-size:22rpx;line-height:1.55;color:#e8e9ee}.actions-cluster{display:flex;flex-direction:row;gap:18rpx;justify-content:center;align-items:center;margin-top:24rpx}.secondary-btn,.primary-btn{flex:1;border-radius:9999rpx;padding:24rpx 0;font-weight:700}.secondary-btn{background:#23262c;color:#f6f6fc}.primary-btn{background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff}.master-action{margin-top:34rpx;text-align:center}.master-text{color:#aaabb0;font-size:22rpx;border-bottom:1rpx solid transparent}.master-text.active{color:#00e5fd;border-color:#00e5fd} diff --git a/settings/settings.js b/settings/settings.js index 979983b..8bd73ba 100644 --- a/settings/settings.js +++ b/settings/settings.js @@ -6,24 +6,35 @@ const difficultyOptions = [ { label: '困难', value: 'hard' }, ] +const reviewOrderOptions = [ + { label: '顺序复习', value: 'sequential' }, + { label: '随机复习', value: 'shuffle' }, +] + Page({ data: { settings: null, loading: false, error: '', difficultyOptions, + reviewOrderOptions, difficultyIndex: 1, + reviewOrderIndex: 0, difficultyLabel: '普通', + reviewOrderLabel: '顺序复习', }, onShow() { this.loadSettings() }, syncDerivedState(settings) { const difficultyIndex = Math.max(0, difficultyOptions.findIndex((item) => item.value === settings.blank_difficulty)) + const reviewOrderIndex = Math.max(0, reviewOrderOptions.findIndex((item) => item.value === settings.review_order)) this.setData({ settings, difficultyIndex: difficultyIndex >= 0 ? difficultyIndex : 1, difficultyLabel: difficultyOptions[difficultyIndex >= 0 ? difficultyIndex : 1].label, + reviewOrderIndex: reviewOrderIndex >= 0 ? reviewOrderIndex : 0, + reviewOrderLabel: reviewOrderOptions[reviewOrderIndex >= 0 ? reviewOrderIndex : 0].label, }) }, loadSettings() { @@ -63,6 +74,18 @@ Page({ }, }) }, + onReviewOrderChange(e) { + const index = Number(e.detail.value) + const option = reviewOrderOptions[index] || reviewOrderOptions[0] + this.setData({ + reviewOrderIndex: index, + reviewOrderLabel: option.label, + settings: { + ...this.data.settings, + review_order: option.value, + }, + }) + }, toggleSetting(e) { const key = e.currentTarget.dataset.key const settings = { ...this.data.settings } diff --git a/settings/settings.wxml b/settings/settings.wxml index 220d0a7..34a5ae1 100644 --- a/settings/settings.wxml +++ b/settings/settings.wxml @@ -34,6 +34,14 @@ + + 复习顺序控制复习题目按顺序还是随机展示 + + + {{reviewOrderLabel}} + + +