lsc il y a 1 jour
Parent
commit
1811a415ba
3 fichiers modifiés avec 84 ajouts et 3 suppressions
  1. 13 0
      src/global.d.ts
  2. 50 0
      src/hooks/useImport.ts
  3. 21 3
      src/views/Student/index.vue

+ 13 - 0
src/global.d.ts

@@ -13,4 +13,17 @@ interface Document {
   mozCancelFullScreen(): Promise<void>
   webkitExitFullscreen(): Promise<void>
   msExitFullscreen(): Promise<void>
+}
+
+// AWS SDK 类型声明
+interface Window {
+  AWS: {
+    config: {
+      update: (credentials: { accessKeyId: string; secretAccessKey: string }) => void
+      region: string
+    }
+    S3: new (config: { params: { Bucket: string } }) => {
+      getObject: (params: { Bucket: string; Key: string }, callback: (err: any, data: any) => void) => void
+    }
+  }
 }

+ 50 - 0
src/hooks/useImport.ts

@@ -899,6 +899,55 @@ export default () => {
     reader.readAsArrayBuffer(file)
   }
 
+  const getFile = (url: string): Promise<{ data: any }> => {
+    return new Promise((resolve, reject) => {
+      // 检查 AWS SDK 是否可用
+      if (typeof window !== 'undefined' && !window.AWS) {
+        reject(new Error('AWS SDK not available'))
+        return
+      }
+
+      const credentials = {
+        accessKeyId: 'AKIATLPEDU37QV5CHLMH',
+        secretAccessKey: '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',
+      } // 秘钥形式的登录上传
+      
+      window.AWS.config.update(credentials)
+      window.AWS.config.region = 'cn-northwest-1' // 设置区域
+      
+      const s3 = new window.AWS.S3({ params: { Bucket: 'ccrb' } })
+      
+      // 解析文件名
+      const bucketUrl = 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/'
+      if (!url.startsWith(bucketUrl)) {
+        reject(new Error('Invalid S3 URL format'))
+        return
+      }
+      
+      const name = decodeURIComponent(url.split(bucketUrl)[1])
+      if (!name) {
+        reject(new Error('Could not extract file name from URL'))
+        return
+      }
+      
+      const params = {
+        Bucket: 'ccrb',
+        Key: name,
+      }
+      
+      s3.getObject(params, (err: any, data: any) => {
+        if (err) {
+          console.error('S3 getObject error:', err, err.stack)
+          reject(err)
+        }
+        else {
+          console.log('S3 getObject success:', data)
+          resolve({ data: data.Body })
+        }
+      })
+    })
+  }
+
   return {
     importSpecificFile,
     importJSON,
@@ -906,5 +955,6 @@ export default () => {
     readJSON,
     exportJSON2,
     exporting,
+    getFile
   }
 }

+ 21 - 3
src/views/Student/index.vue

@@ -332,7 +332,7 @@ const toggleLaserPen = () => {
 }
 
 // 获取导入导出功能
-const { readJSON, exportJSON2 } = useImport()
+const { readJSON, exportJSON2, getFile } = useImport()
 
 // 根据iframe的URL查找对应的幻灯片索引
 const findSlideIndexByIframeUrl = (iframeUrl: string): number => {
@@ -838,8 +838,26 @@ const getCourseDetail = async () => {
   const res = await api.getCourseDetail(props.courseid as string)
   console.log(res)
   const courseDetail = res[0][0]
-  const pptdata = JSON.parse(courseDetail.chapters).pptData ? JSON.parse(courseDetail.chapters).pptData : []
-  importJSON(pptdata)
+  const pptJSONUrl = JSON.parse(courseDetail.chapters).pptData ? JSON.parse(courseDetail.chapters).pptData : ''
+  console.log(pptJSONUrl)
+  
+  if (pptJSONUrl) { 
+    const pptdata = await getFile(pptJSONUrl)
+    // pptdata.data 是 ArrayBuffer,需要先转成字符串再解析为 JSON
+    let jsonStr = ''
+    if (pptdata && pptdata.data) {
+      // 先将 ArrayBuffer 转为字符串
+      const uint8Array = new Uint8Array(pptdata.data)
+      jsonStr = new TextDecoder('utf-8').decode(uint8Array)
+      try {
+        const jsonObj = JSON.parse(jsonStr)
+        importJSON(jsonObj)
+      }
+      catch (e) {
+        console.error('解析pptdata.data失败:', e)
+      }
+    }
+  }
 }
 
 onMounted(() => {