吉安感知网项目-前端
shuishen
2026-01-27 ebf577619ea6f9ab951f77bd7281f9f4fe7f3cff
applications/drone-command/src/views/dataCockpit/components/LeftContainer.vue
@@ -7,7 +7,7 @@
            <div class="category-item" v-for="(item, ind) in categoryList" :key="ind"
               @click="activeIdModel = item.id" :class="{ active: activeIdModel === item.id }">
               {{ item.name }}
               <span class="badge">{{ item.badge }}</span>
               <span class="badge" v-if="item.badge">{{ item.badge }}</span>
            </div>
         </div>
@@ -27,6 +27,8 @@
import RealWarning from './RealWarning.vue'
import EquipmentWarning from './EquipmentWarning.vue'
import HistoryWarning from './HistoryWarning.vue'
import { alarmStatisticsApi } from '@/api/dataCockpit'
import { onMounted } from 'vue'
const props = defineProps({
   activeId: {
@@ -55,19 +57,19 @@
   {
      id: 1,
      name: '实时告警',
      badge: 8,
      badge: 0,
      component: RealWarning
   },
   {
      id: 2,
      name: '设备告警',
      badge: 8,
      badge: 0,
      component: EquipmentWarning
   },
   {
      id: 3,
      name: '历史告警',
      badge: 8,
      badge: 0,
      component: HistoryWarning
   }
])
@@ -79,6 +81,24 @@
const toggleCollapse = () => {
   collapsedModel.value = !collapsedModel.value
}
const updateBadges = async () => {
   const res = await alarmStatisticsApi()
   const data = res?.data?.data || {}
   const realTotal = data.realTimeAlarmCount ?? 0
   const historyTotal = data.historyAlarmCount ?? 0
   const deviceTotal = data.deviceAlarmCount ?? 0
   categoryList.value = categoryList.value.map((item) => {
      if (item.id === 1) return { ...item, badge: realTotal }
      if (item.id === 2) return { ...item, badge: deviceTotal }
      if (item.id === 3) return { ...item, badge: historyTotal }
      return item
   })
}
onMounted(() => {
   updateBadges()
})
</script>
<style lang="scss" scoped>
@@ -87,30 +107,25 @@
   transition: transform 0.3s ease-in-out;
   &.collapsed {
      transform: translateX(-100%);
      transform: translateX(calc(-100% - 17px - 32px));
   }
}
.collapse-btn {
   position: absolute;
   top: 50%;
   left: 357px;
   background: rgba(17, 23, 34, 0.8);
   border: 1px solid #333355;
   border-left: none;
   border-radius: 0 4px 4px 0;
   bottom: 454px;
   left: 300px;
   cursor: pointer;
   display: flex;
   align-items: center;
   justify-content: center;
   color: #fff;
   z-index: 10;
   backdrop-filter: blur(5px);
   transform: translateY(-50%);
   transform: translateY(50%);
   .arrow {
      width: 24px;
      height: 24px;
      width: 36px;
      height: 36px;
      background: url('@/assets/images/dataCockpit/left-btn.png') center / 100% 100% no-repeat;
   }
@@ -120,8 +135,19 @@
}
.category-container {
   position: relative;
   display: flex;
   justify-content: space-between;
   &::after {
      content: '';
      position: absolute;
      left: 0;
      bottom: 0;
      width: 100%;
      height: 1px;
      background: #333355;
   }
   .category-item {
      position: relative;
@@ -155,8 +181,7 @@
         left: 0;
         bottom: 0;
         width: 100%;
         height: 1px;
         background: #333355;
         height: 0;
      }
      &.active::after {
@@ -164,19 +189,19 @@
         background: #284FE3;
         box-shadow: 0px 3px 2px 0px rgba(15, 89, 255, 0.1), 0px 7px 5px 0px rgba(15, 89, 255, 0.15), 0px 13px 10px 0px rgba(15, 89, 255, 0.18), 0px 22px 18px 0px rgba(15, 89, 255, 0.21), 0px 42px 33px 0px rgba(15, 89, 255, 0.26), 0px 100px 80px 0px rgba(15, 89, 255, 0.36);
         border-radius: 5px 5px 0px 0px;
         z-index: 9;
      }
      .badge {
         position: absolute;
         top: 16px;
         right: 4px;
         min-width: 16px;
         height: 16px;
         line-height: 16px;
         right: -4px;
         min-width: 18px;
         line-height: 18px;
         font-size: 12px;
         color: #FFFFFF;
         background: #FF3B30;
         border-radius: 9px;
         border-radius: 50%;
         text-align: center;
         box-shadow: 0px 2px 6px rgba(255, 59, 48, 0.6);
         pointer-events: none;
@@ -188,7 +213,6 @@
   height: 0;
   flex: 1;
   margin-top: 20px;
   overflow-x: hidden;
   overflow-y: auto;
   overflow: hidden;
}
</style>