From ba94ceae1315174798ae1967ef62268c6d16cd5b Mon Sep 17 00:00:00 2001
From: Codex Assistant <codex@example.com>
Date: 星期一, 06 十月 2025 22:07:06 +0800
Subject: [PATCH] feat: 评审与活动相关改动 - backend(GraphQL): Activity schema 增加 updateActivityState(id, state);实现 resolver/service 仅更新 state=2 作为逻辑删除 - backend(GraphQL): region.graphqls 新增 Query leafRegions - backend(GraphQL): player.graphqls 的 projectReviewApplications 增加可选参数 regionId - backend(Service): listProjectReviewApplications 绑定 regionId 参数,修复 QueryParameterException - frontend(web): 新增 api/activity.js 的 updateActivityState 并接入 activity-list 删除逻辑 - frontend(web): review-list.vue 权限仅校验登录,移除角色限制;查询参数修正为 name/regionId - frontend(web): 删除未引用的 ActivityList.vue - frontend(web): projectReviewNew.js GraphQL 查询增加 name 参数

---
 web/src/utils/cos.ts |  323 ++++++++++++++++++++++++++---------------------------
 1 files changed, 161 insertions(+), 162 deletions(-)

diff --git a/web/src/utils/cos.ts b/web/src/utils/cos.ts
index d8889fc..2a61394 100644
--- a/web/src/utils/cos.ts
+++ b/web/src/utils/cos.ts
@@ -1,163 +1,162 @@
-import COS from 'cos-js-sdk-v5'
-import axios from 'axios'
-
-// 浠庡悗绔幏鍙栦复鏃跺瘑閽�
-const getCredentialsFromBackend = async () => {
-  try {
-    const response = await axios.get('http://localhost:8080/api/cos/credentials')
-    return response.data
-  } catch (error) {
-    console.error('浠庡悗绔幏鍙栦复鏃跺瘑閽ュけ璐�:', error)
-    throw error
-  }
-}
-
-// 鍒涘缓COS瀹炰緥
-const cos = new COS({
-  getAuthorization: async function (options: any, callback: any) {
-    try {
-      console.log('姝e湪浠庡悗绔幏鍙朇OS涓存椂瀵嗛挜...')
-      // 浠庡悗绔幏鍙栦复鏃跺瘑閽�
-      const credentials = await getCredentialsFromBackend()
-      
-      console.log('鎴愬姛鑾峰彇涓存椂瀵嗛挜:', {
-        TmpSecretId: credentials.TmpSecretId?.substring(0, 10) + '...',
-        bucket: credentials.config?.bucket,
-        region: credentials.config?.region
-      })
-      
-      callback({
-        TmpSecretId: credentials.TmpSecretId,
-        TmpSecretKey: credentials.TmpSecretKey,
-        SecurityToken: credentials.SecurityToken,
-        StartTime: credentials.StartTime,
-        ExpiredTime: credentials.ExpiredTime,
-      })
-    } catch (error) {
-      console.error('鑾峰彇涓存椂瀵嗛挜澶辫触:', error)
-      callback(error)
-    }
-  }
-})
-
-// 鑾峰彇COS閰嶇疆淇℃伅
-export const getCOSConfig = async () => {
-  try {
-    const response = await axios.get('http://localhost:8080/api/cos/config')
-    return response.data
-  } catch (error) {
-    console.error('鑾峰彇COS閰嶇疆澶辫触:', error)
-    throw error
-  }
-}
-
-/**
- * 涓婁紶鏂囦欢鍒拌吘璁簯COS
- * @param file 瑕佷笂浼犵殑鏂囦欢
- * @param folder 瀛樺偍鏂囦欢澶硅矾寰勶紝濡� 'avatars/', 'documents/'
- * @returns Promise<string> 杩斿洖鏂囦欢鐨勮闂甎RL
- */
-export const uploadToCOS = async (file: File, folder: string = ''): Promise<string> => {
-  try {
-    // 鑾峰彇COS閰嶇疆
-    const config = await getCOSConfig()
-    
-    // 鐢熸垚鍞竴鏂囦欢鍚�
-    const timestamp = Date.now()
-    const randomStr = Math.random().toString(36).substring(2, 8)
-    const fileExt = file.name.split('.').pop()
-    const fileName = `${folder}${timestamp}_${randomStr}.${fileExt}`
-    
-    console.log('寮�濮嬩笂浼犳枃浠�:', fileName, '鍒板瓨鍌ㄦ《:', config.bucket)
-    
-    return new Promise((resolve, reject) => {
-      cos.uploadFile({
-        Bucket: config.bucket,
-        Region: config.region,
-        Key: fileName,
-        Body: file,
-        SliceSize: 1024 * 1024 * 5, // 澶т簬5MB鐨勬枃浠朵娇鐢ㄥ垎鍧椾笂浼�
-        onProgress: (progressData) => {
-          console.log('涓婁紶杩涘害:', Math.round(progressData.percent * 100) + '%')
-        }
-      }, (err, data) => {
-        if (err) {
-          console.error('涓婁紶澶辫触:', err)
-          reject(err)
-        } else {
-          console.log('涓婁紶鎴愬姛:', data)
-          // 杩斿洖鏂囦欢鐨勮闂甎RL
-          const fileUrl = `https://${data.Location}`
-          resolve(fileUrl)
-        }
-      })
-    })
-  } catch (error) {
-    console.error('涓婁紶鏂囦欢澶辫触:', error)
-    throw error
-  }
-}
-
-/**
- * 鍒犻櫎COS涓殑鏂囦欢
- * @param key 鏂囦欢鐨凨ey锛堣矾寰勶級
- * @returns Promise<boolean>
- */
-export const deleteFromCOS = async (key: string): Promise<boolean> => {
-  try {
-    const config = await getCOSConfig()
-    
-    return new Promise((resolve, reject) => {
-      cos.deleteObject({
-        Bucket: config.bucket,
-        Region: config.region,
-        Key: key
-      }, (err, data) => {
-        if (err) {
-          console.error('鍒犻櫎澶辫触:', err)
-          reject(err)
-        } else {
-          console.log('鍒犻櫎鎴愬姛:', data)
-          resolve(true)
-        }
-      })
-    })
-  } catch (error) {
-    console.error('鍒犻櫎鏂囦欢澶辫触:', error)
-    throw error
-  }
-}
-
-/**
- * 鑾峰彇鏂囦欢鐨勪复鏃惰闂甎RL锛堢敤浜庣鏈夎鍙栫殑鏂囦欢锛�
- * @param key 鏂囦欢鐨凨ey锛堣矾寰勶級
- * @param expires 杩囨湡鏃堕棿锛堢锛夛紝榛樿1灏忔椂
- * @returns Promise<string>
- */
-export const getObjectUrl = async (key: string, expires: number = 3600): Promise<string> => {
-  try {
-    const config = await getCOSConfig()
-    
-    return new Promise((resolve, reject) => {
-      cos.getObjectUrl({
-        Bucket: config.bucket,
-        Region: config.region,
-        Key: key,
-        Expires: expires,
-        Sign: true
-      }, (err, data) => {
-        if (err) {
-          console.error('鑾峰彇URL澶辫触:', err)
-          reject(err)
-        } else {
-          resolve(data.Url)
-        }
-      })
-    })
-  } catch (error) {
-    console.error('鑾峰彇鏂囦欢URL澶辫触:', error)
-    throw error
-  }
-}
-
+import COS from 'cos-js-sdk-v5'

