/** * 系统版本升级管理模块 * * 提供完整的应用版本升级检测和处理功能 * * ## 主要功能 * * - 版本号比较和升级检测 * - 首次访问识别和处理 * - 旧版本数据自动清理 * - 升级日志展示和通知 * - 强制重新登录控制(根据升级日志配置) * - 版本号规范化处理 * - 旧存储结构迁移和清理 * - 升级流程延迟执行(确保应用完全加载) * * ## 使用场景 * * - 应用启动时自动检测版本升级 * - 版本更新后清理旧数据 * - 向用户展示版本更新内容 * - 重大更新时要求用户重新登录 * - 防止旧版本数据污染新版本 * * ## 工作流程 * * 1. 检查本地存储的版本号 * 2. 与当前应用版本对比 * 3. 查找并清理旧版本数据 * 4. 展示升级通知(包含更新日志) * 5. 根据配置决定是否强制重新登录 * 6. 更新本地版本号 * * @module utils/sys/upgrade * @author Art Design Pro Team */ import { upgradeLogList } from '@/mock/upgrade/changeLog' import { ElNotification } from 'element-plus' import { useUserStore } from '@/store/modules/user' import { StorageConfig } from '@/utils/storage/storage-config' /** * 版本管理器 * 负责处理版本比较、升级检测和数据清理 */ class VersionManager { /** * 规范化版本号字符串,移除前缀 'v' */ private normalizeVersion(version: string): string { return version.replace(/^v/, '') } /** * 获取存储的版本号 */ private getStoredVersion(): string | null { return localStorage.getItem(StorageConfig.VERSION_KEY) } /** * 设置版本号到存储 */ private setStoredVersion(version: string): void { localStorage.setItem(StorageConfig.VERSION_KEY, version) } /** * 检查是否应该跳过升级处理 */ private shouldSkipUpgrade(): boolean { return StorageConfig.CURRENT_VERSION === StorageConfig.SKIP_UPGRADE_VERSION } /** * 检查是否为首次访问 */ private isFirstVisit(storedVersion: string | null): boolean { return !storedVersion } /** * 检查版本是否相同 */ private isSameVersion(storedVersion: string): boolean { return storedVersion === StorageConfig.CURRENT_VERSION } /** * 查找旧的存储结构 */ private findLegacyStorage(): { oldSysKey: string | null; oldVersionKeys: string[] } { const storageKeys = Object.keys(localStorage) const currentVersionPrefix = StorageConfig.generateStorageKey('').slice(0, -1) // 移除末尾的 '-' // 查找旧的单一存储结构 const oldSysKey = storageKeys.find( (key) => StorageConfig.isVersionedKey(key) && key !== currentVersionPrefix && !key.includes('-') ) || null // 查找旧版本的分离存储键 const oldVersionKeys = storageKeys.filter( (key) => StorageConfig.isVersionedKey(key) && !StorageConfig.isCurrentVersionKey(key) && key.includes('-') ) return { oldSysKey, oldVersionKeys } } /** * 检查是否需要重新登录 */ private shouldRequireReLogin(storedVersion: string): boolean { const normalizedCurrent = this.normalizeVersion(StorageConfig.CURRENT_VERSION) const normalizedStored = this.normalizeVersion(storedVersion) return upgradeLogList.value.some((item) => { const itemVersion = this.normalizeVersion(item.version) return ( item.requireReLogin && itemVersion > normalizedStored && itemVersion <= normalizedCurrent ) }) } /** * 构建升级通知消息 */ private buildUpgradeMessage(requireReLogin: boolean): string { const { title: content } = upgradeLogList.value[0] const messageParts = [ `
`, `系统已升级到 ${StorageConfig.CURRENT_VERSION} 版本,此次更新带来了以下改进:`, `
`, content ] if (requireReLogin) { messageParts.push( `升级完成,请重新登录后继续使用。
` ) } return messageParts.join('') } /** * 显示升级通知 */ private showUpgradeNotification(message: string): void { ElNotification({ title: '系统升级公告', message, duration: 0, type: 'success', dangerouslyUseHTMLString: true }) } /** * 清理旧版本数据 */ private cleanupLegacyData(oldSysKey: string | null, oldVersionKeys: string[]): void { // 清理旧的单一存储结构 if (oldSysKey) { localStorage.removeItem(oldSysKey) console.info(`[Upgrade] 已清理旧存储: ${oldSysKey}`) } // 清理旧版本的分离存储 oldVersionKeys.forEach((key) => { localStorage.removeItem(key) console.info(`[Upgrade] 已清理旧存储: ${key}`) }) } /** * 执行升级后的登出操作 */ private performLogout(): void { try { useUserStore().logOut() console.info('[Upgrade] 已执行升级后登出') } catch (error) { console.error('[Upgrade] 升级后登出失败:', error) } } /** * 执行升级流程 */ private async executeUpgrade( storedVersion: string, legacyStorage: ReturnType