# 课程资料预览功能 - 实施完成报告 **实施日期**:2025-10-14 **实施状态**:代码实现完成,待测试验证 --- ## 一、功能概述 实现了课程学习页面的资料在线预览功能,支持多种文件格式的查看: - 左侧:课程资料文件列表(支持搜索和筛选) - 右侧:根据文件类型实现不同的预览方式 ### 支持的文件格式 | 类型 | 格式 | 预览方式 | |------|------|----------| | PDF | .pdf | iframe嵌入预览 | | Office文档 | .docx, .doc, .pptx, .ppt, .xlsx, .xls | 转换为PDF后预览 | | 视频 | .mp4, .avi, .mov, .wmv | HTML5 video播放器 | | 音频 | .mp3, .wav, .ogg, .m4a | HTML5 audio播放器 | | 图片 | .jpg, .jpeg, .png, .gif | 图片查看器(支持放大) | | 文本 | .txt, .md | 直接显示内容 | | 其他 | .zip等 | 提供下载 | --- ## 二、已完成的工作 ### 2.1 后端开发 #### ✅ 文档转换服务 **文件**:`kaopeilian-backend/app/services/document_converter.py` - 使用LibreOffice命令行将Office文档转换为PDF - 支持docx、doc、pptx、ppt、xlsx、xls格式 - 实现转换缓存机制(检查文件修改时间) - 转换超时设置:60秒 - 转换文件存储:`/uploads/converted/{course_id}/{material_id}.pdf` #### ✅ 预览API接口 **文件**:`kaopeilian-backend/app/api/v1/preview.py` 实现的接口: 1. `GET /api/v1/preview/material/{material_id}` - 获取资料预览信息 - 根据文件类型返回合适的预览方式 - 自动触发Office文档转换 - 返回preview_type、preview_url等信息 2. `GET /api/v1/preview/check-converter` - 检查转换服务状态 - 用于调试LibreOffice是否正确安装 - 返回安装状态、版本信息、支持格式 #### ✅ Docker配置更新 **文件**:`kaopeilian-backend/Dockerfile` 在后端容器中添加了LibreOffice安装: ```dockerfile RUN apt-get update && apt-get install -y \ libreoffice-writer \ libreoffice-impress \ libreoffice-calc \ libreoffice-core \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* ``` #### ✅ API路由注册 **文件**:`kaopeilian-backend/app/api/v1/__init__.py` 注册了preview路由到主API路由器 ### 2.2 前端开发 #### ✅ 类型定义 **文件**:`kaopeilian-frontend/src/types/material.ts` 定义的类型: - `Material` - 课程资料信息 - `PreviewInfo` - 预览信息 - `PreviewType` - 预览类型枚举 工具函数: - `formatFileSize` - 文件大小格式化 - `getFileCategory` - 文件分类判断 - `getFileExtension` - 获取文件扩展名 - `getFileTypeIcon` - 获取文件类型图标 #### ✅ API封装 **文件**:`kaopeilian-frontend/src/api/material.ts` 封装的API方法: - `getMaterials` - 获取课程资料列表 - `getPreview` - 获取资料预览信息 - `downloadFile` - 下载文件 - `checkConverterStatus` - 检查转换服务状态(调试用) #### ✅ 课程详情页重构 **文件**:`kaopeilian-frontend/src/views/trainee/course-detail.vue` 实现的功能: - **左侧资料列表**: - 显示文件名、大小、类型 - 支持关键词搜索 - 支持按类型筛选(全部/文档/视频/音频/图片) - 点击选中高亮 - **右侧预览区域**: - PDF:iframe嵌入预览 - 视频:HTML5 video标签,支持播放控制 - 音频:HTML5 audio标签,支持播放控制 - 图片:el-image组件,支持放大查看 - 文本:pre标签显示内容 - Office文档:显示转换中提示,完成后显示PDF - 其他格式:显示下载界面 - **工具栏**: - 下载按钮:下载当前文件 - 全屏按钮:PDF/视频/图片支持全屏查看 ### 2.3 文档更新 #### ✅ 测试指南 **文件**:`kaopeilian-frontend/课程资料预览功能测试指南.md` 包含内容: - 测试前准备(Docker镜像重建) - 详细的功能测试步骤 - API接口测试方法 - 性能测试建议 - 常见问题排查 - 预期效果说明 #### ✅ 联调经验汇总 **文件**:`考培练系统规划/全链路联调/联调经验汇总.md` 新增章节: - 需求背景和核心策略 - 详细的变更内容 - 核心设计决策 - 技术亮点 - 验证结果 - 核心问题与解决方案 - 经验沉淀 - 后续优化方向 #### ✅ 规范与约定 **文件**:`考培练系统规划/全链路联调/规范与约定-团队基线.md` 新增规范: - 文件类型与预览方式映射 - 文档转换服务规范 - API接口规范 - 前端实现规范 - Docker环境配置 - 性能优化建议 - 安全注意事项 #### ✅ 启动脚本 **文件**:`启动资料预览功能.sh` 自动化脚本功能: - 停止现有服务 - 重建后端Docker镜像 - 启动所有服务 - 显示服务信息和测试建议 #### ✅ 测试脚本 **文件**:`测试资料预览功能.sh` 快速测试功能: - 检查后端服务状态 - 检查LibreOffice安装 - 获取课程资料列表 - 测试预览接口 --- ## 三、技术架构 ### 3.1 核心技术栈 **后端**: - FastAPI - Web框架 - LibreOffice - 文档转换工具 - Python Subprocess - 执行系统命令 **前端**: - Vue 3 - 框架 - TypeScript - 类型系统 - Element Plus - UI组件库 - HTML5 - video/audio标签 ### 3.2 文件流转流程 ``` 1. 用户上传 Office 文档 ↓ 2. 保存到 /uploads/courses/{course_id}/ ↓ 3. 用户点击预览 ↓ 4. 前端调用 /api/v1/preview/material/{id} ↓ 5. 后端判断文件类型 ↓ 6. 如果是Office文档: - 检查缓存 /uploads/converted/{course_id}/{material_id}.pdf - 如果缓存不存在或过期,执行转换 - 返回转换后的PDF URL ↓ 7. 如果是其他类型: - 直接返回原始文件URL ↓ 8. 前端根据preview_type渲染对应组件 ``` ### 3.3 转换缓存策略 ```python def need_convert(source_file, converted_file): # 缓存不存在 → 需要转换 if not converted_file.exists(): return True # 源文件修改时间 > 缓存修改时间 → 需要重新转换 if source_file.stat().st_mtime > converted_file.stat().st_mtime: return True # 缓存有效 return False ``` --- ## 四、待完成的工作 ### 4.1 立即执行(必需) - [ ] **重建Docker镜像** ```bash cd kaopeilian-backend docker-compose -f docker-compose.dev.yml build backend docker-compose -f docker-compose.dev.yml up -d ``` - [ ] **验证LibreOffice安装** ```bash curl http://localhost:8000/api/v1/preview/check-converter ``` 预期返回:`"libreoffice_installed": true` ### 4.2 功能测试(必需) - [ ] 上传各种格式的测试文件到课程中 - [ ] 访问课程详情页:`http://localhost:3001/trainee/course-detail?id=1` - [ ] 测试PDF文件预览 - [ ] 测试Office文档转换预览(docx、pptx、xlsx) - [ ] 测试视频文件播放 - [ ] 测试音频文件播放 - [ ] 测试图片文件查看 - [ ] 测试文本文件显示 - [ ] 测试搜索功能 - [ ] 测试类型筛选功能 - [ ] 测试下载功能 - [ ] 测试全屏功能 ### 4.3 性能测试(建议) - [ ] 测试5MB Office文档转换时间 - [ ] 测试转换缓存是否生效 - [ ] 测试并发转换请求 ### 4.4 错误场景测试(建议) - [ ] 测试不存在的文件ID - [ ] 测试损坏的Office文档 - [ ] 测试不支持的文件格式 - [ ] 测试超大文件(>15MB) --- ## 五、快速启动指南 ### 5.1 使用启动脚本(推荐) ```bash # 进入项目根目录 cd /Users/nongjun/Desktop/Ai公司/本地开发与测试 # 运行启动脚本 ./启动资料预览功能.sh ``` 等待5-10分钟(首次构建LibreOffice镜像较慢) ### 5.2 手动启动 ```bash # 1. 进入后端目录 cd kaopeilian-backend # 2. 停止现有服务 docker-compose -f docker-compose.dev.yml down # 3. 重建镜像 docker-compose -f docker-compose.dev.yml build backend # 4. 启动服务 docker-compose -f docker-compose.dev.yml up -d # 5. 查看日志 docker-compose -f docker-compose.dev.yml logs -f backend ``` ### 5.3 验证安装 ```bash # 运行测试脚本 ./测试资料预览功能.sh ``` 或手动测试: ```bash # 检查后端服务 curl http://localhost:8000/health # 检查LibreOffice curl http://localhost:8000/api/v1/preview/check-converter # 获取课程资料 curl http://localhost:8000/api/v1/courses/1/materials ``` --- ## 六、已知限制 1. **文件大小限制**:当前设置为15MB 2. **转换超时**:单个文件转换超时60秒 3. **支持格式**:仅支持常见的Office文档格式 4. **并发转换**:未做并发限制,可能影响服务器性能 5. **权限检查**:TODO标记,需要实现用户权限验证 --- ## 七、后续优化建议 ### 短期优化 1. 添加转换进度实时提示 2. 实现用户权限检查 3. 优化大文件加载体验 4. 添加转换任务队列 ### 长期优化 1. 支持Markdown渲染预览 2. 支持代码文件语法高亮 3. 添加文件预览历史记录 4. 支持批量下载 5. 添加文件注释和标记功能 --- ## 八、联系与支持 如遇到问题,请查看: 1. **测试指南**:`kaopeilian-frontend/课程资料预览功能测试指南.md` 2. **联调经验**:`考培练系统规划/全链路联调/联调经验汇总.md` 3. **规范约定**:`考培练系统规划/全链路联调/规范与约定-团队基线.md` --- **报告生成时间**:2025-10-14 **实施人员**:AI Assistant **审核状态**:待测试验证