245 lines
5.6 KiB
Markdown
245 lines
5.6 KiB
Markdown
|
|
# 课程章节考试功能集成说明
|
|||
|
|
|
|||
|
|
## 🎯 功能目标
|
|||
|
|
|
|||
|
|
实现点击课程详情页面右侧课程章节中的考试部分,能够跳转到之前创建的考试页面功能。
|
|||
|
|
|
|||
|
|
## 📋 实现内容
|
|||
|
|
|
|||
|
|
### 1. 考试识别逻辑
|
|||
|
|
```javascript
|
|||
|
|
// 判断是否为考试课程
|
|||
|
|
const isExamLesson = (section: CourseSection) => {
|
|||
|
|
return section.name.includes('考试') || section.name.includes('测试')
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 考试处理函数
|
|||
|
|
|
|||
|
|
#### 未报名状态页面 (CourseDetail.vue)
|
|||
|
|
```javascript
|
|||
|
|
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)
|
|||
|
|
```javascript
|
|||
|
|
// 处理考试
|
|||
|
|
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. 路由配置
|
|||
|
|
```typescript
|
|||
|
|
// 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. 考试章节显示
|
|||
|
|
```html
|
|||
|
|
<!-- 考试图标 - 可点击 -->
|
|||
|
|
<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. 考试徽章样式
|
|||
|
|
```css
|
|||
|
|
.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. 参数传递
|
|||
|
|
```javascript
|
|||
|
|
// 传递的参数
|
|||
|
|
{
|
|||
|
|
params: {
|
|||
|
|
courseId: '1', // 课程ID
|
|||
|
|
sectionId: '15' // 章节ID(考试ID)
|
|||
|
|
},
|
|||
|
|
query: {
|
|||
|
|
courseName: '课程标题', // 课程名称
|
|||
|
|
examName: '期末考试' // 考试名称
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📱 模拟数据
|
|||
|
|
|
|||
|
|
### 考试章节示例
|
|||
|
|
```javascript
|
|||
|
|
// 模拟数据中的考试章节
|
|||
|
|
{
|
|||
|
|
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. 完成完整的考试流程
|
|||
|
|
|
|||
|
|
考试功能已完全集成到课程学习流程中!🚀
|