114 lines
2.9 KiB
JavaScript
114 lines
2.9 KiB
JavaScript
import { verifyToken } from '../../utils/jwt'
|
|
|
|
// GitHub package.json 的 URL
|
|
const PROXY_URL = 'https://git.221022.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: '登录已过期,请重新登录'
|
|
}
|
|
}
|
|
|
|
// 从 runtimeConfig 获取当前版本(构建时注入)
|
|
const config = useRuntimeConfig()
|
|
const currentVersion = config.appVersion || '1.0.0'
|
|
|
|
// 从 GitHub 获取最新版本
|
|
let latestVersion = null
|
|
let hasUpdate = false
|
|
let error = null
|
|
|
|
// 尝试通过代理获取
|
|
let remotePackage = await fetchPackageJson(PROXY_URL)
|
|
|
|
// 如果代理失败,使用源地址兜底
|
|
if (!remotePackage) {
|
|
remotePackage = await fetchPackageJson(DIRECT_URL)
|
|
}
|
|
|
|
if (remotePackage && remotePackage.version) {
|
|
latestVersion = remotePackage.version
|
|
// 比较版本号
|
|
hasUpdate = compareVersions(latestVersion, currentVersion) > 0
|
|
} else {
|
|
error = '无法获取最新版本信息'
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
data: {
|
|
currentVersion,
|
|
latestVersion,
|
|
hasUpdate,
|
|
error
|
|
}
|
|
}
|
|
} catch (err) {
|
|
return {
|
|
success: false,
|
|
message: err.message
|
|
}
|
|
}
|
|
})
|
|
|
|
/**
|
|
* 从指定 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
|
|
* @param {string} v2 - 版本号2
|
|
* @returns {number} - 1: v1 > v2, -1: v1 < v2, 0: v1 = v2
|
|
*/
|
|
function compareVersions(v1, v2) {
|
|
const parts1 = v1.replace(/^v/, '').split('.').map(Number)
|
|
const parts2 = v2.replace(/^v/, '').split('.').map(Number)
|
|
|
|
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
const num1 = parts1[i] || 0
|
|
const num2 = parts2[i] || 0
|
|
|
|
if (num1 > num2) return 1
|
|
if (num1 < num2) return -1
|
|
}
|
|
|
|
return 0
|
|
} |