OL-LearnPlatform/ENROLLED_PAGE_CREATION.md
2025-08-04 02:13:12 +08:00

7.7 KiB
Raw Blame History

已报名状态课程详情页面创建说明

🎯 创建目标

基于未报名状态下的页面样式和布局,重新创建一个已报名成功状态下的课程详情页面,该页面具有:

  1. 相同的样式和布局结构
  2. 右侧课程章节显示为彩色且可点击
  3. 点击视频按钮可以正常播放
  4. 完整的学习功能和进度跟踪

📋 新页面特性

1. 页面结构

CourseDetailEnrolled.vue
├── 面包屑导航
├── 视频播放器区域(可播放视频)
├── 课程信息区域
│   ├── 课程标题和元信息
│   ├── 课程描述
│   ├── 讲师信息
│   └── 课程标签页(介绍/评论)
└── 右侧边栏
    ├── 学习进度显示
    ├── 课程章节列表(彩色可点击)
    └── 推荐课程

2. 核心功能差异

未报名状态页面

  • 课程章节:灰色不可点击
  • 视频区域:显示报名提示
  • 操作按钮:立即报名

已报名状态页面

  • 课程章节:彩色可点击
  • 视频区域:可播放视频
  • 学习进度:显示学习进度条
  • 操作功能:完整的学习功能

3. 视频播放功能

<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. 学习进度跟踪

<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. 彩色课程章节

/* 课程类型徽章彩色样式 */
.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. 可点击交互

.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. 学习进度样式

.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. 视频播放处理

// 处理视频播放 - 已报名状态,可以正常播放
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. 学习进度计算

// 计算学习进度
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. 章节点击处理

// 处理章节点击 - 已报名状态,可以正常点击
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. 新增路由

// router/index.ts
{
  path: '/course/:id/enrolled',
  name: 'CourseDetailEnrolled',
  component: CourseDetailEnrolled,
  meta: {
    title: '课程详情 - 已报名'
  }
}

2. 跳转逻辑

// 原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 - 已报名状态(彩色可点击)

用户报名成功后会自动跳转到已报名状态页面,体验完整的学习功能!🎉