mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-07-06 15:01:27 +08:00
feat(globalSetting): 添加版本检查与通知功能
This commit is contained in:
@@ -66,6 +66,7 @@ export default {
|
|||||||
serviceUnavailable: 'Service Unavailable',
|
serviceUnavailable: 'Service Unavailable',
|
||||||
status: 'Status',
|
status: 'Status',
|
||||||
preset: 'Preset',
|
preset: 'Preset',
|
||||||
|
newVersionAvailable: 'New version detected, please refresh the page to get the latest features',
|
||||||
},
|
},
|
||||||
mediaType: {
|
mediaType: {
|
||||||
movie: 'Movie',
|
movie: 'Movie',
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ export default {
|
|||||||
serviceUnavailable: '服务不可用',
|
serviceUnavailable: '服务不可用',
|
||||||
status: '状态',
|
status: '状态',
|
||||||
preset: '预设',
|
preset: '预设',
|
||||||
|
newVersionAvailable: '检测到新版本,请刷新页面以获取最新功能',
|
||||||
},
|
},
|
||||||
mediaType: {
|
mediaType: {
|
||||||
movie: '电影',
|
movie: '电影',
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ export default {
|
|||||||
serviceUnavailable: '服務不可用',
|
serviceUnavailable: '服務不可用',
|
||||||
status: '狀態',
|
status: '狀態',
|
||||||
preset: '預設',
|
preset: '預設',
|
||||||
|
newVersionAvailable: '檢測到新版本,請刷新頁面以獲取最新功能',
|
||||||
},
|
},
|
||||||
mediaType: {
|
mediaType: {
|
||||||
movie: '電影',
|
movie: '電影',
|
||||||
|
|||||||
@@ -1,8 +1,58 @@
|
|||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
|
import { useToast } from 'vue-toastification'
|
||||||
|
import i18n from '@/plugins/i18n'
|
||||||
|
|
||||||
// 创建一个专用的AbortController,用于globalSetting请求
|
// 创建一个专用的AbortController,用于globalSetting请求
|
||||||
const globalSettingController = new AbortController()
|
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() {
|
export async function fetchGlobalSettings() {
|
||||||
try {
|
try {
|
||||||
const result: { [key: string]: any } = await api.get('system/global', {
|
const result: { [key: string]: any } = await api.get('system/global', {
|
||||||
@@ -12,7 +62,15 @@ export async function fetchGlobalSettings() {
|
|||||||
// 手动设置signal,防止reqestOptimizer添加可中断的controller
|
// 手动设置signal,防止reqestOptimizer添加可中断的controller
|
||||||
signal: globalSettingController.signal,
|
signal: globalSettingController.signal,
|
||||||
})
|
})
|
||||||
return result.data || {}
|
|
||||||
|
const data = result.data || {}
|
||||||
|
|
||||||
|
// 检查版本更新
|
||||||
|
if (data.FRONTEND_VERSION) {
|
||||||
|
await checkVersionAndNotify(data.FRONTEND_VERSION)
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to fetch global settings', error)
|
console.error('Failed to fetch global settings', error)
|
||||||
throw error
|
throw error
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ import VueI18n from '@intlify/unplugin-vue-i18n/vite'
|
|||||||
import { resolve } from 'node:path'
|
import { resolve } from 'node:path'
|
||||||
import federation from '@originjs/vite-plugin-federation'
|
import federation from '@originjs/vite-plugin-federation'
|
||||||
import topLevelAwait from 'vite-plugin-top-level-await'
|
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/
|
// https://vitejs.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
@@ -277,7 +281,10 @@ export default defineConfig({
|
|||||||
promiseImportName: i => `__mp_tla_${i}`,
|
promiseImportName: i => `__mp_tla_${i}`,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
define: { 'process.env': {} },
|
define: {
|
||||||
|
'process.env': {},
|
||||||
|
'__APP_VERSION__': JSON.stringify(`v${packageJson.version}`)
|
||||||
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||||
|
|||||||
Reference in New Issue
Block a user