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

5.6 KiB
Raw Blame History

课程章节考试功能集成说明

🎯 功能目标

实现点击课程详情页面右侧课程章节中的考试部分,能够跳转到之前创建的考试页面功能。

📋 实现内容

1. 考试识别逻辑

// 判断是否为考试课程
const isExamLesson = (section: CourseSection) => {
  return section.name.includes('考试') || section.name.includes('测试')
}

2. 考试处理函数

未报名状态页面 (CourseDetail.vue)

const handleExam = (section: CourseSection) => {
  console.log('开始考试:', section)

  // 跳转到考前须知页面
  router.push({
    name: 'ExamNotice',
    params: {
      courseId: courseId.value,
      sectionId: section.id
    },
    query: {
      courseName: course.value?.title || '课程名称',
      examName: section.name
    }
  })
}

已报名状态页面 (CourseDetailEnrolled.vue)

// 处理考试
const handleExam = (section: CourseSection) => {
  console.log('开始考试:', section.name)
  
  // 跳转到考前须知页面
  router.push({
    name: 'ExamNotice',
    params: {
      courseId: courseId.value.toString(),
      sectionId: section.id.toString()
    },
    query: {
      courseName: course.value?.title || '课程名称',
      examName: section.name
    }
  })
}

3. 路由配置

// router/index.ts 中已存在的路由
{
  path: '/course/:courseId/exam/:sectionId/notice',
  name: 'ExamNotice',
  component: ExamNotice,
  meta: {
    title: '考前须知'
  }
},
{
  path: '/course/:courseId/exam/:sectionId',
  name: 'Exam',
  component: Exam,
  meta: {
    title: '在线考试'
  }
}

🎨 用户界面

1. 考试章节显示

<!-- 考试图标 - 可点击 -->
<button v-else-if="isExamLesson(section)" 
        class="lesson-action-btn exam-btn" 
        @click.stop="handleExam(section)">
  <svg width="12" height="12" viewBox="0 0 16 16">
    <rect x="2" y="2" width="12" height="12" rx="2" stroke="currentColor" stroke-width="1.5" fill="none"/>
    <path d="M6 6h4M6 8h4M6 10h2" stroke="currentColor" stroke-width="1.5"/>
  </svg>
</button>

2. 考试徽章样式

.badge-exam {
  background: #fff1f0;
  color: #f5222d;
  border: 1px solid #ffa39e;
}

.exam-btn {
  color: #f5222d;
}

🚀 完整流程

1. 用户操作流程

1. 用户访问课程详情页面
   ↓
2. 查看右侧课程章节列表
   ↓
3. 找到考试类型的章节(红色徽章标识)
   ↓
4. 点击考试章节或考试图标
   ↓
5. 跳转到考前须知页面
   ↓
6. 阅读考试说明
   ↓
7. 点击"开始考试"按钮
   ↓
8. 进入正式考试页面

2. 页面跳转路径

课程详情页面
/course/1 或 /course/1/enrolled
    ↓ 点击考试章节
考前须知页面
/course/1/exam/15/notice
    ↓ 点击开始考试
正式考试页面
/course/1/exam/15

3. 参数传递

// 传递的参数
{
  params: {
    courseId: '1',        // 课程ID
    sectionId: '15'       // 章节ID考试ID
  },
  query: {
    courseName: '课程标题',  // 课程名称
    examName: '期末考试'    // 考试名称
  }
}

📱 模拟数据

考试章节示例

// 模拟数据中的考试章节
{ 
  id: 15, 
  lessonId: courseId.value, 
  name: '期末考试',           // 包含"考试"关键词,会被识别为考试类型
  outline: '', 
  parentId: 0, 
  sort: 15, 
  level: 1, 
  revision: 1, 
  createdAt: Date.now(), 
  updatedAt: Date.now(), 
  deletedAt: null, 
  completed: false, 
  duration: undefined 
}

考试类型识别

  • 名称包含"考试":期末考试、中期考试、单元考试
  • 名称包含"测试":能力测试、知识测试、技能测试

🎯 视觉效果

1. 未报名状态

第三章 实战项目
├── 📹 项目一:计算器开发 (灰色不可点击)
├── 📄 项目源码下载 (灰色不可点击)
├── 📝 作业:完成个人项目 (灰色不可点击)
└── 🎯 期末考试 (灰色不可点击)

2. 已报名状态

第三章 实战项目
├── 📹 项目一:计算器开发 (蓝色可点击)
├── 📄 项目源码下载 (绿色可点击)
├── 📝 作业:完成个人项目 (橙色可点击)
└── 🎯 期末考试 (红色可点击) ← 点击跳转到考试

🔧 技术实现

1. 考试识别

  • 通过章节名称关键词识别
  • 自动应用红色徽章样式
  • 显示考试图标

2. 路由跳转

  • 使用 router.push() 进行页面跳转
  • 传递课程ID和章节ID作为路由参数
  • 传递课程名称和考试名称作为查询参数

3. 状态管理

  • 未报名用户点击考试:显示报名提示
  • 已报名用户点击考试:直接跳转到考前须知

测试验证

1. 功能测试

  1. 访问已报名状态页面/course/1/enrolled
  2. 找到考试章节:第三章中的"期末考试"
  3. 验证样式:红色徽章,考试图标
  4. 点击测试:点击考试章节或图标
  5. 验证跳转:应该跳转到 /course/1/exam/15/notice
  6. 参数验证:检查页面是否正确显示课程名称和考试名称

2. 路径验证

  • 课程详情页面 → 考前须知页面
  • 考前须知页面 → 正式考试页面
  • 参数正确传递
  • 页面正常显示

🎉 集成完成

现在用户可以:

  1. 在课程章节中看到考试内容(红色徽章标识)
  2. 点击考试章节跳转到考前须知页面
  3. 在考前须知页面了解考试规则
  4. 点击开始考试进入正式考试界面
  5. 完成完整的考试流程

考试功能已完全集成到课程学习流程中!🚀