Merge pull request #415 from PKC278/v2

This commit is contained in:
jxxghp
2025-12-28 17:17:49 +08:00
committed by GitHub
5 changed files with 70 additions and 2 deletions

View File

@@ -66,6 +66,7 @@ export default {
serviceUnavailable: 'Service Unavailable',
status: 'Status',
preset: 'Preset',
newVersionAvailable: 'New version detected, please refresh the page to get the latest features',
},
mediaType: {
movie: 'Movie',

View File

@@ -66,6 +66,7 @@ export default {
serviceUnavailable: '服务不可用',
status: '状态',
preset: '预设',
newVersionAvailable: '检测到新版本,请刷新页面以获取最新功能',
},
mediaType: {
movie: '电影',

View File

@@ -66,6 +66,7 @@ export default {
serviceUnavailable: '服務不可用',
status: '狀態',
preset: '預設',
newVersionAvailable: '檢測到新版本,請刷新頁面以獲取最新功能',
},
mediaType: {
movie: '電影',

View File

@@ -1,8 +1,58 @@
import api from '@/api'
import { useToast } from 'vue-toastification'
import i18n from '@/plugins/i18n'
// 创建一个专用的AbortController用于globalSetting请求
const globalSettingController = new AbortController()
// 声明全局变量类型
declare const __APP_VERSION__: string
// 当前前端版本号(由 Vite 在编译时注入)
const CURRENT_FRONTEND_VERSION = __APP_VERSION__
console.log(`[VersionChecker] 当前前端版本: ${CURRENT_FRONTEND_VERSION}`)
// 标记是否已经显示过版本更新通知
let versionNotificationShown = false
/**
* 检查版本并在需要时显示更新通知
*/
async function checkVersionAndNotify(serverVersion: string): Promise<void> {
// 版本不同,且尚未显示通知
if (serverVersion !== CURRENT_FRONTEND_VERSION && !versionNotificationShown) {
versionNotificationShown = true
console.log(`[VersionChecker] 检测到版本更新: ${CURRENT_FRONTEND_VERSION} -> ${serverVersion}`)
try {
// 1. 清除所有缓存
if ('caches' in window) {
const cacheNames = await caches.keys()
await Promise.all(cacheNames.map(name => caches.delete(name)))
console.log('[VersionChecker] 已清除所有缓存')
}
// 2. 注销Service Worker
if ('serviceWorker' in navigator) {
const registrations = await navigator.serviceWorker.getRegistrations()
await Promise.all(registrations.map(registration => registration.unregister()))
console.log('[VersionChecker] 已注销所有 Service Worker')
}
} catch (error) {
console.error('[VersionChecker] 清除缓存失败:', error)
}
// 3. 显示持久化通知,提示用户刷新
const toast = useToast()
toast.info(i18n.global.t('common.newVersionAvailable'), {
timeout: false, // 不自动消失
closeButton: false,
closeOnClick: false,
draggable: false,
})
}
}
export async function fetchGlobalSettings() {
try {
const result: { [key: string]: any } = await api.get('system/global', {
@@ -12,7 +62,15 @@ export async function fetchGlobalSettings() {
// 手动设置signal防止reqestOptimizer添加可中断的controller
signal: globalSettingController.signal,
})
return result.data || {}
const data = result.data || {}
// 检查版本更新
if (data.FRONTEND_VERSION) {
await checkVersionAndNotify(data.FRONTEND_VERSION)
}
return data
} catch (error) {
console.error('Failed to fetch global settings', error)
throw error

View File

@@ -10,6 +10,10 @@ import VueI18n from '@intlify/unplugin-vue-i18n/vite'
import { resolve } from 'node:path'
import federation from '@originjs/vite-plugin-federation'
import topLevelAwait from 'vite-plugin-top-level-await'
import { readFileSync } from 'node:fs'
// 读取 package.json 获取版本号
const packageJson = JSON.parse(readFileSync('./package.json', 'utf-8'))
// https://vitejs.dev/config/
export default defineConfig({
@@ -277,7 +281,10 @@ export default defineConfig({
promiseImportName: i => `__mp_tla_${i}`,
}),
],
define: { 'process.env': {} },
define: {
'process.env': {},
'__APP_VERSION__': JSON.stringify(`v${packageJson.version}`)
},
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),