From e67bfcca52b9314abe397178e57a703847fe916b Mon Sep 17 00:00:00 2001 From: chaos-zhu Date: Sun, 14 Dec 2025 13:12:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/pages/about.vue | 19 ++++++-- server/api/version/check.get.js | 83 ++++++++++++++++++++++++--------- 2 files changed, 75 insertions(+), 27 deletions(-) diff --git a/app/pages/about.vue b/app/pages/about.vue index 2dd1626..8c3cfe9 100644 --- a/app/pages/about.vue +++ b/app/pages/about.vue @@ -3,8 +3,8 @@

关于

- -
+ +

版本信息 @@ -179,12 +179,15 @@ \ No newline at end of file diff --git a/server/api/version/check.get.js b/server/api/version/check.get.js index 2466464..2f34c26 100644 --- a/server/api/version/check.get.js +++ b/server/api/version/check.get.js @@ -1,8 +1,31 @@ import { readFileSync } from 'fs' import { resolve } from 'path' +import { verifyToken } from '../../utils/jwt' + +// GitHub package.json 的 URL +const PROXY_URL = 'https://cf.111443.xyz/https://raw.githubusercontent.com/chaos-zhu/easyimg/main/package.json' +const DIRECT_URL = 'https://raw.githubusercontent.com/chaos-zhu/easyimg/main/package.json' export default defineEventHandler(async (event) => { try { + // 验证登录状态 + const authHeader = getHeader(event, 'authorization') + if (!authHeader || !authHeader.startsWith('Bearer ')) { + return { + success: false, + message: '需要登录后才能检测版本更新' + } + } + + const token = authHeader.substring(7) + const decoded = verifyToken(token) + if (!decoded) { + return { + success: false, + message: '登录已过期,请重新登录' + } + } + // 读取本地 package.json 获取当前版本 const packageJsonPath = resolve(process.cwd(), 'package.json') const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) @@ -13,30 +36,20 @@ export default defineEventHandler(async (event) => { let hasUpdate = false let error = null - try { - const response = await fetch( - 'https://cf.111443.xyz/https://raw.githubusercontent.com/chaos-zhu/easyimg/main/package.json', - { - headers: { - 'Accept': 'application/json', - 'User-Agent': 'EasyImg-Version-Check' - } - } - ) + // 尝试通过代理获取 + let remotePackage = await fetchPackageJson(PROXY_URL) - if (response.ok) { - const remotePackage = await response.json() - latestVersion = remotePackage.version + // 如果代理失败,使用源地址兜底 + if (!remotePackage) { + remotePackage = await fetchPackageJson(DIRECT_URL) + } - // 比较版本号 - if (latestVersion) { - hasUpdate = compareVersions(latestVersion, currentVersion) > 0 - } - } else { - error = `GitHub 请求失败: ${response.status}` - } - } catch (fetchError) { - error = `无法连接到 GitHub: ${fetchError.message}` + if (remotePackage && remotePackage.version) { + latestVersion = remotePackage.version + // 比较版本号 + hasUpdate = compareVersions(latestVersion, currentVersion) > 0 + } else { + error = '无法获取最新版本信息' } return { @@ -56,6 +69,32 @@ export default defineEventHandler(async (event) => { } }) +/** + * 从指定 URL 获取 package.json + * @param {string} url - 请求地址 + * @returns {object|null} - package.json 对象或 null + */ +async function fetchPackageJson(url) { + try { + const response = await fetch(url, { + headers: { + 'Accept': 'application/json', + 'User-Agent': 'EasyImg-Version-Check' + }, + // 设置超时时间为 10 秒 + signal: AbortSignal.timeout(10000) + }) + + if (response.ok) { + return await response.json() + } + } catch (err) { + // 请求失败,返回 null + console.log(`版本检测请求失败 (${url}):`, err.message) + } + return null +} + /** * 比较两个语义化版本号 * @param {string} v1 - 版本号1