+import axios from 'axios'

+

+// 浠庡悗绔幏鍙栦复鏃跺瘑閽�

+const getCredentialsFromBackend = async () => {

+  try {

+    const response = await axios.get('http://localhost:8080/api/cos/credentials')

+    return response.data

+  } catch (error) {

+    throw error

+  }

+}

+

+// 鍒涘缓COS瀹炰緥

+const cos = new COS({

+  getAuthorization: async function (options: any, callback: any) {

+    try {

+      console.log('姝e湪浠庡悗绔幏鍙朇OS涓存椂瀵嗛挜...')

+      // 浠庡悗绔幏鍙栦复鏃跺瘑閽�

+      const credentials = await getCredentialsFromBackend()

+      

+      console.log('鎴愬姛鑾峰彇涓存椂瀵嗛挜:', {

+        TmpSecretId: credentials.TmpSecretId?.substring(0, 10) + '...',

+        bucket: credentials.config?.bucket,

+        region: credentials.config?.region

+      })

+      

+      callback({

+        TmpSecretId: credentials.TmpSecretId,

+        TmpSecretKey: credentials.TmpSecretKey,

+        SecurityToken: credentials.SecurityToken,

+        StartTime: credentials.StartTime,

+        ExpiredTime: credentials.ExpiredTime,

+      })

+    } catch (error) {

+      console.error('鑾峰彇涓存椂瀵嗛挜澶辫触:', error)

+      callback(error)

+    }

+  }

+})

+

