From aa87b0e8e4a5e5b9b3da48fc79f46dcb825fd3f6 Mon Sep 17 00:00:00 2001 From: yuk255 Date: Thu, 18 Sep 2025 19:52:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AF=BE=E4=BB=B6=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=8C=E5=AF=B9=E6=8E=A5=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=9B=E7=AB=A0=E8=8A=82=E9=A1=B5=E9=9D=A2=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5=EF=BC=9B?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/modules/teachCourse.ts | 130 +- src/components/admin/MyResources.vue | 12 +- src/utils/download.ts | 37 + src/views/teacher/course/AddDiscussion.vue | 54 +- src/views/teacher/course/AddHomework.vue | 3 +- src/views/teacher/course/ChapterEditor.vue | 397 ++++- .../teacher/course/ChapterManagement.vue | 330 +++- src/views/teacher/course/CourseEditor.vue | 6 +- .../teacher/course/CoursewareManagement.vue | 295 +++- .../course/CoursewareManagementBackup.vue | 1543 ----------------- src/views/teacher/course/FileViewer.vue | 727 +++++--- src/views/teacher/course/FolderBrowser.vue | 949 ++++++++-- .../teacher/course/HomeworkReviewView.vue | 78 +- 13 files changed, 2518 insertions(+), 2043 deletions(-) create mode 100644 src/utils/download.ts delete mode 100644 src/views/teacher/course/CoursewareManagementBackup.vue diff --git a/src/api/modules/teachCourse.ts b/src/api/modules/teachCourse.ts index 5788fe3..d51eb15 100644 --- a/src/api/modules/teachCourse.ts +++ b/src/api/modules/teachCourse.ts @@ -373,9 +373,7 @@ export class TeachCourseApi { try { console.log('🚀 发送删除课程章节请求:', { url: '/aiol/aiolCourseSection/delete', id }) - const response = await ApiRequest.delete('/aiol/aiolCourseSection/delete', { - params: { id } - }) + const response = await ApiRequest.delete('/aiol/aiolCourseSection/delete', {id}) console.log('🗑️ 删除课程章节响应:', response) return response @@ -405,6 +403,94 @@ export class TeachCourseApi { throw error } } + + /** + * 查询课程课件列表 + */ + static async queryCourseMaterials(params: { courseId: string; resourceType: number|string; name?:string }): Promise> { + try { + const response = await ApiRequest.get<{ result: any[] }>(`/aiol/aiolResource/course_materials`, params) + + console.log('📑 查询课程课件响应:', response) + return response + } catch (error) { + console.error('❌ 查询课程课件失败:', error) + throw error + } + } + + + /** + * 上传视频课件 + */ + static async uploadCursorVideo(data: { courseId: string; file: File; name:string }): Promise> { + try { + const formData = new FormData() + formData.append('courseId', data.courseId) + formData.append('file', data.file) + formData.append('name', data.name) + + const response = await ApiRequest.post<{ result: any[] }>(`/aiol/aiolResource/video_upload`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + + console.log('📑 上传视频课件响应:', response) + return response + } catch (error) { + console.error('❌ 上传视频课件失败:', error) + throw error + } + } + + /** + * 文档上传 + */ + static async uploadCursorDocument(data: { courseId: string; file: File; name:string }): Promise> { + try { + const formData = new FormData() + formData.append('courseId', data.courseId) + formData.append('file', data.file) + formData.append('name', data.name) + + const response = await ApiRequest.post<{ result: any[] }>(`/aiol/aiolResource/document_upload`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + + console.log('📑 上传文档课件响应:', response) + return response + } catch (error) { + console.error('❌ 上传文档课件失败:', error) + throw error + } + } + + /** + * 图片上传 + */ + static async uploadCursorImage(data: { courseId: string; file: File; name:string }): Promise> { + try { + const formData = new FormData() + formData.append('courseId', data.courseId) + formData.append('file', data.file) + formData.append('name', data.name) + + const response = await ApiRequest.post<{ result: any[] }>(`/aiol/aiolResource/image_upload`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + + console.log('📑 上传图片课件响应:', response) + return response + } catch (error) { + console.error('❌ 上传图片课件失败:', error) + throw error + } + } } // 默认导出 @@ -507,4 +593,42 @@ export class ClassApi { headers: { 'Content-Type': 'multipart/form-data' } }); } + + /** + * 获取文件下载链接 + */ + static async getFileDownloadUrl(fileId: string | number): Promise> { + try { + const response = await ApiRequest.get<{ result: { downloadUrl: string } }>(`/aiol/aiolResource/${fileId}/download_url`) + console.log('📥 获取文件下载链接响应:', response) + return response + } catch (error) { + console.error('❌ 获取文件下载链接失败:', error) + throw error + } + } + + /** + * 直接下载文件 + */ + static async downloadFile(fileId: string | number): Promise { + try { + const response = await fetch(`/api/aiol/aiolResource/${fileId}/download`, { + method: 'GET', + headers: { + 'Authorization': `Bearer ${localStorage.getItem('token') || ''}` + } + }) + + if (!response.ok) { + throw new Error(`下载失败: ${response.statusText}`) + } + + console.log('📥 文件下载响应:', response) + return response + } catch (error) { + console.error('❌ 文件下载失败:', error) + throw error + } + } } \ No newline at end of file diff --git a/src/components/admin/MyResources.vue b/src/components/admin/MyResources.vue index b798c3e..b1644f0 100644 --- a/src/components/admin/MyResources.vue +++ b/src/components/admin/MyResources.vue @@ -12,12 +12,12 @@ 新建文件夹 - +
{ showNewFolderModal.value = true } -const handleRecycleBin = () => { - window.location.href = '/teacher/recycle-bin' -} +// const handleRecycleBin = () => { + // route.push('/teacher/recycle-bin') +// } const closeNewFolderModal = () => { showNewFolderModal.value = false diff --git a/src/utils/download.ts b/src/utils/download.ts new file mode 100644 index 0000000..9af63e0 --- /dev/null +++ b/src/utils/download.ts @@ -0,0 +1,37 @@ +/** + * 文件下载工具 + */ + +/** + * 通过 URL 下载文件 + * @param url 文件下载地址 + * @param filename 保存的文件名 + */ +export const downloadFileFromUrl = (url: string, filename?: string) => { + try { + const link = document.createElement('a') + link.href = url + link.target = '_blank' + + if (filename) { + link.download = filename + } + + // 添加到DOM,触发下载,然后移除 + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + } catch (error) { + console.error('下载文件失败:', error) + throw error + } +} + +/** + * 获取文件扩展名 + * @param filename 文件名或URL + */ +export const getFileExtension = (filename: string): string => { + const lastDotIndex = filename.lastIndexOf('.') + return lastDotIndex !== -1 ? filename.slice(lastDotIndex) : '' +} diff --git a/src/views/teacher/course/AddDiscussion.vue b/src/views/teacher/course/AddDiscussion.vue index cac3f04..a5ccbbe 100644 --- a/src/views/teacher/course/AddDiscussion.vue +++ b/src/views/teacher/course/AddDiscussion.vue @@ -1,7 +1,16 @@