feat(router): 添加拼写练习路由和页面

This commit is contained in:
cc 2026-03-20 11:46:18 +08:00
parent 18ac423352
commit e1a7764174
4 changed files with 1413 additions and 1 deletions

View File

@ -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),与首页单词听写卡片配色呼应
- 播放状态下的动态波形动画
- 进度条采用渐变填充效果
### 交互细节
- 输入框获取焦点时边框高亮
- 配置项使用滑块和开关控件
- 播放按钮悬停放大效果
- 当前播放单词突出显示

View File

@ -4,6 +4,7 @@ import Pronunciation from '../views/Pronunciation.vue'
import Speaking from '../views/Speaking.vue' import Speaking from '../views/Speaking.vue'
import EssayCorrection from '../views/EssayCorrection.vue' import EssayCorrection from '../views/EssayCorrection.vue'
import ExamAnalysis from '../views/ExamAnalysis.vue' import ExamAnalysis from '../views/ExamAnalysis.vue'
import SpellPractice from '../views/SpellPractice.vue'
const router = createRouter({ const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL), history: createWebHistory(import.meta.env.BASE_URL),
@ -32,6 +33,11 @@ const router = createRouter({
path: '/exam-analysis', path: '/exam-analysis',
name: 'exam-analysis', name: 'exam-analysis',
component: ExamAnalysis component: ExamAnalysis
},
{
path: '/spell-practice',
name: 'spell-practice',
component: SpellPractice
} }
] ]
}) })

View File

@ -43,7 +43,7 @@ const features = ref([
desc: "自适应发音报词,智能追踪拼写薄弱点,让词汇记忆更高效。", desc: "自适应发音报词,智能追踪拼写薄弱点,让词汇记忆更高效。",
class: "card-5", class: "card-5",
icon: "spell", icon: "spell",
route: null, route: "/spell-practice",
}, },
{ {
id: 6, id: 6,

1278
src/views/SpellPractice.vue Normal file

File diff suppressed because it is too large Load Diff