From c4a9cad1c50e89365e2a58b50e259af642ed3b8c Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期二, 07 十月 2025 16:12:20 +0800 Subject: [PATCH] feat(review): 调整评审详情展示顺序与样式,描述支持多行,项目信息列宽40/60 fix(auth): 登录页与首页循环跳转保护;api.ts 在登录页不再重定向;401分支在登录页不跳转 fix(router): /login 放行策略优化,避免死循环;评审列表跳转到 /project-review/:id/detail fix(frontend): 补齐 utils/appConfig.ts,避免启动白屏 fix(review): 详情页提交评分缺少stageId时回退使用项目详情的stageId feat(backend): ActivityPlayerDetailResponse.playerInfo 补充 avatarUrl/avatar,服务组装时填充用户头像 chore(dev): 启动脚本注入本地JWT密钥,重启前后端 --- web/src/utils/upload-logo-browser.ts | 222 +++++++++++++++++++++++++++--------------------------- 1 files changed, 111 insertions(+), 111 deletions(-) diff --git a/web/src/utils/upload-logo-browser.ts b/web/src/utils/upload-logo-browser.ts index c685217..d930b73 100644 --- a/web/src/utils/upload-logo-browser.ts +++ b/web/src/utils/upload-logo-browser.ts @@ -1,112 +1,112 @@ -// 娴忚鍣ㄧ涓婁紶logo鏂囦欢鐨勫伐鍏峰嚱鏁� -import { uploadToCOS } from './cos' - -/** - * 灏哢I鐩綍涓嬬殑logo鏂囦欢涓婁紶鍒癈OS - * 杩欎釜鍑芥暟鐢ㄤ簬鍦ㄦ祻瑙堝櫒涓笂浼爈ogo鏂囦欢 - */ -export const uploadLogoToCOS = async (): Promise<{ - success: boolean - url?: string - error?: string -}> => { - try { - // 鑾峰彇logo鏂囦欢 - const logoFile = await fetchLogoFile() - - if (!logoFile) { - return { - success: false, - error: 'Logo鏂囦欢涓嶅瓨鍦ㄦ垨鏃犳硶璁块棶' - } - } - - // 涓婁紶鍒癈OS鐨刟vatars鐩綍 - const url = await uploadToCOS(logoFile, 'avatars/') - - return { - success: true, - url: url - } - - } catch (error: any) { - console.error('Logo涓婁紶澶辫触:', error) - return { - success: false, - error: error.message || '涓婁紶澶辫触' - } - } -} - -/** - * 鑾峰彇logo鏂囦欢 - * 鐢变簬娴忚鍣ㄥ畨鍏ㄩ檺鍒讹紝鏃犳硶鐩存帴璇诲彇鏈湴鏂囦欢绯荤粺 - * 杩欓噷鎻愪緵鍑犵鑾峰彇logo鏂囦欢鐨勬柟寮� - */ -async function fetchLogoFile(): Promise<File | null> { - try { - // 鏂瑰紡1: 浠巔ublic鐩綍鑾峰彇锛堝鏋渓ogo鏂囦欢鏀惧湪public鐩綍涓嬶級 - const response = await fetch('/logo.jpg') - if (response.ok) { - const blob = await response.blob() - return new File([blob], 'logo.jpg', { type: 'image/jpeg' }) - } - } catch (error) { - // 浠巔ublic鐩綍鑾峰彇logo澶辫触锛屽皾璇曞叾浠栨柟寮� - } - - try { - // 鏂瑰紡2: 浠嶶I鐩綍鑾峰彇锛堥渶瑕侀厤缃潤鎬佹枃浠舵湇鍔★級 - const response = await fetch('/UI/logo.jpg') - if (response.ok) { - const blob = await response.blob() - return new File([blob], 'logo.jpg', { type: 'image/jpeg' }) - } - } catch (error) { - // 浠嶶I鐩綍鑾峰彇logo澶辫触 - } - - // 鏂瑰紡3: 杩斿洖null锛岄渶瑕佺敤鎴锋墜鍔ㄩ�夋嫨鏂囦欢 - return null -} - -/** - * 鍒涘缓涓�涓猯ogo鏂囦欢閫夋嫨鍣� - * 褰撴棤娉曡嚜鍔ㄨ幏鍙杔ogo鏂囦欢鏃讹紝璁╃敤鎴锋墜鍔ㄩ�夋嫨 - */ -export const createLogoFileSelector = (): Promise<File | null> => { - return new Promise((resolve) => { - const input = document.createElement('input') - input.type = 'file' - input.accept = 'image/*' - input.style.display = 'none' - - input.onchange = (event) => { - const target = event.target as HTMLInputElement - const file = target.files?.[0] - - if (file) { - // 楠岃瘉鏄惁涓簂ogo鏂囦欢 - if (file.name.toLowerCase().includes('logo')) { - resolve(file) - } else { - console.warn('閫夋嫨鐨勬枃浠跺悕涓嶅寘鍚�"logo"锛岃纭鏄惁涓烘纭殑logo鏂囦欢') - resolve(file) // 浠嶇劧杩斿洖鏂囦欢锛岃鐢ㄦ埛鍐冲畾 - } - } else { - resolve(null) - } - - // 娓呯悊DOM - document.body.removeChild(input) - } - - input.oncancel = () => { - resolve(null) - document.body.removeChild(input) - } - - document.body.appendChild(input) - input.click() - }) +// 娴忚鍣ㄧ涓婁紶logo鏂囦欢鐨勫伐鍏峰嚱鏁� +import { uploadToCOS } from './cos' + +/** + * 灏哢I鐩綍涓嬬殑logo鏂囦欢涓婁紶鍒癈OS + * 杩欎釜鍑芥暟鐢ㄤ簬鍦ㄦ祻瑙堝櫒涓笂浼爈ogo鏂囦欢 + */ +export const uploadLogoToCOS = async (): Promise<{ + success: boolean + url?: string + error?: string +}> => { + try { + // 鑾峰彇logo鏂囦欢 + const logoFile = await fetchLogoFile() + + if (!logoFile) { + return { + success: false, + error: 'Logo鏂囦欢涓嶅瓨鍦ㄦ垨鏃犳硶璁块棶' + } + } + + // 涓婁紶鍒癈OS鐨刟vatars鐩綍 + const url = await uploadToCOS(logoFile, 'avatars/') + + return { + success: true, + url: url + } + + } catch (error: any) { + console.error('Logo涓婁紶澶辫触:', error) + return { + success: false, + error: error.message || '涓婁紶澶辫触' + } + } +} + +/** + * 鑾峰彇logo鏂囦欢 + * 鐢变簬娴忚鍣ㄥ畨鍏ㄩ檺鍒讹紝鏃犳硶鐩存帴璇诲彇鏈湴鏂囦欢绯荤粺 + * 杩欓噷鎻愪緵鍑犵鑾峰彇logo鏂囦欢鐨勬柟寮� + */ +async function fetchLogoFile(): Promise<File | null> { + try { + // 鏂瑰紡1: 浠巔ublic鐩綍鑾峰彇锛堝鏋渓ogo鏂囦欢鏀惧湪public鐩綍涓嬶級 + const response = await fetch('/logo.jpg') + if (response.ok) { + const blob = await response.blob() + return new File([blob], 'logo.jpg', { type: 'image/jpeg' }) + } + } catch (error) { + // 浠巔ublic鐩綍鑾峰彇logo澶辫触锛屽皾璇曞叾浠栨柟寮� + } + + try { + // 鏂瑰紡2: 浠嶶I鐩綍鑾峰彇锛堥渶瑕侀厤缃潤鎬佹枃浠舵湇鍔★級 + const response = await fetch('/UI/logo.jpg') + if (response.ok) { + const blob = await response.blob() + return new File([blob], 'logo.jpg', { type: 'image/jpeg' }) + } + } catch (error) { + // 浠嶶I鐩綍鑾峰彇logo澶辫触 + } + + // 鏂瑰紡3: 杩斿洖null锛岄渶瑕佺敤鎴锋墜鍔ㄩ�夋嫨鏂囦欢 + return null +} + +/** + * 鍒涘缓涓�涓猯ogo鏂囦欢閫夋嫨鍣� + * 褰撴棤娉曡嚜鍔ㄨ幏鍙杔ogo鏂囦欢鏃讹紝璁╃敤鎴锋墜鍔ㄩ�夋嫨 + */ +export const createLogoFileSelector = (): Promise<File | null> => { + return new Promise((resolve) => { + const input = document.createElement('input') + input.type = 'file' + input.accept = 'image/*' + input.style.display = 'none' + + input.onchange = (event) => { + const target = event.target as HTMLInputElement + const file = target.files?.[0] + + if (file) { + // 楠岃瘉鏄惁涓簂ogo鏂囦欢 + if (file.name.toLowerCase().includes('logo')) { + resolve(file) + } else { + console.warn('閫夋嫨鐨勬枃浠跺悕涓嶅寘鍚�"logo"锛岃纭鏄惁涓烘纭殑logo鏂囦欢') + resolve(file) // 浠嶇劧杩斿洖鏂囦欢锛岃鐢ㄦ埛鍐冲畾 + } + } else { + resolve(null) + } + + // 娓呯悊DOM + document.body.removeChild(input) + } + + input.oncancel = () => { + resolve(null) + document.body.removeChild(input) + } + + document.body.appendChild(input) + input.click() + }) } \ No newline at end of file -- Gitblit v1.8.0