增加右上角告警铃铛

This commit is contained in:
2025-11-16 20:03:35 +08:00
parent 17ccd3b50b
commit 68c3208144

View File

@@ -77,6 +77,28 @@
<template #title>计划管理</template> <template #title>计划管理</template>
</el-menu-item> </el-menu-item>
<!-- 告警中心二级菜单 -->
<el-sub-menu index="/alarm">
<template #title>
<el-icon>
<Bell/>
</el-icon>
<span>告警中心</span>
</template>
<el-menu-item index="/alarms">
<el-icon>
<Warning />
</el-icon>
<template #title>告警管理</template>
</el-menu-item>
<el-menu-item index="/alarms/thresholds">
<el-icon>
<Setting />
</el-icon>
<template #title>阈值告警配置</template>
</el-menu-item>
</el-sub-menu>
<!-- 数据中心二级菜单 --> <!-- 数据中心二级菜单 -->
<el-sub-menu index="/monitor"> <el-sub-menu index="/monitor">
<template #title> <template #title>
@@ -195,28 +217,6 @@
</el-menu-item> </el-menu-item>
</el-sub-menu> </el-sub-menu>
<!-- 告警中心二级菜单 -->
<el-sub-menu index="/alarm">
<template #title>
<el-icon>
<Bell/>
</el-icon>
<span>告警中心</span>
</template>
<el-menu-item index="/alarms">
<el-icon>
<Warning />
</el-icon>
<template #title>告警管理</template>
</el-menu-item>
<el-menu-item index="/alarms/thresholds">
<el-icon>
<Setting />
</el-icon>
<template #title>阈值告警配置</template>
</el-menu-item>
</el-sub-menu>
</el-menu> </el-menu>
</el-aside> </el-aside>
@@ -235,6 +235,12 @@
<h3 class="page-title">{{ currentPageTitle }}</h3> <h3 class="page-title">{{ currentPageTitle }}</h3>
</div> </div>
<div class="user-info"> <div class="user-info">
<!-- 告警铃铛图标和角标 -->
<el-badge :value="unresolvedAlarmCount" :max="99" class="alarm-badge" @click="goToAlarmList" v-if="unresolvedAlarmCount > 0">
<el-icon :size="20"><Bell /></el-icon>
</el-badge>
<el-icon :size="20" class="alarm-icon" @click="goToAlarmList" v-else><Bell /></el-icon>
<el-dropdown> <el-dropdown>
<span class="el-dropdown-link"> <span class="el-dropdown-link">
{{ username }} <el-icon><ArrowDown/></el-icon> {{ username }} <el-icon><ArrowDown/></el-icon>
@@ -297,6 +303,7 @@ import {
Management, Management,
Bell Bell
} from '@element-plus/icons-vue'; } from '@element-plus/icons-vue';
import { getActiveAlarms } from '../api/alarm'; // 导入告警API
export default { export default {
name: 'MainLayout', name: 'MainLayout',
@@ -336,17 +343,64 @@ export default {
const router = useRouter(); const router = useRouter();
const isCollapse = ref(false); const isCollapse = ref(false);
const username = ref(localStorage.getItem('username') || '管理员'); const username = ref(localStorage.getItem('username') || '管理员');
/**
* 未解决告警数量
* @type {import('vue').Ref<number>}
*/
const unresolvedAlarmCount = ref(0);
/**
* 告警刷新定时器
* @type {number | null}
*/
let alarmFetchInterval = null;
const handleStorageChange = () => { const handleStorageChange = () => {
username.value = localStorage.getItem('username') || '管理员'; username.value = localStorage.getItem('username') || '管理员';
}; };
/**
* 获取未解决告警数量
* @returns {Promise<void>}
*/
const fetchUnresolvedAlarmCount = async () => {
try {
// 调用API获取活跃且未忽略的告警数量
const response = await getActiveAlarms({
is_ignored: false,
page_size: 1 // 只需获取总数所以page_size设为1
});
if (response && response.pagination) {
unresolvedAlarmCount.value = response.pagination.total || 0;
}
} catch (error) {
console.error('获取未解决告警数量失败:', error);
unresolvedAlarmCount.value = 0; // 发生错误时重置为0
}
};
/**
* 跳转到告警列表页面
* @returns {void}
*/
const goToAlarmList = () => {
router.push('/alarms');
};
onMounted(() => { onMounted(() => {
window.addEventListener('storage', handleStorageChange); window.addEventListener('storage', handleStorageChange);
// 首次加载时获取告警数量
fetchUnresolvedAlarmCount();
// 每30秒刷新一次告警数量
alarmFetchInterval = setInterval(fetchUnresolvedAlarmCount, 30000);
}); });
onUnmounted(() => { onUnmounted(() => {
window.removeEventListener('storage', handleStorageChange); window.removeEventListener('storage', handleStorageChange);
// 清除定时器
if (alarmFetchInterval) {
clearInterval(alarmFetchInterval);
alarmFetchInterval = null;
}
}); });
const toggleCollapse = () => { const toggleCollapse = () => {
@@ -378,7 +432,9 @@ export default {
currentPageTitle, currentPageTitle,
toggleCollapse, toggleCollapse,
logout, logout,
username username,
unresolvedAlarmCount, // 暴露给模板
goToAlarmList // 暴露给模板
}; };
} }
}; };
@@ -454,6 +510,18 @@ export default {
.user-info { .user-info {
margin-right: 10px; margin-right: 10px;
display: flex; /* 使内部元素水平排列 */
align-items: center; /* 垂直居中 */
gap: 20px; /* 元素间距 */
}
.alarm-badge {
cursor: pointer;
}
.alarm-icon {
cursor: pointer;
color: #606266; /* 默认图标颜色 */
} }
.main-content { .main-content {