+// 鑾峰彇COS閰嶇疆淇℃伅

+export const getCOSConfig = async () => {

+  try {

+    const response = await axios.get('http://localhost:8080/api/cos/config')

+    return response.data

+  } catch (error) {

+    console.error('鑾峰彇COS閰嶇疆澶辫触:', error)

+    throw error

+  }

+}

+

+/**

+ * 涓婁紶鏂囦欢鍒拌吘璁簯COS

+ * @param file 瑕佷笂浼犵殑鏂囦欢

+ * @param folder 瀛樺偍鏂囦欢澶硅矾寰勶紝濡� 'avatars/', 'documents/'

+ * @returns Promise<string> 杩斿洖鏂囦欢鐨勮闂甎RL

+ */

+export const uploadToCOS = async (file: File, folder: string = ''): Promise<string> => {

+  try {

+    // 鑾峰彇COS閰嶇疆

+    const config = await getCOSConfig()

+    

+    // 鐢熸垚鍞竴鏂囦欢鍚�

+    const timestamp = Date.now()

+    const randomStr = Math.random().toString(36).substring(2, 8)

+    const fileExt = file.name.split('.').pop()

+    const fileName = `${folder}${timestamp}_${randomStr}.${fileExt}`

+    

+    console.log('寮�濮嬩笂浼犳枃浠�:', fileName, '鍒板瓨鍌ㄦ《:', config.bucket)

+    

+    return new Promise((resolve, reject) => {

+      cos.uploadFile({

+        Bucket: config.bucket,

+        Region: config.region,

+        Key: fileName,

+        Body: file,

+        SliceSize: 1024 * 1024 * 5, // 澶т簬5MB鐨勬枃浠朵娇鐢ㄥ垎鍧椾笂浼�

+        onProgress: (progressData) => {

+          console.log('涓婁紶杩涘害:', Math.round(progressData.percent * 100) + '%')

+        }

+      }, (err, data) => {

+        if (err) {

+          console.error('涓婁紶澶辫触:', err)

+          reject(err)

+        } else {

+          console.log('涓婁紶鎴愬姛:', data)

+          // 杩斿洖鏂囦欢鐨勮闂甎RL

+          const fileUrl = `https://${data.Location}`

+          resolve(fileUrl)

+        }

+      })

+    })

+  } catch (error) {

+    console.error('涓婁紶鏂囦欢澶辫触:', error)

+    throw error

+  }

+}

+

+/**

+ * 鍒犻櫎COS涓殑鏂囦欢

+ * @param key 鏂囦欢鐨凨ey锛堣矾寰勶級

+ * @returns Promise<boolean>

+ */

+export const deleteFromCOS = async (key: string): Promise<boolean> => {

+  try {

+    const config = await getCOSConfig()

+    

+    return new Promise((resolve, reject) => {

+      cos.deleteObject({

+        Bucket: config.bucket,

+        Region: config.region,

+        Key: key

+      }, (err, data) => {

+        if (err) {

+          console.error('鍒犻櫎澶辫触:', err)

+          reject(err)

+        } else {

+          console.log('鍒犻櫎鎴愬姛:', data)

+          resolve(true)

+        }

+      })

+    })

+  } catch (error) {

+    console.error('鍒犻櫎鏂囦欢澶辫触:', error)

+    throw error

+  }

+}

+

+/**

+ * 鑾峰彇鏂囦欢鐨勪复鏃惰闂甎RL锛堢敤浜庣鏈夎鍙栫殑鏂囦欢锛�

+ * @param key 鏂囦欢鐨凨ey锛堣矾寰勶級

+ * @param expires 杩囨湡鏃堕棿锛堢锛夛紝榛樿1灏忔椂

+ * @returns Promise<string>

+ */

+export const getObjectUrl = async (key: string, expires: number = 3600): Promise<string> => {

+  try {

+    const config = await getCOSConfig()

+    

+    return new Promise((resolve, reject) => {

+      cos.getObjectUrl({

+        Bucket: config.bucket,

+        Region: config.region,

+        Key: key,

+        Expires: expires,

+        Sign: true

+      }, (err, data) => {

+        if (err) {

+          console.error('鑾峰彇URL澶辫触:', err)

+          reject(err)

+        } else {

+          resolve(data.Url)

+        }

+      })

+    })

+  } catch (error) {

+    console.error('鑾峰彇鏂囦欢URL澶辫触:', error)

+    throw error

+  }

+}

+

 export default cos
\ No newline at end of file

--
Gitblit v1.8.0