From 862b4fbe3b348120d393c43e4d86eb05746865f2 Mon Sep 17 00:00:00 2001 From: taiyi Date: Sun, 19 Apr 2026 16:39:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=8D=E4=B9=A0=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry-edit/entry-edit.js | 9 +- entry-edit/entry-edit.wxss | 188 ++++++++++++++++++++++++++++- index/index.js | 9 +- index/index.wxss | 2 +- me/me.js | 6 +- me/me.wxml | 6 + me/me.wxss | 2 +- progress-list/progress-list.wxml | 78 ++++++++---- progress-list/progress-list.wxss | 2 +- review-config/review-config.js | 7 ++ review-config/review-config.wxml | 6 + review-config/review-config.wxss | 29 ++++- review-result/review-result.js | 20 ++- review-result/review-result.wxml | 8 ++ review-session/review-session.js | 99 +++++++++++++-- review-session/review-session.wxml | 7 +- settings/settings.js | 46 ++++++- settings/settings.wxml | 14 ++- settings/settings.wxss | 2 +- vocab-manage/vocab-manage.wxml | 4 +- 20 files changed, 484 insertions(+), 60 deletions(-) diff --git a/entry-edit/entry-edit.js b/entry-edit/entry-edit.js index fee6c10..3094993 100644 --- a/entry-edit/entry-edit.js +++ b/entry-edit/entry-edit.js @@ -42,7 +42,14 @@ Page({ source_type: 'manual', upload_date: new Date().toISOString().slice(0, 10), }, - success: () => wx.showToast({ title: '保存成功', icon: 'success' }), + success: () => { + wx.showToast({ title: '保存成功', icon: 'success' }) + this.setData({ + enText: '', + zhText: '', + exampleText: '', + }) + }, fail: () => this.setData({ error: '保存失败' }), complete: () => this.setData({ loading: false }), }) diff --git a/entry-edit/entry-edit.wxss b/entry-edit/entry-edit.wxss index 17850fd..a843b08 100644 --- a/entry-edit/entry-edit.wxss +++ b/entry-edit/entry-edit.wxss @@ -1 +1,187 @@ -page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12;position:relative;overflow-x:hidden;box-sizing:border-box}.ambient-glow{position:absolute;top:0;left:50%;transform:translateX(-50%);width:80vw;max-width:800px;height:400px;background:radial-gradient(circle,rgba(193,156,255,.08) 0%,rgba(12,14,18,0) 70%);pointer-events:none;z-index:0}.topbar{position:relative;z-index:10;display:flex;align-items:center;justify-content:space-between;padding:24rpx 32rpx}.close-btn{width:72rpx;height:72rpx;border-radius:9999rpx;background:#000;color:#aaabb0;display:flex;align-items:center;justify-content:center;border:1rpx solid rgba(255,255,255,.1)}.spacer{width:72rpx;height:72rpx}.content{position:relative;z-index:10;height:calc(100vh - 120rpx);padding:16rpx 32rpx 48rpx;box-sizing:border-box}.header{margin-bottom:40rpx}.title{display:block;font-size:56rpx;font-weight:800;line-height:1.1}.subtitle{display:block;margin-top:10rpx;color:#aaabb0;font-size:26rpx}.segmented{display:flex;width:fit-content;padding:8rpx;background:#000;border:1rpx solid rgba(255,255,255,.1);border-radius:9999rpx;margin-bottom:40rpx;box-shadow:0 4rpx 20rpx rgba(0,0,0,.2)}.seg{padding:18rpx 32rpx;border-radius:9999rpx;color:#aaabb0;font-size:24rpx}.active{background:#1d2025;color:#c19cff;font-weight:700}.form{display:flex;flex-direction:column;gap:28rpx}.field{display:flex;flex-direction:column}.label{font-size:22rpx;color:#aaabb0;font-weight:700;margin:0 0 12rpx 4rpx}.muted{color:rgba(170,171,176,.5);font-weight:400}.input-shell{border-radius:24rpx;background:#000;border:1rpx solid rgba(255,255,255,.1);box-sizing:border-box}.input{width:100%;padding:24rpx 26rpx;font-size:36rpx;color:#f6f6fc;box-sizing:border-box}.small{font-size:28rpx}.textarea-shell{background:#111318}.textarea{width:100%;min-height:220rpx;padding:24rpx 26rpx;font-size:28rpx;color:#f6f6fc;box-sizing:border-box}.action-bar{display:flex;justify-content:flex-end;gap:18rpx;padding-top:28rpx;margin-top:36rpx;border-top:1rpx solid rgba(255,255,255,.05)}.cancel-btn,.save-btn{border-radius:9999rpx;padding:22rpx 34rpx;font-weight:700}.cancel-btn{background:#000;color:#f6f6fc;border:1rpx solid rgba(255,255,255,.1)}.save-btn{background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff} +page { + background: #0c0e12; + color: #f6f6fc +} + +.page { + min-height: 100vh; + background: #0c0e12; + position: relative; + overflow-x: hidden; + box-sizing: border-box +} + +.ambient-glow { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 80vw; + max-width: 800px; + height: 400px; + background: radial-gradient(circle, rgba(193, 156, 255, .08) 0%, rgba(12, 14, 18, 0) 70%); + pointer-events: none; + z-index: 0 +} + +.topbar { + position: relative; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + padding: 24rpx 32rpx +} + +.close-btn { + width: 72rpx; + height: 72rpx; + border-radius: 9999rpx; + background: #000; + color: #aaabb0; + display: flex; + align-items: center; + justify-content: center; + border: 1rpx solid rgba(255, 255, 255, .1) +} + +.spacer { + width: 72rpx; + height: 72rpx +} + +.content { + position: relative; + z-index: 10; + height: calc(100vh - 120rpx); + padding: 16rpx 32rpx 48rpx; + box-sizing: border-box +} + +.header { + margin-bottom: 40rpx +} + +.title { + display: block; + font-size: 56rpx; + font-weight: 800; + line-height: 1.1 +} + +.subtitle { + display: block; + margin-top: 10rpx; + color: #aaabb0; + font-size: 26rpx +} + +.segmented { + display: flex; + width: fit-content; + padding: 8rpx; + background: #000; + border: 1rpx solid rgba(255, 255, 255, .1); + border-radius: 9999rpx; + margin-bottom: 40rpx; + box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, .2) +} + +.seg { + padding: 18rpx 32rpx; + border-radius: 9999rpx; + color: #aaabb0; + font-size: 24rpx +} + +.active { + background: #1d2025; + color: #c19cff; + font-weight: 700 +} + +.form { + display: flex; + flex-direction: column; + gap: 28rpx +} + +.field { + display: flex; + flex-direction: column +} + +.label { + font-size: 22rpx; + color: #aaabb0; + font-weight: 700; + margin: 0 0 12rpx 4rpx +} + +.muted { + color: rgba(170, 171, 176, .5); + font-weight: 400 +} + +.input-shell { + min-height: 92rpx; + border-radius: 24rpx; + background: #000; + border: 1rpx solid rgba(255, 255, 255, .1); + box-sizing: border-box; + display: flex; + align-items: center +} + +.input { + width: 100%; + padding: 28rpx 26rpx; + font-size: 30rpx; + color: #f6f6fc; + box-sizing: border-box + +} + +.small { + font-size: 28rpx +} + +.textarea-shell { + background: #111318 +} + +.textarea { + width: 100%; + min-height: 220rpx; + padding: 24rpx 26rpx; + font-size: 28rpx; + color: #f6f6fc; + box-sizing: border-box +} + +.action-bar { + display: flex; + justify-content: flex-end; + gap: 18rpx; + padding-top: 28rpx; + margin-top: 36rpx; + border-top: 1rpx solid rgba(255, 255, 255, .05) +} + +.cancel-btn, +.save-btn { + border-radius: 9999rpx; + padding: 22rpx 34rpx; + font-weight: 700 +} + +.cancel-btn { + background: #000; + color: #f6f6fc; + border: 1rpx solid rgba(255, 255, 255, .1) +} + +.save-btn { + background: linear-gradient(90deg, #c19cff, #9146ff); + color: #fff +} \ No newline at end of file diff --git a/index/index.js b/index/index.js index 9e40f77..8cae738 100644 --- a/index/index.js +++ b/index/index.js @@ -9,11 +9,16 @@ Page({ onShow() { this.loadStats() }, - loadStats() { + async loadStats() { this.setData({ loading: true, error: '' }) + await app.ensureLogin() + if (!app.globalData.openid) { + this.setData({ error: '登录失败,请稍后重试', loading: false }) + return + } wx.request({ url: `${app.globalData.baseUrl}/api/v1/home/stats`, - header: { 'X-OpenID': app.globalData.openid || '' }, + header: { 'X-OpenID': app.globalData.openid }, success: (res) => { const payload = res.data?.data if (payload) this.setData({ stats: payload }) diff --git a/index/index.wxss b/index/index.wxss index 78f6d09..8b79dfc 100644 --- a/index/index.wxss +++ b/index/index.wxss @@ -1,4 +1,4 @@ page { background:#0c0e12; color:#f6f6fc; } .page { min-height:100vh; background: radial-gradient(circle at top, rgba(193,156,255,0.15), transparent 30%), #0c0e12; box-sizing:border-box; } .topbar { position:sticky; top:0; z-index:20; display:flex; justify-content:space-between; align-items:center; padding:24rpx 32rpx; background:rgba(255,255,255,.8); backdrop-filter:blur(24px); border-bottom:1rpx solid rgba(255,255,255,.2); box-shadow:0 1rpx 20rpx rgba(0,0,0,.08); } -.brand,.streak-left{display:flex;align-items:center;gap:20rpx}.avatar-wrap{width:80rpx;height:80rpx;border-radius:9999rpx;overflow:hidden;border:1rpx solid rgba(255,255,255,.1);flex-shrink:0}.avatar{width:100%;height:100%}.brand-text{font-size:40rpx;font-weight:900;background:linear-gradient(90deg,#6366f1,#22d3ee);-webkit-background-clip:text;color:transparent}.icon-btn{color:#6366f1;width:72rpx;height:72rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.4)}.content{height:calc(100vh - 120rpx);padding:40rpx 32rpx 140rpx;box-sizing:border-box}.greeting{display:flex;flex-direction:column;gap:8rpx;margin-bottom:32rpx}.title{display:block;font-size:56rpx;font-weight:800;color:#fff}.subtitle{display:block;font-size:30rpx;color:#aaabb0}.grid-layout{display:grid;grid-template-columns:1fr;gap:24rpx}.hero-card{position:relative;overflow:hidden;min-height:280rpx;padding:32rpx;border-radius:24rpx;background:rgba(29,32,37,.6);backdrop-filter:blur(24px);border:1rpx solid rgba(255,255,255,.1);box-shadow:0 20rpx 40rpx rgba(0,0,0,.4)}.hero-overlay{position:absolute;inset:0;background:linear-gradient(135deg,rgba(193,156,255,.05),rgba(0,227,253,.05));z-index:0}.hero-row,.hero-grid{position:relative;z-index:1}.hero-row{display:flex;justify-content:space-between;align-items:flex-start}.hero-number{display:block;font-size:72rpx;font-weight:800;color:#fff;line-height:1}.hero-icon{width:96rpx;height:96rpx;border-radius:9999rpx;background:rgba(255,255,255,.08);display:flex;align-items:center;justify-content:center;font-size:44rpx;border:1rpx solid rgba(255,255,255,.05)}.label{display:block;margin-top:8rpx;font-size:24rpx;color:#aaabb0}.hero-grid{display:grid;grid-template-columns:1fr 1fr;gap:18rpx;margin-top:44rpx}.metric-card{padding:24rpx;border-radius:20rpx;background:rgba(0,0,0,.15);border:1rpx solid rgba(255,255,255,.05)}.metric-value{display:block;font-size:44rpx;font-weight:800;color:#fff}.metric-value.accent{color:#00e3fd}.small{font-size:20rpx}.stack{display:flex;flex-direction:column;gap:24rpx}.streak-card{padding:28rpx;border-radius:24rpx;background:#111318;border:1rpx solid rgba(255,255,255,.1);box-shadow:0 20rpx 40rpx rgba(0,0,0,.4)}.streak-head{display:flex;justify-content:space-between;align-items:center}.fire{width:80rpx;height:80rpx;border-radius:9999rpx;background:#171a1f;display:flex;align-items:center;justify-content:center;border:1rpx solid rgba(255,255,255,.05)}.streak-title{font-size:30rpx;font-weight:700;color:#fff}.streak-goal{font-size:24rpx;color:#00e3fd;font-weight:500}.progress-bar{height:12rpx;background:#23262c;border-radius:9999rpx;overflow:hidden;margin-top:18rpx}.progress-fill{width:71%;height:100%;background:linear-gradient(90deg,#c19cff,#00e3fd);position:relative}.progress-fill::after{content:'';position:absolute;inset:0;background:rgba(255,255,255,.2)}.week-row{display:flex;justify-content:space-between;margin-top:10rpx;font-size:22rpx;color:#aaabb0}.day.active{color:#00e3fd;font-weight:700}.actions{display:flex;flex-direction:column;gap:18rpx;margin-top:4rpx}.primary-btn,.secondary-btn{width:100%;padding:26rpx 0;border-radius:9999rpx;font-size:32rpx;font-weight:800}.primary-btn{background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff;box-shadow:0 0 20rpx rgba(193,156,255,.3)}.secondary-btn{background:#23262c;color:#fff;border:1rpx solid rgba(255,255,255,.08)}.bottom-nav{position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;justify-content:space-around;align-items:center;padding:20rpx 24rpx 40rpx;background:rgba(255,255,255,.7);backdrop-filter:blur(24px);border-top-left-radius:32rpx;border-top-right-radius:32rpx;box-shadow:0 -10rpx 40rpx rgba(0,0,0,.1)}.nav-item{display:flex;flex-direction:column;align-items:center;color:#aaabb0}.nav-item.active{color:#00e3fd;transform:translateY(-6rpx)}.nav-icon{width:56rpx;height:56rpx;border-radius:9999rpx;background:rgba(255,255,255,.05);display:flex;align-items:center;justify-content:center;font-size:26rpx}.nav-label{font-size:20rpx} +.brand,.streak-left{display:flex;align-items:center;gap:20rpx}.avatar-wrap{width:80rpx;height:80rpx;border-radius:9999rpx;overflow:hidden;border:1rpx solid rgba(255,255,255,.1);flex-shrink:0}.avatar{width:100%;height:100%}.brand-text{font-size:40rpx;font-weight:900;background:linear-gradient(90deg,#6366f1,#22d3ee);-webkit-background-clip:text;color:transparent}.icon-btn{color:#6366f1;width:72rpx;height:72rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.4)}.content{height:calc(100vh - 120rpx);padding:40rpx 32rpx 160rpx;box-sizing:border-box}.greeting{display:flex;flex-direction:column;gap:8rpx;margin-bottom:32rpx}.title{display:block;font-size:56rpx;font-weight:800;color:#fff}.subtitle{display:block;font-size:30rpx;color:#aaabb0}.grid-layout{display:grid;grid-template-columns:1fr;gap:24rpx}.hero-card{position:relative;overflow:hidden;min-height:280rpx;padding:32rpx;border-radius:24rpx;background:rgba(29,32,37,.6);backdrop-filter:blur(24rpx);border:1rpx solid rgba(255,255,255,.1);box-shadow:0 20rpx 40rpx rgba(0,0,0,.4)}.hero-overlay{position:absolute;inset:0;background:linear-gradient(135deg,rgba(193,156,255,.05),rgba(0,227,253,.05));z-index:0}.hero-row,.hero-grid{position:relative;z-index:1}.hero-row{display:flex;justify-content:space-between;align-items:flex-start}.hero-number{display:block;font-size:72rpx;font-weight:800;color:#fff;line-height:1}.hero-icon{width:96rpx;height:96rpx;border-radius:9999rpx;background:rgba(255,255,255,.08);display:flex;align-items:center;justify-content:center;font-size:44rpx;border:1rpx solid rgba(255,255,255,.05)}.label{display:block;margin-top:8rpx;font-size:24rpx;color:#aaabb0}.hero-grid{display:grid;grid-template-columns:1fr 1fr;gap:18rpx;margin-top:44rpx}.metric-card{padding:24rpx;border-radius:20rpx;background:rgba(0,0,0,.15);border:1rpx solid rgba(255,255,255,.05)}.metric-value{display:block;font-size:44rpx;font-weight:800;color:#fff}.metric-value.accent{color:#00e3fd}.small{font-size:20rpx}.stack{display:flex;flex-direction:column;gap:24rpx}.streak-card{padding:28rpx;border-radius:24rpx;background:#111318;border:1rpx solid rgba(255,255,255,.1);box-shadow:0 20rpx 40rpx rgba(0,0,0,.4)}.streak-head{display:flex;justify-content:space-between;align-items:center}.fire{width:80rpx;height:80rpx;border-radius:9999rpx;background:#171a1f;display:flex;align-items:center;justify-content:center;border:1rpx solid rgba(255,255,255,.05)}.streak-title{font-size:30rpx;font-weight:700;color:#fff}.streak-goal{font-size:24rpx;color:#00e3fd;font-weight:500}.progress-bar{height:12rpx;background:#23262c;border-radius:9999rpx;overflow:hidden;margin-top:18rpx}.progress-fill{width:71%;height:100%;background:linear-gradient(90deg,#c19cff,#00e3fd);position:relative}.progress-fill::after{content:'';position:absolute;inset:0;background:rgba(255,255,255,.2)}.week-row{display:flex;justify-content:space-between;margin-top:10rpx;font-size:22rpx;color:#aaabb0}.day.active{color:#00e3fd;font-weight:700}.actions{display:flex;flex-direction:column;gap:18rpx;margin-top:4rpx}.primary-btn,.secondary-btn{width:100%;padding:26rpx 0;border-radius:9999rpx;font-size:32rpx;font-weight:800}.primary-btn{background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff;box-shadow:0 0 20rpx rgba(193,156,255,.3)}.secondary-btn{background:#23262c;color:#fff;border:1rpx solid rgba(255,255,255,.08)}.bottom-nav{position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;justify-content:space-around;align-items:center;padding:20rpx 24rpx 40rpx;background:rgba(12,14,18,.7);backdrop-filter:blur(32rpx);border-top-left-radius:32rpx;border-top-right-radius:32rpx;box-shadow:0 -10rpx 40rpx rgba(0,0,0,.4);border-top:1rpx solid rgba(255,255,255,.08)}.nav-item{display:flex;flex-direction:column;align-items:center;color:#6b7280;opacity:.8}.nav-item.active{color:#66dff3;transform:translateY(-6rpx);filter:drop-shadow(0 0 10rpx rgba(34,211,238,.8))}.nav-icon{width:56rpx;height:56rpx;border-radius:9999rpx;background:rgba(255,255,255,.04);display:flex;align-items:center;justify-content:center;font-size:26rpx}.nav-label{font-size:20rpx;font-weight:600;letter-spacing:.08em;text-transform:uppercase} diff --git a/me/me.js b/me/me.js index 27ff40a..fae5aac 100644 --- a/me/me.js +++ b/me/me.js @@ -48,6 +48,10 @@ Page({ wx.navigateTo({ url }) }, goHome() { - wx.switchTab({ url: '/pages/index/index' }) + wx.reLaunch({ url: '/pages/index/index' }) }, + goToReview() { + wx.navigateTo({ url: '/pages/review-config/review-config' }) + }, + goToMe() {}, }) diff --git a/me/me.wxml b/me/me.wxml index c9b0bd0..4da08a1 100644 --- a/me/me.wxml +++ b/me/me.wxml @@ -76,4 +76,10 @@ + + + 首页 + 📖复习 + 我的 + diff --git a/me/me.wxss b/me/me.wxss index 9560fb2..972aa50 100644 --- a/me/me.wxss +++ b/me/me.wxss @@ -1 +1 @@ -page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12;box-sizing:border-box}.topbar{position:sticky;top:0;z-index:20;display:flex;justify-content:space-between;align-items:center;padding:24rpx 32rpx;background:rgba(255,255,255,.8);backdrop-filter:blur(24px);border-bottom:1rpx solid rgba(255,255,255,.2);box-shadow:0 1rpx 20rpx rgba(0,0,0,.08)}.topbar-left{display:flex;align-items:center;gap:20rpx}.avatar-shell{width:64rpx;height:64rpx;border-radius:9999rpx;overflow:hidden;border:1rpx solid rgba(255,255,255,.2);flex-shrink:0}.avatar-img{width:100%;height:100%}.brand-text{font-size:40rpx;font-weight:900;background:linear-gradient(90deg,#6366f1,#22d3ee);-webkit-background-clip:text;color:transparent}.topbar-icon{color:#6366f1}.content{height:calc(100vh - 120rpx);padding:48rpx 40rpx 32rpx;box-sizing:border-box}.hero-section{display:flex;align-items:center;gap:28rpx;margin-bottom:48rpx}.hero-avatar-wrap{padding:2rpx;border-radius:9999rpx;background:linear-gradient(135deg,#c19cff,#9146ff,#00e3fd);box-shadow:0 10rpx 30rpx rgba(193,156,255,.2)}.hero-avatar-border{width:176rpx;height:176rpx;border-radius:9999rpx;overflow:hidden;border:6rpx solid #0c0e12;background:#1d2025}.hero-avatar{width:100%;height:100%}.hero-info{display:flex;flex-direction:column;justify-content:center}.hero-name{display:block;font-size:56rpx;font-weight:800;line-height:1.1;margin-bottom:12rpx}.hero-badge{display:inline-flex;align-items:center;gap:12rpx;padding:12rpx 18rpx;border-radius:9999rpx;background:#1d2025;border:1rpx solid rgba(255,255,255,.1);width:fit-content}.pulse-dot{width:16rpx;height:16rpx;border-radius:9999rpx;background:#00e3fd;box-shadow:0 0 16rpx rgba(0,227,253,.8)}.badge-text{font-size:22rpx;color:#aaabb0}.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:18rpx}.glass-card{position:relative;overflow:hidden;padding:28rpx;border-radius:24rpx;border:1rpx solid rgba(255,255,255,.08);background:rgba(29,32,37,.6);backdrop-filter:blur(24px);box-shadow:0 20rpx 40rpx rgba(0,0,0,.08);min-height:220rpx}.card-glow{position:absolute;right:-32rpx;top:-32rpx;width:128rpx;height:128rpx;border-radius:9999rpx;filter:blur(24rpx)}.accent-tertiary .card-glow{background:rgba(255,108,149,.12)}.accent-secondary .card-glow{background:rgba(0,227,253,.12)}.card-icon{position:relative;z-index:1;width:76rpx;height:76rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;margin-bottom:24rpx;font-size:32rpx}.card-title,.card-subtitle{position:relative;z-index:1;display:block}.card-title{font-size:30rpx;font-weight:700;color:#f6f6fc;margin-bottom:6rpx}.card-subtitle{font-size:22rpx;color:#aaabb0}.divider-row{display:flex;align-items:center;gap:16rpx;margin:36rpx 0 20rpx}.divider{flex:1;height:2rpx;background:linear-gradient(90deg,transparent,rgba(255,255,255,.1),transparent)}.section-kicker{font-size:20rpx;letter-spacing:4rpx;text-transform:uppercase;color:rgba(170,171,176,.6);font-weight:700}.management-grid{margin-bottom:24rpx}.small-action{display:flex;align-items:center;gap:18rpx;padding:22rpx;border-radius:20rpx;background:rgba(17,19,24,.8);border:1rpx solid rgba(255,255,255,.05);min-height:108rpx}.small-icon{width:68rpx;height:68rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.06);flex-shrink:0;font-size:28rpx}.small-icon.primary{color:#c19cff}.small-icon.secondary{color:#00e3fd}.small-icon.tertiary{color:#ff6c95}.small-icon.primary-fixed{color:#b68aff}.small-text{font-size:24rpx;font-weight:600;color:#f6f6fc}.settings-card{display:flex;align-items:center;justify-content:space-between;padding:26rpx 24rpx;border-radius:24rpx;background:rgba(29,32,37,.4);border:1rpx solid rgba(255,255,255,.08);box-shadow:0 10rpx 30rpx rgba(0,0,0,.1)}.settings-icon{width:76rpx;height:76rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;font-size:30rpx}.settings-text{flex:1;margin-left:20rpx;font-size:30rpx;font-weight:700}.chevron{width:56rpx;height:56rpx;border-radius:9999rpx;background:rgba(255,255,255,.04);display:flex;align-items:center;justify-content:center;color:#aaabb0;font-size:46rpx;line-height:1} +page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12;box-sizing:border-box;overflow-x:hidden}.content{height:calc(100vh - 120rpx);padding:96rpx 40rpx 180rpx;box-sizing:border-box}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80rpx 32rpx 64rpx;text-align:center}.empty-state.small{padding-top:24rpx;padding-bottom:28rpx}.empty-title{display:block;font-size:36rpx;font-weight:800;line-height:1.2;margin-bottom:8rpx;color:#f6f6fc}.empty-subtitle{display:block;font-size:24rpx;line-height:1.6;color:#aaabb0}.error-banner{display:flex;flex-direction:column;align-items:center;gap:20rpx;padding:32rpx 28rpx;border:1rpx solid rgba(255,255,255,.08);border-radius:32rpx;background:rgba(23,26,31,.6);backdrop-filter:blur(24rpx);margin-bottom:32rpx}.error-text{color:#ff6e84;font-size:24rpx;text-align:center}.secondary-btn{border:none;background:#23262c;color:#f6f6fc;border-radius:9999rpx;padding:0 28rpx;line-height:72rpx;font-size:24rpx}.error-btn{min-width:200rpx}.hero-section{display:flex;align-items:center;gap:28rpx;margin-bottom:48rpx}.hero-avatar-wrap{padding:2rpx;border-radius:9999rpx;background:linear-gradient(135deg,#c19cff,#9146ff,#00e3fd);box-shadow:0 10rpx 30rpx rgba(193,156,255,.2)}.hero-avatar-border{width:176rpx;height:176rpx;border-radius:9999rpx;overflow:hidden;border:6rpx solid #0c0e12;background:#1d2025}.hero-avatar{width:100%;height:100%}.hero-info{display:flex;flex-direction:column;justify-content:center}.hero-name{display:block;font-size:56rpx;font-weight:800;line-height:1.1;margin-bottom:12rpx}.hero-badge{display:inline-flex;align-items:center;gap:12rpx;padding:12rpx 18rpx;border-radius:9999rpx;background:#1d2025;border:1rpx solid rgba(255,255,255,.1);width:fit-content}.pulse-dot{width:16rpx;height:16rpx;border-radius:9999rpx;background:#00e3fd;box-shadow:0 0 16rpx rgba(0,227,253,.8)}.badge-text{font-size:22rpx;color:#aaabb0}.grid-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24rpx;margin-bottom:40rpx}.glass-card{position:relative;overflow:hidden;display:flex;flex-direction:column;min-height:214rpx;padding:28rpx;border:1rpx solid rgba(255,255,255,.08);border-radius:24rpx;background:rgba(29,32,37,.6);backdrop-filter:blur(24rpx);box-shadow:0 20rpx 40rpx rgba(0,0,0,.08)}.card-glow{position:absolute;right:-48rpx;top:-48rpx;width:180rpx;height:180rpx;border-radius:50%;filter:blur(48rpx);opacity:.8}.accent-tertiary .card-glow{background:rgba(255,108,149,.18)}.accent-secondary .card-glow{background:rgba(0,227,253,.18)}.card-icon{position:relative;z-index:1;width:96rpx;height:96rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;margin-bottom:20rpx;background:rgba(255,255,255,.06);border:1rpx solid rgba(255,255,255,.05);font-size:40rpx}.icon-tertiary{color:#ff6c95;box-shadow:0 0 24rpx rgba(255,108,149,.35)}.icon-secondary{color:#00e3fd;box-shadow:0 0 24rpx rgba(0,227,253,.35)}.card-title{position:relative;z-index:1;display:block;font-size:34rpx;line-height:1.2;font-weight:800;color:#f6f6fc;margin-bottom:8rpx}.card-subtitle{position:relative;z-index:1;display:block;font-size:22rpx;line-height:1.5;color:#aaabb0}.divider-row{display:flex;align-items:center;gap:24rpx;margin:8rpx 0 24rpx}.divider{height:2rpx;flex:1;background:linear-gradient(90deg,transparent,rgba(255,255,255,.1),transparent)}.section-kicker{font-size:20rpx;font-weight:700;letter-spacing:.2em;text-transform:uppercase;color:rgba(170,171,176,.6)}.management-grid{margin-bottom:40rpx}.small-action{display:flex;align-items:center;gap:24rpx;padding:24rpx;border:1rpx solid rgba(255,255,255,.05);border-radius:24rpx;background:rgba(17,19,24,.8);backdrop-filter:blur(16rpx)}.small-icon{width:80rpx;height:80rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;flex-shrink:0;border:1rpx solid rgba(255,255,255,.05);font-size:34rpx}.small-icon.primary{background:rgba(193,156,255,.1);color:#c19cff}.small-icon.secondary{background:rgba(0,227,253,.1);color:#00e3fd}.small-icon.tertiary{background:rgba(255,108,149,.1);color:#ff6c95}.small-icon.primary-fixed{background:rgba(182,138,255,.1);color:#b68aff}.small-text{font-size:26rpx;font-weight:600;color:#f6f6fc}.settings-card{display:flex;align-items:center;justify-content:space-between;padding:30rpx 32rpx;border-radius:24rpx;border:1rpx solid rgba(255,255,255,.08);background:rgba(35,38,44,.4);backdrop-filter:blur(24rpx);box-shadow:0 10rpx 30rpx rgba(0,0,0,.1)}.settings-icon{width:96rpx;height:96rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.06);border:1rpx solid rgba(255,255,255,.05);font-size:38rpx;color:#f6f6fc}.settings-text{flex:1;padding-left:20rpx;font-size:28rpx;font-weight:600;letter-spacing:.04em;color:#f6f6fc}.chevron{width:64rpx;height:64rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.04);color:#aaabb0;font-size:44rpx}.bottom-nav{position:fixed;left:0;right:0;bottom:0;z-index:50;display:flex;justify-content:space-around;align-items:center;padding:20rpx 24rpx 40rpx;background:rgba(12,14,18,.7);backdrop-filter:blur(32rpx);border-top:1rpx solid rgba(255,255,255,.08);border-radius:32rpx 32rpx 0 0;box-shadow:0 -10rpx 40rpx rgba(0,0,0,.4)}.nav-item{display:flex;flex-direction:column;align-items:center;gap:6rpx;color:#aaabb0}.nav-item.active{color:#00e3fd;transform:translateY(-6rpx)}.nav-icon{width:56rpx;height:56rpx;border-radius:9999rpx;background:rgba(255,255,255,.05);display:flex;align-items:center;justify-content:center;font-size:34rpx}.nav-label{font-size:20rpx} diff --git a/progress-list/progress-list.wxml b/progress-list/progress-list.wxml index 4e74575..3d7f6b4 100644 --- a/progress-list/progress-list.wxml +++ b/progress-list/progress-list.wxml @@ -1,8 +1,16 @@ + + + - 进度列表 - 查看每个词条的掌握程度。 + 复习档案 + 您的词汇神经元网络正在构建中。 + + + + 待复习 + 已掌握 @@ -15,36 +23,54 @@ - 待复习 - + - - - {{item.en_text}} - {{item.zh_text}} + + + + + {{item.en_text}} + {{item.zh_text}} + + 🔥 - {{item.mastery_score}}% + + + 神经元连接强度 + {{item.mastery_score}}% + + + + + 移至已掌握 + + + + + + + + + {{item.en_text}} + {{item.zh_text}} + + + + + + 神经元连接强度 + {{item.mastery_score}}% + + + + + 移至已掌握 - - - 暂无待复习内容 - 已掌握 - - - - - {{item.en_text}} - {{item.zh_text}} - - {{item.mastery_score}}% - - - - - 暂无已掌握内容 + + 暂无进度内容 diff --git a/progress-list/progress-list.wxss b/progress-list/progress-list.wxss index b2b0abf..947b140 100644 --- a/progress-list/progress-list.wxss +++ b/progress-list/progress-list.wxss @@ -1 +1 @@ -page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12;box-sizing:border-box}.topbar{display:flex;justify-content:space-between;align-items:center;padding:24rpx 32rpx;background:rgba(12,14,18,.8);backdrop-filter:blur(24px);border-bottom:1rpx solid rgba(255,255,255,.08);box-shadow:0 1rpx 20rpx rgba(0,0,0,.08)}.brand{display:flex;align-items:center;gap:18rpx}.avatar-wrap{width:64rpx;height:64rpx;border-radius:9999rpx;overflow:hidden;border:1rpx solid rgba(255,255,255,.1);flex-shrink:0}.avatar{width:100%;height:100%}.brand-text{font-size:38rpx;font-weight:800;color:#c19cff}.icon-btn{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:40rpx 32rpx;box-sizing:border-box}.header{margin-bottom:24rpx}.title{display:block;font-size:52rpx;font-weight:800}.subtitle{display:block;margin-top:10rpx;color:#aaabb0;font-size:24rpx}.list{background:rgba(29,32,37,.56);border:1rpx solid rgba(255,255,255,.08);border-radius:28rpx;overflow:hidden}.row{display:flex;justify-content:space-between;align-items:center;padding:24rpx 22rpx;border-bottom:1rpx solid rgba(255,255,255,.06)}.row:last-child{border-bottom:none}.word{display:block;font-size:30rpx;font-weight:700}.desc{display:block;margin-top:6rpx;color:#aaabb0;font-size:22rpx}.percent{font-size:32rpx;font-weight:800}.cyan{color:#00e5ff}.purple{color:#c19cff}.pink{color:#ff4081} +page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12;box-sizing:border-box;position:relative;overflow:hidden}.bg-orb{position:absolute;border-radius:9999rpx;filter:blur(120rpx);pointer-events:none;z-index:0}.bg-orb-right{width:40vw;height:40vw;top:-10vw;right:-10vw;background:rgba(193,156,255,.08)}.bg-orb-left{width:50vw;height:50vw;left:-15vw;bottom:-15vw;background:rgba(0,227,253,.06)}.content{height:100vh;padding:40rpx 32rpx;box-sizing:border-box;position:relative;z-index:1}.header{margin-bottom:28rpx}.title{display:block;font-size:56rpx;line-height:1.1;font-weight:800;letter-spacing:-1rpx}.subtitle{display:block;margin-top:10rpx;color:#aaabb0;font-size:24rpx;line-height:1.5}.tabs{display:flex;gap:16rpx;padding:6rpx;border:1rpx solid rgba(255,255,255,.05);background:rgba(23,26,31,.7);border-radius:9999rpx;width:max-content;box-shadow:0 8rpx 30rpx rgba(0,0,0,.12);margin-bottom:34rpx}.tab{padding:18rpx 34rpx;border-radius:9999rpx;color:#aaabb0;font-size:24rpx;font-weight:600}.tab-active{background:#1d2025;color:#c19cff;box-shadow:0 0 24rpx rgba(193,156,255,.22)}.grid{display:flex;flex-direction:column;gap:24rpx}.card{position:relative;overflow:hidden;padding:30rpx;background:rgba(29,32,37,.56);border:1rpx solid rgba(255,255,255,.08);border-radius:32rpx;box-shadow:0 16rpx 60rpx rgba(0,0,0,.12)}.card-glow{position:absolute;right:-40rpx;top:-40rpx;width:180rpx;height:180rpx;border-radius:9999rpx;filter:blur(30rpx);opacity:.35}.card-glow-pink{background:rgba(255,108,149,.5)}.card-glow-cyan{background:rgba(0,227,253,.45)}.card-head{display:flex;justify-content:space-between;align-items:flex-start;gap:20rpx;margin-bottom:18rpx}.word{display:block;font-weight:800;line-height:1.1}.word-large{font-size:48rpx;letter-spacing:-1rpx}.desc{display:block;color:#aaabb0;font-size:22rpx}.desc-spaced{margin-top:10rpx}.badge{width:80rpx;height:80rpx;border-radius:9999rpx;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.04);border:1rpx solid rgba(255,255,255,.05);flex-shrink:0;font-size:28rpx}.badge-pink{color:#ff6c95}.badge-cyan{color:#00e3fd}.progress-meta{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:14rpx}.progress-label{font-size:20rpx;color:#aaabb0;letter-spacing:1rpx}.progress-value{font-size:28rpx;font-weight:800}.progress-pink{color:#ff6c95}.progress-cyan{color:#00e3fd}.progress-track{width:100%;height:8rpx;background:#23262c;border-radius:9999rpx;overflow:hidden;box-shadow:inset 0 0 0 1rpx rgba(255,255,255,.03);margin-bottom:20rpx}.progress-fill{height:100%;border-radius:9999rpx}.progress-fill-pink{background:linear-gradient(90deg,#ff769b,#ff6c95);box-shadow:0 0 20rpx rgba(255,108,149,.5)}.progress-fill-cyan{background:linear-gradient(90deg,#c19cff,#00e3fd);box-shadow:0 0 20rpx rgba(0,227,253,.45)}.action-btn{width:100%;padding:22rpx 0;border-radius:9999rpx;background:#1d2025;border:1rpx solid rgba(255,255,255,.05);color:#aaabb0;font-size:24rpx;font-weight:600;text-align:center}.empty-state{padding:60rpx 20rpx;text-align:center;color:#aaabb0}.empty-state.small{padding:40rpx 20rpx}.empty-title{display:block;font-size:28rpx;font-weight:700;color:#f6f6fc}.empty-subtitle{display:block;margin-top:10rpx;font-size:22rpx;color:#aaabb0}.error-banner{padding:24rpx 28rpx;border-radius:20rpx;background:rgba(167,1,56,.2);border:1rpx solid rgba(255,110,132,.35)}.error-text{color:#ffb2b9;font-size:24rpx}.cyan{color:#00e5ff}.purple{color:#c19cff}.pink{color:#ff4081} diff --git a/review-config/review-config.js b/review-config/review-config.js index 9f79b3d..21ae2ce 100644 --- a/review-config/review-config.js +++ b/review-config/review-config.js @@ -92,4 +92,11 @@ Page({ complete: () => this.setData({ loading: false }), }) }, + goHome() { + wx.reLaunch({ url: '/pages/index/index' }) + }, + goToReview() {}, + goToMe() { + wx.navigateTo({ url: '/pages/me/me' }) + }, }) diff --git a/review-config/review-config.wxml b/review-config/review-config.wxml index a07a2a3..6087b2c 100644 --- a/review-config/review-config.wxml +++ b/review-config/review-config.wxml @@ -36,4 +36,10 @@ + + + 首页 + 📖复习 + 我的 + diff --git a/review-config/review-config.wxss b/review-config/review-config.wxss index 8fc6371..a3fe0f1 100644 --- a/review-config/review-config.wxss +++ b/review-config/review-config.wxss @@ -1,5 +1,26 @@ page { background:#0c0e12; color:#f6f6fc; } -.page { min-height:100vh; background:#0c0e12; } -.topbar { position:sticky; top:0; z-index:10; display:flex; justify-content:space-between; align-items:center; padding:24rpx 32rpx; background:rgba(12,14,18,.8); backdrop-filter:blur(24px); border-bottom:1rpx solid rgba(255,255,255,.08); } -.brand{display:flex;align-items:center;gap:20rpx}.avatar-wrap{width:80rpx;height:80rpx;border-radius:9999rpx;overflow:hidden;flex-shrink:0}.avatar{width:100%;height:100%}.brand-text{font-size:40rpx;font-weight:800;color:#c19cff}.icon-btn{width:72rpx;height:72rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center} -.config-content{height:calc(100vh - 120rpx);padding:32rpx;box-sizing:border-box}.heading{margin:16rpx 0 24rpx}.title{display:block;font-size:52rpx;font-weight:800}.subtitle{display:block;margin-top:10rpx;font-size:28rpx;color:#aaabb0;line-height:1.6}.config-card{margin-top:24rpx;padding:28rpx;border-radius:28rpx;background:rgba(29,32,37,.65);border:1rpx solid rgba(255,255,255,.08)}.section-title{display:block;font-size:32rpx;font-weight:700;margin-bottom:20rpx}.chip-row{display:flex;flex-wrap:wrap;gap:16rpx}.chip{padding:18rpx 28rpx;border-radius:9999rpx;background:#23262c;color:#aaabb0}.chip.active{background:#c19cff;color:#000}.two-grid{display:grid;grid-template-columns:1fr 1fr;gap:18rpx}.option-box,.mode-item{padding:24rpx;border-radius:24rpx;background:#111318;border:1rpx solid rgba(255,255,255,.08);text-align:center;color:#aaabb0;min-height:96rpx;display:flex;align-items:center;justify-content:center}.option-box.active,.mode-item.active{color:#c19cff;border-color:#c19cff}.mode-list{display:flex;flex-direction:column;gap:18rpx}.switch-row,.range-row{display:flex;justify-content:space-between;align-items:center;padding:12rpx 0}.switch{padding:6rpx 16rpx;border-radius:9999rpx;background:#23262c;color:#aaabb0}.switch.on{background:#c19cff;color:#000}.accent{color:#c19cff;font-weight:700}.range-bar{height:12rpx;border-radius:9999rpx;background:#23262c;overflow:hidden}.range-fill{width:30%;height:100%;background:linear-gradient(90deg,#c19cff,#00e3fd)}.start-btn{margin:32rpx 0 48rpx;padding:28rpx 0;border-radius:9999rpx;background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff;font-size:34rpx;font-weight:800;box-shadow:0 0 20rpx rgba(193,156,255,.28)} +.page { min-height:100vh; background:#0c0e12; box-sizing:border-box; } +.content { height:calc(100vh - 120rpx); padding:32rpx; box-sizing:border-box; } +.config-content { padding-bottom:180rpx; } +.heading { margin:16rpx 0 24rpx; } +.title { display:block; font-size:52rpx; font-weight:800; } +.subtitle { display:block; margin-top:10rpx; font-size:28rpx; color:#aaabb0; line-height:1.6; } +.config-card { margin-top:24rpx; padding:28rpx; border-radius:28rpx; background:rgba(29,32,37,.65); border:1rpx solid rgba(255,255,255,.08); } +.section-title { display:block; font-size:32rpx; font-weight:700; margin-bottom:20rpx; } +.chip-row { display:flex; flex-wrap:wrap; gap:16rpx; } +.chip { padding:18rpx 28rpx; border-radius:9999rpx; background:#23262c; color:#aaabb0; } +.chip.active { background:#c19cff; color:#000; } +.two-grid { display:grid; grid-template-columns:1fr 1fr; gap:18rpx; } +.option-box, .mode-item { padding:24rpx; border-radius:24rpx; background:#111318; border:1rpx solid rgba(255,255,255,.08); text-align:center; color:#aaabb0; min-height:96rpx; display:flex; align-items:center; justify-content:center; } +.option-box.active, .mode-item.active { color:#c19cff; border-color:#c19cff; } +.mode-list { display:flex; flex-direction:column; gap:18rpx; } +.switch-row, .range-row { display:flex; justify-content:space-between; align-items:center; padding:12rpx 0; } +.switch { padding:6rpx 16rpx; border-radius:9999rpx; background:#23262c; color:#aaabb0; } +.switch.on { background:#c19cff; color:#000; } +.accent { color:#c19cff; font-weight:700; } +.start-btn { margin:32rpx 0 48rpx; padding:28rpx 0; border-radius:9999rpx; background:linear-gradient(90deg,#c19cff,#9146ff); color:#fff; font-size:34rpx; font-weight:800; box-shadow:0 0 20rpx rgba(193,156,255,.28); } +.bottom-nav { position:fixed; left:0; right:0; bottom:0; z-index:50; display:flex; justify-content:space-around; align-items:center; padding:20rpx 24rpx 40rpx; background:rgba(12,14,18,.7); backdrop-filter:blur(32rpx); border-top:1rpx solid rgba(255,255,255,.08); border-radius:32rpx 32rpx 0 0; box-shadow:0 -10rpx 40rpx rgba(0,0,0,.4); } +.nav-item { display:flex; flex-direction:column; align-items:center; gap:6rpx; color:#aaabb0; } +.nav-item.active { color:#00e3fd; transform:translateY(-6rpx); } +.nav-icon { width:56rpx; height:56rpx; border-radius:9999rpx; background:rgba(255,255,255,.05); display:flex; align-items:center; justify-content:center; } +.nav-label { font-size:20rpx; } diff --git a/review-result/review-result.js b/review-result/review-result.js index cde0c3e..f6077da 100644 --- a/review-result/review-result.js +++ b/review-result/review-result.js @@ -7,6 +7,8 @@ Page({ total: 0, mastered: 0, reviewNeeded: 0, + improved: 0, + regressed: 0, loading: false, error: '', }, @@ -15,7 +17,8 @@ Page({ }, loadResult() { const sessionId = app.globalData.reviewSessionMeta?.id - if (!sessionId) { + const fallbackSession = app.globalData.reviewSession + if (!sessionId && !fallbackSession?.completed) { this.setData({ error: '暂无复习结果' }) return } @@ -24,7 +27,20 @@ Page({ url: `${app.globalData.baseUrl}/api/v1/review-result?session_id=${sessionId}`, header: { 'X-OpenID': app.globalData.openid || '' }, success: (res) => { - this.setData(res.data?.data || {}) + const data = res.data?.data || {} + const total = Number(data.total || 0) + 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 + this.setData({ + total, + accuracy, + mastered: Number(data.mastered ?? correct), + reviewNeeded: Number(data.review_needed ?? wrong), + improved: Number(data.improved ?? 0), + regressed: Number(data.regressed ?? 0), + timeUsed: data.time_used || '--:--', + }) }, fail: () => this.setData({ error: '结果加载失败' }), complete: () => this.setData({ loading: false }), diff --git a/review-result/review-result.wxml b/review-result/review-result.wxml index 287b353..888e2d0 100644 --- a/review-result/review-result.wxml +++ b/review-result/review-result.wxml @@ -50,6 +50,14 @@ {{reviewNeeded}} 需加强 + + {{improved}} + 进步题目 + + + {{regressed}} + 退步题目 + diff --git a/review-session/review-session.js b/review-session/review-session.js index ab1b11c..312ea81 100644 --- a/review-session/review-session.js +++ b/review-session/review-session.js @@ -1,5 +1,15 @@ const app = getApp() +const getReviewSettings = () => { + const settings = app.globalData.userSettings || {} + return { + autoNextQuestion: Number(settings.auto_next_question || 0) === 1, + showAnswerAfterSubmit: Number(settings.show_answer_after_submit || 0) === 1, + blankCount: Number(settings.blank_count || 2), + blankDifficulty: settings.blank_difficulty || 'normal', + } +} + Page({ data: { progress: 0, @@ -9,15 +19,39 @@ Page({ meaning: '', answer: '', feedback: '', + revealAnswer: '', + feedbackType: '', showFeedback: false, completed: false, masterHint: false, questions: [], loading: false, error: '', + settings: getReviewSettings(), }, + submitting: false, + judged: false, onLoad() { - this.loadQuestions() + this.loadSettingsAndQuestions() + }, + loadSettingsAndQuestions() { + if (!app.globalData.openid) { + this.setData({ error: '请先登录' }) + return + } + wx.request({ + url: `${app.globalData.baseUrl}/api/v1/settings`, + header: { 'X-OpenID': app.globalData.openid }, + success: (res) => { + app.globalData.userSettings = res.data?.data || {} + this.setData({ settings: getReviewSettings() }) + this.loadQuestions() + }, + fail: () => { + this.setData({ error: '设置加载失败' }) + this.loadQuestions() + }, + }) }, loadQuestions() { const session = app.globalData.reviewSessionMeta @@ -30,8 +64,24 @@ Page({ url: `${app.globalData.baseUrl}/api/v1/review/questions?session_id=${session.id}`, header: { 'X-OpenID': app.globalData.openid || '' }, success: (res) => { - const questions = res.data?.data || [] - app.globalData.reviewSession = { deck: questions, currentIndex: 0, correctCount: 0, wrongCount: 0, completed: false, currentAnswer: '' } + const questions = (res.data?.data || []).map((item) => { + if (item.question_mode === 'C') { + return { + ...item, + blank_prompt: item.blank_prompt || item.prompt, + } + } + return item + }) + app.globalData.reviewSession = { + deck: questions, + currentIndex: 0, + correctCount: 0, + wrongCount: 0, + completed: false, + currentAnswer: '', + startedAt: Date.now(), + } this.setData({ questions }) this.syncSession() }, @@ -47,10 +97,12 @@ Page({ progress: Math.round((session.currentIndex / total) * 100), current: session.currentIndex + 1, total, - word: current?.prompt || '', - meaning: current?.answer_hint || '', + word: current?.question_mode === 'C' ? (current?.blank_prompt || current?.prompt || '') : (current?.prompt || ''), + meaning: current?.question_mode === 'C' ? (current?.answer_hint || '') : '', answer: session.currentAnswer || '', feedback: '', + revealAnswer: '', + feedbackType: '', showFeedback: false, completed: session.completed, masterHint: false, @@ -59,12 +111,20 @@ Page({ onAnswerInput(e) { const answer = e.detail.value app.globalData.reviewSession.currentAnswer = answer - this.setData({ answer }) + this.setData({ answer, showFeedback: false, revealAnswer: '', feedback: '', feedbackType: '', judged: false }) }, - checkAnswer() { + submitAnswer(showExplanation = false) { const session = app.globalData.reviewSession const current = session.deck[session.currentIndex] - if (!current) return + if (!current || this.submitting || this.judged) return + + const answer = (this.data.answer || '').trim() + if (!answer) { + wx.showToast({ title: '请先输入答案', icon: 'none' }) + return + } + + this.submitting = true wx.request({ url: `${app.globalData.baseUrl}/api/v1/review/submit`, method: 'POST', @@ -73,24 +133,43 @@ Page({ session_id: app.globalData.reviewSessionMeta.id, entry_id: current.entry_id, question_mode: current.question_mode, - user_answer: this.data.answer, + user_answer: answer, }, 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 this.setData({ - feedback: result.is_correct ? '回答正确' : `正确答案:${result.correct_answer}`, + feedback: result.is_correct ? '回答正确' : '回答错误', + feedbackType: result.is_correct ? 'correct' : 'wrong', + revealAnswer: shouldShowAnswer ? `正确答案:${result.correct_answer}` : '', showFeedback: true, }) + if (this.data.settings.autoNextQuestion) { + setTimeout(() => this.nextQuestion(), shouldShowAnswer ? 1200 : 0) + } + }, + complete: () => { + this.submitting = false }, }) }, + checkAnswer() { + this.submitAnswer(true) + }, nextQuestion() { const session = app.globalData.reviewSession if (!session.deck.length) return + if (!this.judged) { + wx.showToast({ title: '请先提交答案', icon: 'none' }) + return + } + this.judged = false if (session.currentIndex >= session.deck.length - 1) { session.completed = true + session.endedAt = Date.now() wx.request({ url: `${app.globalData.baseUrl}/api/v1/review/finish?session_id=${app.globalData.reviewSessionMeta.id}`, method: 'POST', diff --git a/review-session/review-session.wxml b/review-session/review-session.wxml index 5a18954..e986433 100644 --- a/review-session/review-session.wxml +++ b/review-session/review-session.wxml @@ -16,7 +16,7 @@ {{questions[current-1].question_mode || 'C'}} - + {{meaning}} @@ -30,7 +30,10 @@ - + diff --git a/settings/settings.js b/settings/settings.js index bd0f1e4..979983b 100644 --- a/settings/settings.js +++ b/settings/settings.js @@ -1,14 +1,31 @@ const app = getApp() +const difficultyOptions = [ + { label: '简单', value: 'easy' }, + { label: '普通', value: 'normal' }, + { label: '困难', value: 'hard' }, +] + Page({ data: { settings: null, loading: false, error: '', + difficultyOptions, + difficultyIndex: 1, + difficultyLabel: '普通', }, onShow() { this.loadSettings() }, + syncDerivedState(settings) { + const difficultyIndex = Math.max(0, difficultyOptions.findIndex((item) => item.value === settings.blank_difficulty)) + this.setData({ + settings, + difficultyIndex: difficultyIndex >= 0 ? difficultyIndex : 1, + difficultyLabel: difficultyOptions[difficultyIndex >= 0 ? difficultyIndex : 1].label, + }) + }, loadSettings() { if (!app.globalData.openid) { this.setData({ error: '请先登录' }) @@ -19,12 +36,39 @@ Page({ url: `${app.globalData.baseUrl}/api/v1/settings`, header: { 'X-OpenID': app.globalData.openid }, success: (res) => { - this.setData({ settings: res.data?.data || null }) + this.syncDerivedState(res.data?.data || null) }, fail: () => this.setData({ error: '设置加载失败' }), complete: () => this.setData({ loading: false }), }) }, + onBlankCountInput(e) { + const value = Number(e.detail.value || 0) + this.setData({ + settings: { + ...this.data.settings, + blank_count: Number.isFinite(value) ? value : 0, + }, + }) + }, + onDifficultyChange(e) { + const index = Number(e.detail.value) + const option = difficultyOptions[index] || difficultyOptions[1] + this.setData({ + difficultyIndex: index, + difficultyLabel: option.label, + settings: { + ...this.data.settings, + blank_difficulty: option.value, + }, + }) + }, + toggleSetting(e) { + const key = e.currentTarget.dataset.key + const settings = { ...this.data.settings } + settings[key] = settings[key] ? 0 : 1 + this.setData({ settings }) + }, save() { if (!app.globalData.openid) { wx.showToast({ title: '请先登录', icon: 'none' }) diff --git a/settings/settings.wxml b/settings/settings.wxml index a96142f..220d0a7 100644 --- a/settings/settings.wxml +++ b/settings/settings.wxml @@ -22,11 +22,17 @@ 挖空数量题型 C 中每题挖空的词数 - {{settings.blank_count}} + + + 挖空难度影响挖空比例与保留字母 - {{settings.blank_difficulty}} + + + {{difficultyLabel}} + + @@ -37,11 +43,11 @@ 交互设置 - + 自动进入下一词答题后自动跳转,保持心流状态 {{settings.auto_next_question ? 'ON' : 'OFF'}} - + 提交后显示答案答题后直接显示正确答案 {{settings.show_answer_after_submit ? 'ON' : 'OFF'}} diff --git a/settings/settings.wxss b/settings/settings.wxss index 54c24f2..9bf7fac 100644 --- a/settings/settings.wxss +++ b/settings/settings.wxss @@ -1 +1 @@ -page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12;box-sizing:border-box}.topbar{display:flex;justify-content:space-between;align-items:center;padding:24rpx 32rpx;background:rgba(12,14,18,.8);backdrop-filter:blur(24px);border-bottom:1rpx solid rgba(255,255,255,.08);box-shadow:0 1rpx 20rpx rgba(0,0,0,.08)}.topbar-left,.topbar-right{display:flex;align-items:center;gap:18rpx}.back-btn{width:72rpx;height:72rpx;border-radius:9999rpx;background:#000;color:#aaabb0;display:flex;align-items:center;justify-content:center;border:1rpx solid rgba(255,255,255,.1)}.brand-text{font-size:38rpx;font-weight:800;color:#c19cff}.topbar-icon{font-size:30rpx;color:#aaabb0}.avatar-shell{width:64rpx;height:64rpx;border-radius:9999rpx;overflow:hidden;border:1rpx solid rgba(255,255,255,.1)}.avatar-img{width:100%;height:100%}.content{height:calc(100vh - 120rpx);padding:40rpx 32rpx 32rpx;box-sizing:border-box}.header{margin-bottom:32rpx}.title{display:block;font-size:56rpx;font-weight:800;line-height:1.1}.subtitle{display:block;margin-top:10rpx;color:#aaabb0;font-size:26rpx}.section-block{margin-top:28rpx}.section-head{display:flex;align-items:center;gap:14rpx;margin-bottom:18rpx}.section-ico{width:76rpx;height:76rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;font-size:30rpx}.section-title{font-size:32rpx;font-weight:800}.panel{position:relative;padding:8rpx;border-radius:24rpx;background:rgba(17,19,24,.9);border:1rpx solid rgba(255,255,255,.1);box-shadow:0 20rpx 40rpx rgba(0,0,0,.08)}.row{display:flex;justify-content:space-between;align-items:center;padding:24rpx 20rpx;border-radius:18rpx;background:#1d2025;position:relative;overflow:hidden}.row + .row{margin-top:8rpx}.row:before{content:'';position:absolute;inset:0;border:1rpx solid rgba(255,255,255,.05);border-radius:18rpx;pointer-events:none}.label{display:block;font-size:28rpx;font-weight:600;color:#fff;margin-bottom:6rpx}.desc{display:block;font-size:22rpx;color:#aaabb0}.value-group{display:flex;align-items:center;gap:16rpx}.value{font-size:28rpx;font-weight:800;color:#c19cff}.accent{color:#00e5ff}.edit{font-size:28rpx;color:#aaabb0}.toggle{padding:10rpx 18rpx;border-radius:9999rpx;background:#23262c;color:#aaabb0;font-weight:700}.toggle.on{background:#c19cff;color:#000;box-shadow:0 0 10rpx rgba(193,156,255,.5)}.save-wrap{margin-top:34rpx}.save-btn{width:100%;border-radius:9999rpx;padding:28rpx 0;background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff;font-size:32rpx;font-weight:800;box-shadow:0 0 20rpx rgba(193,156,255,.3)} +page{background:#0c0e12;color:#f6f6fc}.page{min-height:100vh;background:#0c0e12;box-sizing:border-box}.topbar{display:flex;justify-content:space-between;align-items:center;padding:24rpx 32rpx;background:rgba(12,14,18,.8);backdrop-filter:blur(24px);border-bottom:1rpx solid rgba(255,255,255,.08);box-shadow:0 1rpx 20rpx rgba(0,0,0,.08)}.topbar-left,.topbar-right{display:flex;align-items:center;gap:18rpx}.back-btn{width:72rpx;height:72rpx;border-radius:9999rpx;background:#000;color:#aaabb0;display:flex;align-items:center;justify-content:center;border:1rpx solid rgba(255,255,255,.1)}.brand-text{font-size:38rpx;font-weight:800;color:#c19cff}.topbar-icon{font-size:30rpx;color:#aaabb0}.avatar-shell{width:64rpx;height:64rpx;border-radius:9999rpx;overflow:hidden;border:1rpx solid rgba(255,255,255,.1)}.avatar-img{width:100%;height:100%}.content{height:calc(100vh - 120rpx);padding:40rpx 32rpx 32rpx;box-sizing:border-box}.header{margin-bottom:32rpx}.title{display:block;font-size:56rpx;font-weight:800;line-height:1.1}.subtitle{display:block;margin-top:10rpx;color:#aaabb0;font-size:26rpx}.section-block{margin-top:28rpx}.section-head{display:flex;align-items:center;gap:14rpx;margin-bottom:18rpx}.section-ico{width:76rpx;height:76rpx;border-radius:9999rpx;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;font-size:30rpx}.section-title{font-size:32rpx;font-weight:800}.panel{position:relative;padding:8rpx;border-radius:24rpx;background:rgba(17,19,24,.9);border:1rpx solid rgba(255,255,255,.1);box-shadow:0 20rpx 40rpx rgba(0,0,0,.08)}.row{display:flex;justify-content:space-between;align-items:center;padding:24rpx 20rpx;border-radius:18rpx;background:#1d2025;position:relative;overflow:hidden}.row + .row{margin-top:8rpx}.row:before{content:'';position:absolute;inset:0;border:1rpx solid rgba(255,255,255,.05);border-radius:18rpx;pointer-events:none}.label{display:block;font-size:28rpx;font-weight:600;color:#fff;margin-bottom:6rpx}.desc{display:block;font-size:22rpx;color:#aaabb0}.value-group{display:flex;align-items:center;gap:16rpx}.value{font-size:28rpx;font-weight:800;color:#c19cff}.accent{color:#00e5ff}.edit{font-size:28rpx;color:#aaabb0}.setting-input{min-width:140rpx;text-align:right;font-size:28rpx;font-weight:800;color:#c19cff}.picker-value{min-width:140rpx;text-align:right;font-size:28rpx;font-weight:800}.toggle{padding:10rpx 18rpx;border-radius:9999rpx;background:#23262c;color:#aaabb0;font-weight:700}.toggle.on{background:#c19cff;color:#000;box-shadow:0 0 10rpx rgba(193,156,255,.5)}.save-wrap{margin-top:34rpx}.save-btn{width:100%;border-radius:9999rpx;padding:28rpx 0;background:linear-gradient(90deg,#c19cff,#9146ff);color:#fff;font-size:32rpx;font-weight:800;box-shadow:0 0 20rpx rgba(193,156,255,.3)} diff --git a/vocab-manage/vocab-manage.wxml b/vocab-manage/vocab-manage.wxml index aa570a8..8685f9a 100644 --- a/vocab-manage/vocab-manage.wxml +++ b/vocab-manage/vocab-manage.wxml @@ -5,12 +5,12 @@ 管理并策划你的个人词汇集合。 - +