From e1a7764174b05a0c3a758fdfff24243b249af159 Mon Sep 17 00:00:00 2001 From: cc <94575594@qq.com> Date: Fri, 20 Mar 2026 11:46:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(router):=20=E6=B7=BB=E5=8A=A0=E6=8B=BC?= =?UTF-8?q?=E5=86=99=E7=BB=83=E4=B9=A0=E8=B7=AF=E7=94=B1=E5=92=8C=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plans/单词听写功能页面开发_85c008d0.md | 128 ++ src/router/index.js | 6 + src/views/HomePage.vue | 2 +- src/views/SpellPractice.vue | 1278 +++++++++++++++++ 4 files changed, 1413 insertions(+), 1 deletion(-) create mode 100644 .codebuddy/plans/单词听写功能页面开发_85c008d0.md create mode 100644 src/views/SpellPractice.vue diff --git a/.codebuddy/plans/单词听写功能页面开发_85c008d0.md b/.codebuddy/plans/单词听写功能页面开发_85c008d0.md new file mode 100644 index 0000000..6a44991 --- /dev/null +++ b/.codebuddy/plans/单词听写功能页面开发_85c008d0.md @@ -0,0 +1,128 @@ +--- +name: 单词听写功能页面开发 +overview: 创建单词听写页面,包含文本输入框、发音配置选项(发音人/朗读次数/语速/是否显示单词)、开始听写按钮,实现基于豆包TTS API的逐词朗读功能 +design: + architecture: + framework: vue + styleKeywords: + - Dark Theme + - Glassmorphism + - Amber Accent + - Gradient + fontSystem: + fontFamily: Inter + heading: + size: 1.5rem + weight: 600 + subheading: + size: 1.125rem + weight: 500 + body: + size: 1rem + weight: 400 + colorSystem: + primary: + - "#f59e0b" + - "#d97706" + background: + - "#0d0f17" + - "#1a1d27" + text: + - "#ffffff" + - "#94a3b8" + functional: + - "#22c55e" + - "#ef4444" +todos: + - id: create-spell-practice-component + content: 创建 SpellPractice.vue 听写组件,集成 TTS API 和播放控制逻辑 + status: completed + - id: add-spell-practice-route + content: 在 router/index.js 中添加 /spell-practice 路由 + status: completed + dependencies: + - create-spell-practice-component + - id: update-homepage-navigation + content: 更新 HomePage.vue 中单词听写卡片的路由跳转 + status: completed + dependencies: + - add-spell-practice-route +--- + +## 单词听写功能需求 + +### 核心功能 + +1. **单词列表输入**:提供文本输入框,用户可输入需要听写的单词列表(每行一个单词) +2. **发音配置**: + +- 发音人选择:复用豆包 TTS 的英语音色(Dacey/Tim/Stokie/Tina) +- 朗读次数:每个单词朗读 1-5 次可调 +- 语速调节:0.5x - 2.0x 可调 +- 显示控制:朗读时是否显示单词信息(开关切换) + +3. **听写控制**: + +- "开始听写"按钮触发逐个朗读 +- 当前播放进度指示 +- 暂停/继续/重播当前单词控制 +- 听写完成后显示统计 + +### 页面布局 + +- 顶部导航栏(返回按钮+标题) +- 左侧:单词输入区 + 配置面板 +- 右侧:听写进度/控制区 + +## 技术实现方案 + +### 技术栈 + +- Vue 3 Composition API +- 豆包 TTS API(复用 Pronunciation.vue 的实现模式) +- 纯前端实现,无额外后端依赖 + +### 核心实现 + +1. **音频生成**:复用 Pronunciation.vue 的 TTS 调用逻辑,逐个单词调用 API 生成音频 +2. **播放控制**:使用 HTML5 Audio API,通过 Audio 元素的 onended 事件触发下一个单词 +3. **状态管理**:使用 Vue ref 管理听写状态(待听写/播放中/暂停/已完成) +4. **配置传递**:语速通过 audio.playbackRate 设置 + +### 关键逻辑 + +- 单词解析:按换行符分割输入文本,过滤空行和首尾空格 +- 循环播放:使用递归 + onended 事件实现指定次数朗读 +- 进度跟踪:currentIndex + totalWords 计算进度百分比 +- 音频预加载:当前单词播放时可预加载下一个单词音频,提升体验 + +### 文件修改清单 + +- [新建] src/views/SpellPractice.vue - 听写页面组件 +- [修改] src/router/index.js - 添加路由配置 +- [修改] src/views/HomePage.vue - 更新卡片路由 + +## 设计风格 + +沿用项目现有的深色玻璃态设计语言,保持视觉一致性。 + +### 页面结构 + +- 顶部导航栏:返回按钮 + "单词听写" 标题 +- 主内容区采用左右分栏布局: +- 左侧(55%):单词输入文本框 + 发音配置面板 +- 右侧(45%):听写控制台,显示播放进度和操作按钮 + +### 视觉元素 + +- 玻璃态卡片背景(rgba 透明度 + backdrop-filter blur) +- 主色调采用 Amber (#f59e0b),与首页单词听写卡片配色呼应 +- 播放状态下的动态波形动画 +- 进度条采用渐变填充效果 + +### 交互细节 + +- 输入框获取焦点时边框高亮 +- 配置项使用滑块和开关控件 +- 播放按钮悬停放大效果 +- 当前播放单词突出显示 \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index dd1ae5e..543d553 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -4,6 +4,7 @@ import Pronunciation from '../views/Pronunciation.vue' import Speaking from '../views/Speaking.vue' import EssayCorrection from '../views/EssayCorrection.vue' import ExamAnalysis from '../views/ExamAnalysis.vue' +import SpellPractice from '../views/SpellPractice.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -32,6 +33,11 @@ const router = createRouter({ path: '/exam-analysis', name: 'exam-analysis', component: ExamAnalysis + }, + { + path: '/spell-practice', + name: 'spell-practice', + component: SpellPractice } ] }) diff --git a/src/views/HomePage.vue b/src/views/HomePage.vue index bd8ebd2..0f4d41f 100644 --- a/src/views/HomePage.vue +++ b/src/views/HomePage.vue @@ -43,7 +43,7 @@ const features = ref([ desc: "自适应发音报词,智能追踪拼写薄弱点,让词汇记忆更高效。", class: "card-5", icon: "spell", - route: null, + route: "/spell-practice", }, { id: 6, diff --git a/src/views/SpellPractice.vue b/src/views/SpellPractice.vue new file mode 100644 index 0000000..0df670e --- /dev/null +++ b/src/views/SpellPractice.vue @@ -0,0 +1,1278 @@ + + + + + + + + + + 返回首页 + + 单词听写 + + + + + + + + + 单词列表 + {{ wordList.length }} 个单词 + + + + + + + + + + + {{ statusText }} + + + + + + + {{ completedWords }} / {{ wordList.length }} + + + + + + {{ currentWord }} + + 第 {{ currentRepeatIndex + 1 }} / {{ repeatCount }} 遍 + + + + + + + + + + + + + + + + + + + + + + + + + + 开始听写 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 重新听写 + + + + + + 重置 + + + + + + + + + + 发音配置 + + + + + 选择发音人 + + + {{ voice.avatar }} + {{ voice.name }} + + + + + + + + 朗读次数 + {{ repeatCount }} 次 + + + + 1 + 3 + 5 + + + + + + + 朗读语速 + {{ speechRate.toFixed(1) }}x + + + + 0.5x + 1.0x + 2.0x + + + + + + + 单词间隔 + {{ wordInterval.toFixed(1) }}s + + + + 0.5s + 2.5s + 5s + + + + + + + 重复朗读间隔 + {{ repeatInterval.toFixed(1) }}s + + + + 0s + 1.5s + 3s + + + + + + + +