Skip to content

Commit 7e89d23

Browse files
authored
Merge pull request #99 from aice030/main
Feat: 更新前端代码,移除读写localStorage缓存操作,全部数据均通过api获取最新数据
2 parents 2613022 + f23f112 commit 7e89d23

File tree

3 files changed

+68
-130
lines changed

3 files changed

+68
-130
lines changed

client/src/mock/services.ts

Lines changed: 18 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,44 +1707,21 @@ export const mockAlertRuleChangelog: AlertRuleChangelogResponse = {
17071707
// 使用 localStorage 实现前端数据持久化
17081708

17091709
/**
1710-
* 保存数据到 localStorage
1710+
* 保存数据到 localStorage(已禁用)
17111711
*/
17121712
const saveDataToStorage = () => {
1713-
try {
1714-
localStorage.setItem('mockServiceActiveVersions', JSON.stringify(mockServiceActiveVersions))
1715-
localStorage.setItem('mockAvailableVersions', JSON.stringify(mockAvailableVersions))
1716-
console.log('数据已保存到 localStorage')
1717-
} catch (error) {
1718-
console.error('保存数据到 localStorage 失败:', error)
1719-
}
1713+
// 不再保存到 localStorage,所有数据从API获取
17201714
}
17211715

17221716
/**
1723-
* 从 localStorage 加载数据
1717+
* 从 localStorage 加载数据(已禁用)
17241718
*/
17251719
const loadDataFromStorage = () => {
1726-
try {
1727-
const activeVersionsData = localStorage.getItem('mockServiceActiveVersions')
1728-
const availableVersionsData = localStorage.getItem('mockAvailableVersions')
1729-
1730-
if (activeVersionsData) {
1731-
const parsedData = JSON.parse(activeVersionsData)
1732-
Object.assign(mockServiceActiveVersions, parsedData)
1733-
console.log('已从 localStorage 加载活跃版本数据')
1734-
}
1735-
1736-
if (availableVersionsData) {
1737-
const parsedData = JSON.parse(availableVersionsData)
1738-
Object.assign(mockAvailableVersions, parsedData)
1739-
console.log('已从 localStorage 加载可发布版本数据')
1740-
}
1741-
} catch (error) {
1742-
console.error('从 localStorage 加载数据失败:', error)
1743-
}
1720+
// 不再从 localStorage 加载,所有数据从API获取
17441721
}
17451722

1746-
// 页面加载时自动从 localStorage 恢复数据
1747-
loadDataFromStorage()
1723+
// 页面加载时不再从 localStorage 恢复数据(已禁用)
1724+
// loadDataFromStorage()
17481725

17491726
// ==================== 服务告警状态管理 ====================
17501727
// 管理服务节点的告警状态,用于改变拓扑图中节点的颜色
@@ -1760,31 +1737,17 @@ export type ServiceAlertStatus = 'normal' | 'pending' | 'processing'
17601737
export const serviceAlertStatusMap: Record<string, ServiceAlertStatus> = {}
17611738

17621739
/**
1763-
* 保存服务告警状态到 localStorage
1740+
* 保存服务告警状态(已禁用localStorage)
17641741
*/
17651742
const saveServiceAlertStatus = () => {
1766-
try {
1767-
localStorage.setItem('serviceAlertStatusMap', JSON.stringify(serviceAlertStatusMap))
1768-
console.log('服务告警状态已保存到 localStorage')
1769-
} catch (error) {
1770-
console.error('保存服务告警状态失败:', error)
1771-
}
1743+
// 不再保存到 localStorage,只在内存中维护
17721744
}
17731745

17741746
/**
1775-
* 从 localStorage 加载服务告警状态
1747+
* 从 localStorage 加载服务告警状态(已禁用)
17761748
*/
17771749
const loadServiceAlertStatus = () => {
1778-
try {
1779-
const data = localStorage.getItem('serviceAlertStatusMap')
1780-
if (data) {
1781-
const parsedData = JSON.parse(data)
1782-
Object.assign(serviceAlertStatusMap, parsedData)
1783-
console.log('已从 localStorage 加载服务告警状态')
1784-
}
1785-
} catch (error) {
1786-
console.error('从 localStorage 加载服务告警状态失败:', error)
1787-
}
1750+
// 不再从 localStorage 加载,改为从API获取
17881751
}
17891752

17901753
/**
@@ -1834,8 +1797,8 @@ export const clearServiceAlertStatus = (serviceName: string) => {
18341797
console.log(`已清除服务 ${serviceName} 的告警状态`)
18351798
}
18361799

1837-
// 页面加载时自动从 localStorage 恢复服务告警状态
1838-
loadServiceAlertStatus()
1800+
// 页面加载时不再从 localStorage 恢复服务告警状态(已禁用)
1801+
// loadServiceAlertStatus()
18391802

18401803
// ==================== 服务版本告警状态管理 ====================
18411804
// 让首页服务详情中的各版本颜色与告警状态同步
@@ -1917,31 +1880,17 @@ export type DeploymentStatus = 'idle' | 'deploying'
19171880
export const serviceDeploymentStatusMap: Record<string, DeploymentStatus> = {}
19181881

19191882
/**
1920-
* 保存服务发布状态到 localStorage
1883+
* 保存服务发布状态(已禁用localStorage)
19211884
*/
19221885
const saveServiceDeploymentStatus = () => {
1923-
try {
1924-
localStorage.setItem('serviceDeploymentStatusMap', JSON.stringify(serviceDeploymentStatusMap))
1925-
console.log('服务发布状态已保存到 localStorage')
1926-
} catch (error) {
1927-
console.error('保存服务发布状态失败:', error)
1928-
}
1886+
// 不再保存到 localStorage,只在内存中维护
19291887
}
19301888

19311889
/**
1932-
* 从 localStorage 加载服务发布状态
1890+
* 从 localStorage 加载服务发布状态(已禁用)
19331891
*/
19341892
const loadServiceDeploymentStatus = () => {
1935-
try {
1936-
const data = localStorage.getItem('serviceDeploymentStatusMap')
1937-
if (data) {
1938-
const parsedData = JSON.parse(data)
1939-
Object.assign(serviceDeploymentStatusMap, parsedData)
1940-
console.log('已从 localStorage 加载服务发布状态')
1941-
}
1942-
} catch (error) {
1943-
console.error('从 localStorage 加载服务发布状态失败:', error)
1944-
}
1893+
// 不再从 localStorage 加载,改为从API获取
19451894
}
19461895

19471896
/**
@@ -1973,8 +1922,8 @@ export const clearServiceDeploymentStatus = (serviceName: string) => {
19731922
console.log(`已清除服务 ${serviceName} 的发布状态`)
19741923
}
19751924

1976-
// 页面加载时自动从 localStorage 恢复服务发布状态
1977-
loadServiceDeploymentStatus()
1925+
// 页面加载时不再从 localStorage 恢复服务发布状态(已禁用)
1926+
// loadServiceDeploymentStatus()
19781927

19791928
// ==================== 数据操作函数 ====================
19801929
// 这些函数模拟后端操作数据的过程,用于支持前端的发布和回滚功能

client/src/views/AlertsView.vue

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,6 @@ import {
218218
} from '@element-plus/icons-vue'
219219
import { ElMessage } from 'element-plus'
220220
import { apiService } from '@/api'
221-
import { updateServiceAlertStatus, updateServiceVersionAlertStatus } from '@/mock/services'
222221
import type { AlertsResponse, AlertIssue, AlertDetail } from '@/mock/services'
223222
import { marked } from 'marked'
224223
@@ -397,8 +396,6 @@ const loadAlerts = async () => {
397396
398397
alerts.value = merged.slice(0, 10)
399398
allAlerts.value = merged
400-
// 同步拓扑服务状态
401-
syncServiceAlertStatuses(allAlerts.value)
402399
console.log('告警数据加载成功: All', { total: merged.length })
403400
} else {
404401
const state = filterState.value === 'open' ? 'Open' : 'Closed'
@@ -415,8 +412,6 @@ const loadAlerts = async () => {
415412
const mergedAll = [...openResp.data.items, ...closedResp.data.items]
416413
.sort((a: any, b: any) => new Date(b.alertSince).getTime() - new Date(a.alertSince).getTime())
417414
allAlerts.value = mergedAll
418-
// 同步拓扑服务状态
419-
syncServiceAlertStatuses(allAlerts.value)
420415
console.log('告警数据加载成功:', { filter: state, count: alerts.value.length, total: mergedAll.length })
421416
}
422417
} catch (err) {
@@ -428,59 +423,6 @@ const loadAlerts = async () => {
428423
}
429424
}
430425
431-
// 将告警状态同步到首页拓扑的服务节点颜色
432-
const syncServiceAlertStatuses = (issues: AlertIssue[]) => {
433-
// 优先级:Pending > InProcessing > Restored > AutoRestored
434-
const priority: Record<string, number> = {
435-
Pending: 4,
436-
InProcessing: 3,
437-
Restored: 2,
438-
AutoRestored: 1
439-
}
440-
441-
// 可能需要从其他标签映射到首页的服务名
442-
const prophetToServiceMap: Record<string, string> = {
443-
s3apiv2: 's3'
444-
}
445-
446-
const latestStateByService = new Map<string, { state: AlertIssue['alertState']; ts: number; prio: number }>()
447-
448-
for (const issue of issues) {
449-
// 解析服务名:优先 labels.service,其次 prophet_service 的映射
450-
const serviceLabel = issue.labels.find(l => l.key === 'service')?.value
451-
const prophetService = issue.labels.find(l => l.key === 'prophet_service')?.value
452-
const mapped = prophetService ? prophetToServiceMap[prophetService] : undefined
453-
const serviceName = serviceLabel || mapped
454-
if (!serviceName) continue
455-
456-
const ts = new Date(issue.alertSince).getTime()
457-
const prio = priority[issue.alertState] || 0
458-
const existing = latestStateByService.get(serviceName)
459-
if (!existing || prio > existing.prio || (prio === existing.prio && ts > existing.ts)) {
460-
latestStateByService.set(serviceName, { state: issue.alertState, ts, prio })
461-
}
462-
463-
// 同步版本状态(如果存在 service_version 标签)
464-
// 版本标签检测:兼容多种后端命名
465-
const versionLabel =
466-
issue.labels.find(l => l.key === 'service_version')?.value ||
467-
issue.labels.find(l => l.key === 'version')?.value ||
468-
issue.labels.find(l => l.key === 'serviceVersion')?.value ||
469-
issue.labels.find(l => l.key === 'svc_version')?.value ||
470-
issue.labels.find(l => l.key === 'deploy_version')?.value ||
471-
issue.labels.find(l => l.key === 'deployVersion')?.value ||
472-
issue.labels.find(l => l.key.toLowerCase().includes('version'))?.value
473-
if (versionLabel) {
474-
updateServiceVersionAlertStatus(serviceName, versionLabel, issue.alertState)
475-
}
476-
}
477-
478-
// 写入共享状态映射(持久化到 localStorage)
479-
latestStateByService.forEach((val, service) => {
480-
updateServiceAlertStatus(service, val.state)
481-
})
482-
}
483-
484426
// 生命周期
485427
onMounted(() => {
486428
loadAlerts()

client/src/views/HomeView.vue

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -643,18 +643,65 @@ const generateVersionsFromDeployState = (service: any) => {
643643
}
644644
}
645645
646+
// 解析告警列表,提取服务告警状态
647+
const parseAlertsToServiceStatus = (alertsData: any) => {
648+
// 优先级:Pending > InProcessing > Restored > AutoRestored
649+
const priority: Record<string, number> = {
650+
Pending: 4,
651+
InProcessing: 3,
652+
Restored: 2,
653+
AutoRestored: 1
654+
}
655+
656+
// 服务名映射
657+
const prophetToServiceMap: Record<string, string> = {
658+
s3apiv2: 's3'
659+
}
660+
661+
const latestStateByService = new Map<string, { state: string; ts: number; prio: number }>()
662+
663+
for (const issue of alertsData) {
664+
// 解析服务名:优先 labels.service,其次 prophet_service 的映射
665+
const serviceLabel = issue.labels.find((l: any) => l.key === 'service')?.value
666+
const prophetService = issue.labels.find((l: any) => l.key === 'prophet_service')?.value
667+
const mapped = prophetService ? prophetToServiceMap[prophetService] : undefined
668+
const serviceName = serviceLabel || mapped
669+
if (!serviceName) continue
670+
671+
const ts = new Date(issue.alertSince).getTime()
672+
const prio = priority[issue.alertState] || 0
673+
const existing = latestStateByService.get(serviceName)
674+
if (!existing || prio > existing.prio || (prio === existing.prio && ts > existing.ts)) {
675+
latestStateByService.set(serviceName, { state: issue.alertState, ts, prio })
676+
}
677+
}
678+
679+
// 更新到全局状态映射
680+
latestStateByService.forEach((val, service) => {
681+
updateServiceAlertStatus(service, val.state)
682+
})
683+
}
684+
646685
// API调用函数
647686
const loadServicesData = async () => {
648687
loading.value = true
649688
error.value = null
650689
651690
try {
652-
// 加载服务数据 - 调用真实后端API
653-
const response = await apiService.getServices()
654-
const servicesResponse = response.data
691+
// 并行加载服务数据和告警数据
692+
const [servicesRes, openAlertsRes, closedAlertsRes] = await Promise.all([
693+
apiService.getServices(),
694+
apiService.getAlerts(undefined, 100, 'Open'),
695+
apiService.getAlerts(undefined, 100, 'Closed')
696+
])
655697
698+
const servicesResponse = servicesRes.data
656699
servicesData.value = servicesResponse
657700
701+
// 解析告警状态并更新到内存
702+
const allAlerts = [...openAlertsRes.data.items, ...closedAlertsRes.data.items]
703+
parseAlertsToServiceStatus(allAlerts)
704+
658705
// 转换数据
659706
try {
660707
const { nodes: transformedNodes, edges: transformedEdges } = transformServiceData(servicesResponse)

0 commit comments

Comments
 (0)