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 @@