From 6fb13bd12f081a2a1d98d4aacc57835fd4156cdb Mon Sep 17 00:00:00 2001 From: cc <94575594@qq.com> Date: Fri, 20 Mar 2026 16:57:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(router):=20=E6=B7=BB=E5=8A=A0=E8=AF=95?= =?UTF-8?q?=E9=A2=98=E8=AE=B2=E8=A7=A3=E8=A7=86=E9=A2=91=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../英语试题讲解视频生成页面开发_a19e6819.md | 141 +++ src/router/index.js | 6 + src/views/HomePage.vue | 29 + src/views/Speaking.vue | 11 +- src/views/VideoExplanation.vue | 895 ++++++++++++++++++ vite.config.js | 1 + 6 files changed, 1082 insertions(+), 1 deletion(-) create mode 100644 .codebuddy/plans/英语试题讲解视频生成页面开发_a19e6819.md create mode 100644 src/views/VideoExplanation.vue diff --git a/.codebuddy/plans/英语试题讲解视频生成页面开发_a19e6819.md b/.codebuddy/plans/英语试题讲解视频生成页面开发_a19e6819.md new file mode 100644 index 0000000..97c3049 --- /dev/null +++ b/.codebuddy/plans/英语试题讲解视频生成页面开发_a19e6819.md @@ -0,0 +1,141 @@ +--- +name: 英语试题讲解视频生成页面开发 +overview: 开发一个英语试题讲解视频生成页面,包含试题文本输入、视频生成按钮、AI模型调用及视频预览区域,支持生成进度展示。 +design: + architecture: + framework: react + styleKeywords: + - Dark Glassmorphism + - Teal Accent + - Smooth Animations + - Card-based Layout + fontSystem: + fontFamily: Inter, PingFang SC, -apple-system, sans-serif + heading: + size: 1.2rem + weight: 600 + subheading: + size: 1rem + weight: 600 + body: + size: 0.95rem + weight: 400 + colorSystem: + primary: + - "#14b8a6" + - "#0d9488" + background: + - "#0a0a0f" + - rgba(255,255,255,0.03) + text: + - "#ffffff" + - rgba(255,255,255,0.7) + functional: + - "#14b8a6 (生成/播放)" + - "#f87171 (错误)" + - "#fbbf24 (进度)" +todos: + - id: create-video-explanation-page + content: 创建 VideoExplanation.vue 页面组件,包含输入区、生成按钮、进度展示和视频预览区 + status: completed + - id: add-router-config + content: 在 router/index.js 添加 /video-explanation 路由配置 + status: completed + dependencies: + - create-video-explanation-page + - id: add-homepage-nav-entry + content: 在 HomePage.vue 添加视频讲解功能入口卡片 + status: completed + dependencies: + - add-router-config +--- + +## 产品概述 + +开发一个英语试题讲解视频生成页面,用户输入试题内容后,系统调用最优AI模型生成对应的讲解视频。 + +## 核心功能 + +1. **试题输入**:提供文本输入框,支持用户粘贴或输入英语试题内容 +2. **视频生成**:调用AI模型生成讲解视频,提供生成进度展示 +3. **视频预览**:在页面右侧展示生成的视频内容,支持播放控制 +4. **状态管理**:处理空闲、生成中、已完成、错误等多种状态 + +## 界面布局 + +- 左侧面板:试题文本输入区 + 生成按钮 +- 右侧面板:视频预览区域 + 生成进度 +- 顶部导航栏:包含返回按钮和页面标题 + +## 技术栈 + +- **前端框架**:Vue 3 (Composition API + script setup) +- **路由管理**:Vue Router +- **HTTP请求**:Axios (支持流式响应) +- **构建工具**:Vite + +## 实现方案 + +### 架构设计 + +- 页面组件:VideoExplanation.vue(单文件组件) +- 路由配置:在 router/index.js 中添加 `/video-explanation` 路由 +- 导航入口:在 HomePage.vue 添加功能入口卡片 + +### 核心模块 + +1. **输入模块**:文本输入框,支持内容字数统计 +2. **生成模块**:调用AI视频生成API,实时获取生成进度 +3. **预览模块**:视频播放器组件,支持播放/暂停控制 +4. **状态模块**:统一管理 idle/generating/done/error 状态 + +### API调用策略 + +- 使用 Axios 发起 POST 请求调用视频生成接口 +- 支持流式响应解析,实时更新生成进度 +- 进度信息通过 SSE 或增量文本返回 + +### 目录结构 + +``` +src/ +├── views/ +│ └── VideoExplanation.vue # [NEW] 视频讲解页面组件 +├── router/ +│ └── index.js # [MODIFY] 添加视频讲解路由 +└── views/ + └── HomePage.vue # [MODIFY] 添加导航入口卡片 +``` + +## 设计风格 + +继承项目现有的深色半透明玻璃态设计语言,保持一致的视觉体验: + +- 深色背景 (#0a0a0f) 配合半透明卡片 +- Teal 主色调 (#14b8a6) 用于主要按钮和强调元素 +- 圆角设计 (16-20px) 营造现代感 +- 毛玻璃效果 (backdrop-filter: blur) 增强层次感 +- 柔和阴影和渐变边框提升质感 + +## 布局设计 + +### 页面结构 + +- **顶部导航栏**:返回按钮 + 页面标题(渐变色) +- **主内容区**:左右分栏布局(420px左侧 + 自适应右侧) +- **左侧面板**:输入区域 + 操作按钮 +- **右侧面板**:视频预览 + 进度展示 + +### 视频预览区 + +- 视频播放器居中展示 +- 支持播放/暂停/进度条控制 +- 生成中显示动画进度指示器 +- 空闲状态显示引导提示 + +## 动效设计 + +- 按钮悬停:上浮 + 阴影增强 +- 加载状态:旋转spinner + 脉冲动画 +- 卡片入场:fadeInUp 动画 +- 进度展示:动态进度条 + 百分比 \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 543d553..5d54e10 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -5,6 +5,7 @@ import Speaking from '../views/Speaking.vue' import EssayCorrection from '../views/EssayCorrection.vue' import ExamAnalysis from '../views/ExamAnalysis.vue' import SpellPractice from '../views/SpellPractice.vue' +import VideoExplanation from '../views/VideoExplanation.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -38,6 +39,11 @@ const router = createRouter({ path: '/spell-practice', name: 'spell-practice', component: SpellPractice + }, + { + path: '/video-explanation', + name: 'video-explanation', + component: VideoExplanation } ] }) diff --git a/src/views/HomePage.vue b/src/views/HomePage.vue index 0f4d41f..23381db 100644 --- a/src/views/HomePage.vue +++ b/src/views/HomePage.vue @@ -53,6 +53,14 @@ const features = ref([ icon: "speaker", route: "/pronunciation", }, + { + id: 7, + title: "试题讲解视频", + desc: "输入英语试题,一键调用 OpenAI Sora 生成专业讲解视频,AI 智能分析考点并生成可视化讲解内容。", + class: "card-7", + icon: "video", + route: "/video-explanation", + }, ]); // Hover effect for glassmorphism glare @@ -187,6 +195,22 @@ onUnmounted(() => { /> + + + + + { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +}; + const currentScene = computed(() => scenes.find((s) => s.id === activeScene.value)); // 发送场景欢迎语 @@ -173,7 +182,7 @@ const synthesizeAndPlay = async (text, msgId) => { "X-Api-App-Id": DOUBAO_APP_ID, "X-Api-Access-Key": DOUBAO_ACCESS_TOKEN, "X-Api-Resource-Id": DOUBAO_RESOURCE_ID, - "X-Api-Request-Id": crypto.randomUUID(), + "X-Api-Request-Id": generateUUID(), }, body: JSON.stringify(payload), }); diff --git a/src/views/VideoExplanation.vue b/src/views/VideoExplanation.vue new file mode 100644 index 0000000..3f5047f --- /dev/null +++ b/src/views/VideoExplanation.vue @@ -0,0 +1,895 @@ + + +
+ + + + +
+ {{ errorMsg }} + +
+ + +
+ +
+ +
+
+ + + + + + + 试题内容 +
+ +
{{ textInput.length }} 字符
+
+ + +
+ + + + + +
+
+ + +
+ +
+
+ + + + + + + + + + +
+

视频预览区

+

+ 输入试题内容并点击「生成讲解视频」,AI 将自动生成专业的讲解视频 +

+
+ + +
+
+
+
+ + + +
+
+

AI 正在生成视频

+

nano-banana

+ + +
+
+
+
+
+ {{ progress }}% + {{ progressText }} +
+
+
+
+ + +
+
+ +
+
+
+ + + + 视频生成完成 +
+

视频已准备就绪,可以播放查看讲解效果

+
+
+ + +
+
+ + + + + +
+

生成失败

+

请检查网络连接或 API 配置后重试

+
+
+
+
+ + + diff --git a/vite.config.js b/vite.config.js index 74545bb..2e8cc78 100644 --- a/vite.config.js +++ b/vite.config.js @@ -11,6 +11,7 @@ export default defineConfig({ } }, server: { + host: '0.0.0.0', proxy: { '/tts-api': { target: 'https://openspeech.bytedance.com',