zhou zhou
4 小时以前 fec285d150b377d004e47f0973d298b92fe4c711
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
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'
   */
  normalizeVersion(version) {
    return version.replace(/^v/, '')
  }
  /**
   * 获取存储的版本号
   */
  getStoredVersion() {
    return localStorage.getItem(StorageConfig.VERSION_KEY)
  }
  /**
   * 设置版本号到存储
   */
  setStoredVersion(version) {
    localStorage.setItem(StorageConfig.VERSION_KEY, version)
  }
  /**
   * 检查是否应该跳过升级处理
   */
  shouldSkipUpgrade() {
    return StorageConfig.CURRENT_VERSION === StorageConfig.SKIP_UPGRADE_VERSION
  }
  /**
   * 检查是否为首次访问
   */
  isFirstVisit(storedVersion) {
    return !storedVersion
  }
  /**
   * 检查版本是否相同
   */
  isSameVersion(storedVersion) {
    return storedVersion === StorageConfig.CURRENT_VERSION
  }
  /**
   * 查找旧的存储结构
   */
  findLegacyStorage() {
    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 }
  }
  /**
   * 检查是否需要重新登录
   */
  shouldRequireReLogin(storedVersion) {
    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
      )
    })
  }
  /**
   * 构建升级通知消息
   */
  buildUpgradeMessage(requireReLogin) {
    const { title: content } = upgradeLogList.value[0]
    const messageParts = [
      `<p style="color: var(--art-gray-800) !important; padding-bottom: 5px;">`,
      `系统已升级到 ${StorageConfig.CURRENT_VERSION} 版本,此次更新带来了以下改进:`,
      `</p>`,
      content
    ]
    if (requireReLogin) {
      messageParts.push(
        `<p style="color: var(--theme-color); padding-top: 5px;">升级完成,请重新登录后继续使用。</p>`
      )
    }
    return messageParts.join('')
  }
  /**
   * 显示升级通知
   */
  showUpgradeNotification(message) {
    ElNotification({
      title: '系统升级公告',
      message,
      duration: 0,
      type: 'success',
      dangerouslyUseHTMLString: true
    })
  }
  /**
   * 清理旧版本数据
   */
  cleanupLegacyData(oldSysKey, oldVersionKeys) {
    if (oldSysKey) {
      localStorage.removeItem(oldSysKey)
      console.info(`[Upgrade] 已清理旧存储: ${oldSysKey}`)
    }
    oldVersionKeys.forEach((key) => {
      localStorage.removeItem(key)
      console.info(`[Upgrade] 已清理旧存储: ${key}`)
    })
  }
  /**
   * 执行升级后的登出操作
   */
  performLogout() {
    try {
      useUserStore().logOut()
      console.info('[Upgrade] 已执行升级后登出')
    } catch (error) {
      console.error('[Upgrade] 升级后登出失败:', error)
    }
  }
  /**
   * 执行升级流程
   */
  async executeUpgrade(storedVersion, legacyStorage) {
    try {
      if (!upgradeLogList.value.length) {
        console.warn('[Upgrade] 升级日志列表为空')
        return
      }
      const requireReLogin = this.shouldRequireReLogin(storedVersion)
      const message = this.buildUpgradeMessage(requireReLogin)
      this.showUpgradeNotification(message)
      this.setStoredVersion(StorageConfig.CURRENT_VERSION)
      this.cleanupLegacyData(legacyStorage.oldSysKey, legacyStorage.oldVersionKeys)
      if (requireReLogin) {
        this.performLogout()
      }
      console.info(`[Upgrade] 升级完成: ${storedVersion} → ${StorageConfig.CURRENT_VERSION}`)
    } catch (error) {
      console.error('[Upgrade] 系统升级处理失败:', error)
    }
  }
  /**
   * 系统升级处理主流程
   */
  async processUpgrade() {
    if (this.shouldSkipUpgrade()) {
      console.debug('[Upgrade] 跳过版本升级检查')
      return
    }
    const storedVersion = this.getStoredVersion()
    if (this.isFirstVisit(storedVersion)) {
      this.setStoredVersion(StorageConfig.CURRENT_VERSION)
      return
    }
    if (this.isSameVersion(storedVersion)) {
      return
    }
    const legacyStorage = this.findLegacyStorage()
    if (!legacyStorage.oldSysKey && legacyStorage.oldVersionKeys.length === 0) {
      this.setStoredVersion(StorageConfig.CURRENT_VERSION)
      console.info('[Upgrade] 无旧数据,已更新版本号')
      return
    }
    setTimeout(() => {
      this.executeUpgrade(storedVersion, legacyStorage)
    }, StorageConfig.UPGRADE_DELAY)
  }
}
const versionManager = new VersionManager()
async function systemUpgrade() {
  await versionManager.processUpgrade()
}
export { systemUpgrade }