# 课程可试看功能完整指南 **文档版本**: v2.0 **最后更新**: 2025-10-14 **适用项目**: 环保产业教务系统前端 --- ## 📋 目录 1. [功能概述](#功能概述) 2. [iframe嵌入升级历史](#iframe嵌入升级历史) 3. [快速开始](#快速开始) 4. [详细配置步骤](#详细配置步骤) 5. [完整示例](#完整示例) 6. [技术实现说明](#技术实现说明) 7. [常见问题](#常见问题) 8. [验证清单](#验证清单) --- ## 功能概述 ### 什么是"可试看"功能? - 允许特定课程显示"可试看"标签 - 点击课程后通过**iframe嵌入**展示课程内容(**不是新建页面跳转**) - 非可试看课程显示锁定状态 - 可试看课程会自动排在课程列表最前面 ### ⚡ 重要说明:iframe嵌入功能(已升级) **本项目已升级为iframe嵌入方式,完全复用了文旅项目的实现!** #### 原始实现(已废弃) - ❌ 点击可试看课程后打开**新的浏览器窗口**(使用 `window.open`) - ❌ 用户离开教务系统页面 - ❌ 需要手动切换标签页返回 - ❌ 用户体验不连贯 #### 当前实现(已升级) - ✅ 点击可试看课程后在**当前页面内通过iframe嵌入**显示 - ✅ 用户始终停留在教务系统内 - ✅ 有专门的返回按钮或全屏功能 - ✅ 与文旅项目完全一致的交互体验 #### 当前功能特性 **课程直播间**: - 点击可试看课程后,课程内容会在视频播放区域通过iframe嵌入显示 - 支持全屏功能(右上角有全屏按钮) - iframe自动缩放(zoom: 0.5) - 非可试看课程显示模糊背景+锁定图标 - **不再打开新窗口** **课程作业页面**: - 点击"已完成"按钮后,作业页面会全屏通过iframe嵌入显示 - 顶部有"返回课后作业"按钮 - 显示课程标题 - iframe自动缩放(zoom: 0.8) - **不再打开新窗口** ### 您只需要做什么? **只需修改一个文件**:`src/data/mockData.js` **配置两个字段**: - `canPreview`: 设置为 `true` - `previewUrl`: 设置iframe要显示的URL **其余功能(iframe嵌入、全屏、返回按钮等)已全部自动实现!** --- ## iframe嵌入升级历史 ### 升级信息 **升级日期**:2025-10-14 **升级目的**:将原始的新窗口跳转方式改为iframe嵌入,提升用户体验 **参考项目**:文旅产业教务系统 ### 原始版本的问题 **课程直播间**: ```javascript // 原始代码(已移除) window.open(course.previewUrl, '_blank'); ``` **课程作业**: ```javascript // 原始代码(已移除) setShowIframe(true); // 使用固定URL // 硬编码标题和URL ``` **存在的问题**: - ❌ 打开新的浏览器窗口 - ❌ 用户离开教务系统页面 - ❌ 需要手动切换标签页 - ❌ 用户体验割裂 ### 当前版本的改进 **改进的文件**: 1. `src/components/CoursesVideoPlayer/index.jsx` - 课程直播间iframe嵌入 2. `src/pages/HomeworkPage/index.jsx` - 课程作业动态iframe 3. `src/components/CourseList/index.jsx` - 移除window.open代码 **新增功能**: - ✅ 完整的Fullscreen API支持(课程直播间) - ✅ 跨浏览器兼容(Chrome、Firefox、Safari、Edge) - ✅ 动态iframe数据管理(课程作业) - ✅ 可试看课程自动排序 - ✅ 与文旅项目完全一致的交互体验 ### 升级效果对比 | 功能 | 原始版本 | 当前版本 | |------|---------|---------| | **课程直播间** | | | | 展示方式 | window.open新窗口 | iframe嵌入 | | 全屏功能 | ❌ 无 | ✅ 右上角全屏按钮 | | 缩放适配 | ❌ 无 | ✅ zoom: 0.5(全屏1.0) | | 浏览器兼容 | ❌ 不完善 | ✅ 全浏览器支持 | | **课程作业** | | | | URL来源 | 硬编码 | 动态获取 | | 课程标题 | 固定文本 | 动态显示 | | 支持课程数 | 1个 | 无限 | | 状态管理 | boolean | 数据对象 | | **用户体验** | | | | 页面跳转 | ✅ 打开新窗口 | ❌ 无跳转 | | 用户留存 | ❌ 离开系统 | ✅ 停留系统内 | | 交互流畅度 | ⭐⭐ | ⭐⭐⭐⭐⭐ | --- ## 快速开始 ### 配置位置速查 只需修改 **一个文件**:`src/data/mockData.js` **位置1: 课程直播间(约第680行)** ```javascript // 搜索这段注释找到位置 // 为"水质样品的采样与保存"课程添加试看标签和链接 ``` **位置2: 课程作业(约第5325行)** ```javascript // 搜索这段注释找到位置 // 为水质样品的采样与保存课程添加可试看标记 ``` ### 配置模板 #### 课程直播间配置 ```javascript // 为"您的课程名称"添加试看标签和链接 if (event.title === "课程名称" && unitName === "单元名称") { courseObj.canPreview = true; courseObj.previewUrl = "课程iframe嵌入URL"; } ``` #### 课程作业配置 ```javascript // 为"您的课程名称"作业添加可试看标记 if (course.courseName === "课程名称" && unit.unitName === "单元名称") { homeworkItem.canPreview = true; homeworkItem.previewUrl = "作业iframe嵌入URL"; } ``` ### 配置参数说明 | 字段 | 类型 | 说明 | 示例 | |------|------|------|------| | `event.title` / `course.courseName` | string | 课程名称(必须完全匹配) | `"水质样品的采样与保存"` | | `unitName` / `unit.unitName` | string | 单元名称(必须完全匹配) | `"检验检测实用取样方法"` | | `canPreview` | boolean | 是否可试看(固定值) | `true` | | `previewUrl` | string | 预览URL(iframe地址) | `"https://example.com/course"` | ### ⚠️ 重要注意事项 1. **课程名称和单元名称必须完全匹配** - 包括中英文标点符号、空格等 - 大小写必须一致 - 如果名称不匹配,可试看功能不会生效 2. **URL必须支持iframe嵌入** - 某些网站设置了X-Frame-Options禁止iframe嵌入 - 确保URL可以在浏览器中正常访问 3. **课程作业的URL通常与课程直播间的URL不同** - 课程直播间:课程内容的URL - 课程作业:作业页面的URL --- ## 详细配置步骤 ### 步骤1: 找到课程名称和单元名称 #### 方法1:查看页面显示 直接在课程列表中查看显示的课程名称和单元名称 #### 方法2:使用浏览器控制台 ```javascript // 在浏览器控制台执行 console.log(mockData.courseLiveData.vertical); console.log(mockData.homework); ``` #### 方法3:在代码中搜索 在 `src/data/mockData.js` 中搜索课程相关的关键词 ### 步骤2: 配置课程直播间 在 `src/data/mockData.js` 文件中找到 `generateVerticalCourseLiveList` 函数。 找到这个位置(大约在第680行左右): ```javascript // 为"水质样品的采样与保存"课程添加试看标签和链接 if (event.title === "水质样品的采样与保存" && unitName === "检验检测实用取样方法") { courseObj.canPreview = true; courseObj.previewUrl = "https://du9uay.github.io/environment-education-web/"; } ``` 在上述代码**之后**,添加新的判断条件: ```javascript // 为"您的课程名称"添加试看标签和链接 if (event.title === "您的课程名称" && unitName === "单元名称") { courseObj.canPreview = true; courseObj.previewUrl = "您的iframe嵌入URL"; } ``` ### 步骤3: 配置课程作业 在 `src/data/mockData.js` 文件中,搜索这段注释: ```javascript // 为水质样品的采样与保存课程添加可试看标记 ``` 找到这个位置(大约在第5325行左右): ```javascript // 为水质样品的采样与保存课程添加可试看标记 if (course.courseName === "水质样品的采样与保存" && unit.unitName === "检验检测实用取样方法") { homeworkItem.canPreview = true; homeworkItem.previewUrl = "https://du9uay.github.io/environment-education-web/#/course-test"; } ``` 在上述代码**之后**,添加新的判断条件: ```javascript // 为"您的课程名称"作业添加可试看标记 if (course.courseName === "您的课程名称" && unit.unitName === "单元名称") { homeworkItem.canPreview = true; homeworkItem.previewUrl = "您的作业iframe嵌入URL"; } ``` ### 步骤4: 保存并验证 1. 保存 `mockData.js` 文件 2. 刷新浏览器页面(Vite会自动热更新) 3. 使用验证清单检查功能是否正常 --- ## 完整示例 ### 示例1:为"环境监测技术"课程添加可试看功能 假设要添加的课程信息: - 课程名称:`环境监测技术` - 单元名称:`环境监测基础` - 课程直播URL:`https://example.com/course/monitor` - 作业页面URL:`https://example.com/homework/monitor` #### 配置课程直播间 在 `src/data/mockData.js` 的约第680行位置,添加: ```javascript // 为"水质样品的采样与保存"课程添加试看标签和链接 if (event.title === "水质样品的采样与保存" && unitName === "检验检测实用取样方法") { courseObj.canPreview = true; courseObj.previewUrl = "https://du9uay.github.io/environment-education-web/"; } // 为"环境监测技术"课程添加试看标签和链接 if (event.title === "环境监测技术" && unitName === "环境监测基础") { courseObj.canPreview = true; courseObj.previewUrl = "https://example.com/course/monitor"; } ``` #### 配置课程作业 在 `src/data/mockData.js` 的约第5325行位置,添加: ```javascript // 为水质样品的采样与保存课程添加可试看标记 if (course.courseName === "水质样品的采样与保存" && unit.unitName === "检验检测实用取样方法") { homeworkItem.canPreview = true; homeworkItem.previewUrl = "https://du9uay.github.io/environment-education-web/#/course-test"; } // 为"环境监测技术"课程作业添加可试看标记 if (course.courseName === "环境监测技术" && unit.unitName === "环境监测基础") { homeworkItem.canPreview = true; homeworkItem.previewUrl = "https://example.com/homework/monitor"; } ``` #### 验证配置 1. 保存文件 2. 刷新浏览器 3. 检查: - ✅ 课程列表中"环境监测技术"显示在最前面 - ✅ 课程右侧显示"可试看"蓝色标签 - ✅ 点击课程后在视频区域显示iframe(不打开新窗口) - ✅ 课程作业页面也显示"可试看"标签 - ✅ 点击作业后全屏显示iframe(不打开新窗口) ### 示例2:批量添加多个可试看课程 如果要为多个课程添加可试看功能,只需要重复添加判断条件: ```javascript // 课程直播间 - 批量添加 if (event.title === "水质样品的采样与保存" && unitName === "检验检测实用取样方法") { courseObj.canPreview = true; courseObj.previewUrl = "https://du9uay.github.io/environment-education-web/"; } if (event.title === "环境监测技术" && unitName === "环境监测基础") { courseObj.canPreview = true; courseObj.previewUrl = "https://example.com/course/monitor"; } if (event.title === "大气污染控制" && unitName === "污染控制技术") { courseObj.canPreview = true; courseObj.previewUrl = "https://example.com/course/air"; } ``` ```javascript // 课程作业 - 批量添加 if (course.courseName === "水质样品的采样与保存" && unit.unitName === "检验检测实用取样方法") { homeworkItem.canPreview = true; homeworkItem.previewUrl = "https://du9uay.github.io/environment-education-web/#/course-test"; } if (course.courseName === "环境监测技术" && unit.unitName === "环境监测基础") { homeworkItem.canPreview = true; homeworkItem.previewUrl = "https://example.com/homework/monitor"; } if (course.courseName === "大气污染控制" && unit.unitName === "污染控制技术") { homeworkItem.canPreview = true; homeworkItem.previewUrl = "https://example.com/homework/air"; } ``` --- ## 技术实现说明 ### iframe嵌入与新窗口跳转的区别 #### 新窗口跳转(原始方式 - 已废弃) ```javascript // 原始代码(已移除) window.open(url, '_blank'); ``` **表现**: - 点击课程后打开新的浏览器标签页 - 用户离开当前教务系统页面 - 需要手动切换标签页返回 - 用户体验不连贯 #### iframe嵌入(当前实现) ```javascript // 当前实现 ``` **表现**: - 点击课程后在当前页面内显示课程内容 - 用户始终停留在教务系统内 - 有明确的返回按钮或关闭方式 - 用户体验流畅连贯 ### 实现细节 #### 1. 课程直播间iframe嵌入 **实现位置**:`src/components/CoursesVideoPlayer/index.jsx` **核心代码**: ```jsx // 状态管理 const [isFullscreen, setIsFullscreen] = useState(false); const iframeContainerRef = useRef(null); // 全屏处理 const handleFullscreen = () => { const container = iframeContainerRef.current; if (!container) return; if (!isFullscreen) { // 进入全屏 - 支持多浏览器 if (container.requestFullscreen) { container.requestFullscreen(); } else if (container.webkitRequestFullscreen) { container.webkitRequestFullscreen(); } // ... 其他浏览器前缀 } else { // 退出全屏 if (document.exitFullscreen) { document.exitFullscreen(); } // ... 其他浏览器前缀 } }; // 渲染逻辑 {selectedCourse.canPreview && selectedCourse.previewUrl ? (