298 lines
7.7 KiB
Markdown
298 lines
7.7 KiB
Markdown
![]() |
# 已报名状态课程详情页面创建说明
|
|||
|
|
|||
|
## 🎯 创建目标
|
|||
|
|
|||
|
基于未报名状态下的页面样式和布局,重新创建一个已报名成功状态下的课程详情页面,该页面具有:
|
|||
|
|
|||
|
1. 相同的样式和布局结构
|
|||
|
2. 右侧课程章节显示为彩色且可点击
|
|||
|
3. 点击视频按钮可以正常播放
|
|||
|
4. 完整的学习功能和进度跟踪
|
|||
|
|
|||
|
## 📋 新页面特性
|
|||
|
|
|||
|
### 1. 页面结构
|
|||
|
```
|
|||
|
CourseDetailEnrolled.vue
|
|||
|
├── 面包屑导航
|
|||
|
├── 视频播放器区域(可播放视频)
|
|||
|
├── 课程信息区域
|
|||
|
│ ├── 课程标题和元信息
|
|||
|
│ ├── 课程描述
|
|||
|
│ ├── 讲师信息
|
|||
|
│ └── 课程标签页(介绍/评论)
|
|||
|
└── 右侧边栏
|
|||
|
├── 学习进度显示
|
|||
|
├── 课程章节列表(彩色可点击)
|
|||
|
└── 推荐课程
|
|||
|
```
|
|||
|
|
|||
|
### 2. 核心功能差异
|
|||
|
|
|||
|
**未报名状态页面**:
|
|||
|
- 课程章节:灰色不可点击
|
|||
|
- 视频区域:显示报名提示
|
|||
|
- 操作按钮:立即报名
|
|||
|
|
|||
|
**已报名状态页面**:
|
|||
|
- 课程章节:彩色可点击
|
|||
|
- 视频区域:可播放视频
|
|||
|
- 学习进度:显示学习进度条
|
|||
|
- 操作功能:完整的学习功能
|
|||
|
|
|||
|
### 3. 视频播放功能
|
|||
|
```html
|
|||
|
<div class="video-container">
|
|||
|
<video
|
|||
|
v-if="currentVideoUrl"
|
|||
|
:src="currentVideoUrl"
|
|||
|
controls
|
|||
|
class="video-element"
|
|||
|
@loadstart="handleVideoLoadStart"
|
|||
|
@canplay="handleVideoCanPlay"
|
|||
|
@error="handleVideoError">
|
|||
|
您的浏览器不支持视频播放
|
|||
|
</video>
|
|||
|
<div v-else class="video-placeholder">
|
|||
|
<div class="placeholder-content">
|
|||
|
<div class="play-icon">...</div>
|
|||
|
<p>请选择要播放的视频课程</p>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
```
|
|||
|
|
|||
|
### 4. 学习进度跟踪
|
|||
|
```html
|
|||
|
<div class="progress-section">
|
|||
|
<div class="progress-header">
|
|||
|
<h3>学习进度</h3>
|
|||
|
<span class="progress-text">{{ completedLessons }}/{{ totalSections }}</span>
|
|||
|
</div>
|
|||
|
<div class="progress-bar">
|
|||
|
<div class="progress-fill" :style="{ width: progress + '%' }"></div>
|
|||
|
</div>
|
|||
|
<p class="progress-desc">已完成 {{ progress }}%</p>
|
|||
|
</div>
|
|||
|
```
|
|||
|
|
|||
|
## 🎨 样式特点
|
|||
|
|
|||
|
### 1. 彩色课程章节
|
|||
|
```css
|
|||
|
/* 课程类型徽章彩色样式 */
|
|||
|
.badge-video {
|
|||
|
background: #e6f7ff;
|
|||
|
color: #1890ff;
|
|||
|
border: 1px solid #91d5ff;
|
|||
|
}
|
|||
|
|
|||
|
.badge-resource {
|
|||
|
background: #f6ffed;
|
|||
|
color: #52c41a;
|
|||
|
border: 1px solid #b7eb8f;
|
|||
|
}
|
|||
|
|
|||
|
.badge-homework {
|
|||
|
background: #fff2e6;
|
|||
|
color: #fa8c16;
|
|||
|
border: 1px solid #ffd591;
|
|||
|
}
|
|||
|
|
|||
|
.badge-exam {
|
|||
|
background: #fff1f0;
|
|||
|
color: #f5222d;
|
|||
|
border: 1px solid #ffa39e;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 2. 可点击交互
|
|||
|
```css
|
|||
|
.lesson-content {
|
|||
|
cursor: pointer;
|
|||
|
transition: all 0.3s;
|
|||
|
}
|
|||
|
|
|||
|
.lesson-content:hover {
|
|||
|
background: #f8f9fa;
|
|||
|
}
|
|||
|
|
|||
|
.lesson-content:hover .lesson-title {
|
|||
|
color: #1890ff;
|
|||
|
}
|
|||
|
|
|||
|
/* 操作按钮彩色样式 */
|
|||
|
.video-btn { color: #1890ff; }
|
|||
|
.download-btn { color: #52c41a; }
|
|||
|
.edit-btn { color: #fa8c16; }
|
|||
|
.exam-btn { color: #f5222d; }
|
|||
|
```
|
|||
|
|
|||
|
### 3. 学习进度样式
|
|||
|
```css
|
|||
|
.progress-bar {
|
|||
|
width: 100%;
|
|||
|
height: 8px;
|
|||
|
background: #f0f0f0;
|
|||
|
border-radius: 4px;
|
|||
|
overflow: hidden;
|
|||
|
}
|
|||
|
|
|||
|
.progress-fill {
|
|||
|
height: 100%;
|
|||
|
background: linear-gradient(90deg, #1890ff, #52c41a);
|
|||
|
border-radius: 4px;
|
|||
|
transition: width 0.3s ease;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 🔧 功能实现
|
|||
|
|
|||
|
### 1. 视频播放处理
|
|||
|
```javascript
|
|||
|
// 处理视频播放 - 已报名状态,可以正常播放
|
|||
|
const handleVideoPlay = (section: CourseSection) => {
|
|||
|
console.log('播放视频:', section.name, section.outline)
|
|||
|
currentVideoUrl.value = section.outline || ''
|
|||
|
currentSection.value = section
|
|||
|
|
|||
|
// 标记为已完成
|
|||
|
if (!section.completed) {
|
|||
|
section.completed = true
|
|||
|
// 重新计算进度
|
|||
|
const completed = courseSections.value.filter(s => s.completed).length
|
|||
|
completedLessons.value = completed
|
|||
|
progress.value = Math.round((completed / courseSections.value.length) * 100)
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 2. 学习进度计算
|
|||
|
```javascript
|
|||
|
// 计算学习进度
|
|||
|
const loadMockData = () => {
|
|||
|
const mockSections = generateMockSections()
|
|||
|
courseSections.value = mockSections
|
|||
|
groupedSections.value = groupSectionsByChapter(mockSections)
|
|||
|
|
|||
|
// 计算学习进度
|
|||
|
const completed = mockSections.filter(section => section.completed).length
|
|||
|
completedLessons.value = completed
|
|||
|
totalSections.value = mockSections.length
|
|||
|
progress.value = Math.round((completed / mockSections.length) * 100)
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 3. 章节点击处理
|
|||
|
```javascript
|
|||
|
// 处理章节点击 - 已报名状态,可以正常点击
|
|||
|
const handleSectionClick = (section: CourseSection) => {
|
|||
|
console.log('点击课程章节:', section.name)
|
|||
|
currentSection.value = section
|
|||
|
|
|||
|
// 根据类型执行不同操作
|
|||
|
if (isVideoLesson(section)) {
|
|||
|
handleVideoPlay(section)
|
|||
|
} else if (isResourceLesson(section)) {
|
|||
|
handleDownload(section)
|
|||
|
} else if (isHomeworkLesson(section)) {
|
|||
|
handleHomework(section)
|
|||
|
} else if (isExamLesson(section)) {
|
|||
|
handleExam(section)
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 🚀 路由配置
|
|||
|
|
|||
|
### 1. 新增路由
|
|||
|
```typescript
|
|||
|
// router/index.ts
|
|||
|
{
|
|||
|
path: '/course/:id/enrolled',
|
|||
|
name: 'CourseDetailEnrolled',
|
|||
|
component: CourseDetailEnrolled,
|
|||
|
meta: {
|
|||
|
title: '课程详情 - 已报名'
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 2. 跳转逻辑
|
|||
|
```javascript
|
|||
|
// 原CourseDetail页面报名成功后跳转
|
|||
|
setTimeout(() => {
|
|||
|
enrollSuccessVisible.value = false
|
|||
|
// 跳转到已报名状态页面
|
|||
|
router.push(`/course/${courseId.value}/enrolled`)
|
|||
|
}, 2000)
|
|||
|
```
|
|||
|
|
|||
|
## 📱 用户体验流程
|
|||
|
|
|||
|
### 完整的学习体验
|
|||
|
1. **未报名状态**:`/course/1` - 灰色不可点击章节
|
|||
|
2. **点击报名**:显示报名确认弹窗
|
|||
|
3. **报名成功**:显示成功提示"正在跳转到已报名状态页面..."
|
|||
|
4. **自动跳转**:跳转到 `/course/1/enrolled`
|
|||
|
5. **已报名状态**:彩色可点击章节,可播放视频
|
|||
|
6. **学习功能**:
|
|||
|
- 点击视频章节 → 播放视频
|
|||
|
- 点击资料章节 → 下载资源
|
|||
|
- 点击作业章节 → 打开作业
|
|||
|
- 点击考试章节 → 开始考试
|
|||
|
- 自动更新学习进度
|
|||
|
|
|||
|
### 视觉对比
|
|||
|
**未报名页面** (`/course/1`):
|
|||
|
```
|
|||
|
课程章节 ⋮ 正序
|
|||
|
─────────────────────────────────
|
|||
|
第一章 课前准备 (灰色)
|
|||
|
├── 📹 开课彩蛋 (灰色不可点击)
|
|||
|
├── 📹 课程定位 (灰色不可点击)
|
|||
|
└── ...
|
|||
|
|
|||
|
[立即报名] 按钮
|
|||
|
```
|
|||
|
|
|||
|
**已报名页面** (`/course/1/enrolled`):
|
|||
|
```
|
|||
|
学习进度: 3/24 (12%)
|
|||
|
▓▓░░░░░░░░░░░░░░░░░░ 12%
|
|||
|
|
|||
|
课程章节 ⋮ 正序
|
|||
|
─────────────────────────────────
|
|||
|
第一章 课前准备 (正常色)
|
|||
|
├── 📹 开课彩蛋 (蓝色可点击) ✓
|
|||
|
├── 📹 课程定位 (蓝色可点击) ✓
|
|||
|
├── 📹 学习建议 (蓝色可点击) ✓
|
|||
|
└── 📄 准备PPT (绿色可点击)
|
|||
|
|
|||
|
第二章 程序设计基础知识
|
|||
|
├── 📹 程序设计入门 (蓝色可点击) ✓
|
|||
|
├── 📄 操作PPT (绿色可点击)
|
|||
|
└── ...
|
|||
|
```
|
|||
|
|
|||
|
## ✅ 功能特点
|
|||
|
|
|||
|
### 已报名状态页面优势
|
|||
|
1. **完整学习体验**:视频播放、资源下载、作业考试
|
|||
|
2. **进度跟踪**:实时显示学习进度和完成状态
|
|||
|
3. **彩色交互**:直观的颜色区分不同类型内容
|
|||
|
4. **响应式设计**:适配不同屏幕尺寸
|
|||
|
5. **状态持久化**:学习进度和完成状态保存
|
|||
|
|
|||
|
### 与未报名页面的区别
|
|||
|
- **视觉效果**:彩色 vs 灰色
|
|||
|
- **交互能力**:可点击 vs 不可点击
|
|||
|
- **功能完整性**:完整学习功能 vs 仅预览
|
|||
|
- **进度跟踪**:有进度显示 vs 无进度显示
|
|||
|
|
|||
|
现在您有了两个独立的页面:
|
|||
|
- `/course/:id` - 未报名状态(灰色不可点击)
|
|||
|
- `/course/:id/enrolled` - 已报名状态(彩色可点击)
|
|||
|
|
|||
|
用户报名成功后会自动跳转到已报名状态页面,体验完整的学习功能!🎉
|