DeviceStatusPanel.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <template>
  2. <div class="device-status-panel">
  3. <TechTabs v-model="onlineStatusActiveTab" type="segmented" @tab-click="handleTabClick">
  4. <TechTabPane label="信号机" name="signalMachine" style="height: 100%;">
  5. <DynamicDonutChart v-if="onlineStatusDisplayData" :chartData="onlineStatusDisplayData.chartData"
  6. :centerTitle="onlineStatusDisplayData.centerTitle" :centerSubTitle="onlineStatusDisplayData.centerSubTitle" customHeight="133px"/>
  7. </TechTabPane>
  8. <TechTabPane label="检测器" name="detector">
  9. <DynamicDonutChart v-if="onlineStatusDisplayData" :chartData="onlineStatusDisplayData.chartData"
  10. :centerTitle="onlineStatusDisplayData.centerTitle" :centerSubTitle="onlineStatusDisplayData.centerSubTitle" customHeight="133px"/>
  11. </TechTabPane>
  12. <TechTabPane label="红路灯" name="trafficLight">
  13. <DynamicDonutChart v-if="onlineStatusDisplayData" :chartData="onlineStatusDisplayData.chartData"
  14. :centerTitle="onlineStatusDisplayData.centerTitle" :centerSubTitle="onlineStatusDisplayData.centerSubTitle" customHeight="133px"/>
  15. </TechTabPane>
  16. </TechTabs>
  17. </div>
  18. </template>
  19. <script>
  20. import TechTabs from '@/components/ui/TechTabs.vue';
  21. import TechTabPane from '@/components/ui/TechTabPane.vue';
  22. import DynamicDonutChart from '@/components/ui/DynamicDonutChart.vue';
  23. const mockDeviceData = {
  24. 'signalMachine': {
  25. centerTitle: '98%',
  26. centerSubTitle: '980/1000',
  27. chartData: [
  28. { name: '在线', value: 980, color: '#32F6F8' },
  29. { name: '离线', value: 20, color: '#E4D552' }
  30. ]
  31. },
  32. 'detector': {
  33. centerTitle: '85%',
  34. centerSubTitle: '425/500',
  35. chartData: [
  36. { name: '正常', value: 425, color: '#32F6F8' },
  37. { name: '故障', value: 50, color: '#faad14' },
  38. ]
  39. },
  40. 'trafficLight': {
  41. centerTitle: '99%',
  42. centerSubTitle: '1188/1200',
  43. chartData: [
  44. { name: '正常发光', value: 1188, color: '#32F6F8' },
  45. { name: '灯组损坏', value: 12, color: '#ff4d4f' }
  46. ]
  47. }
  48. };
  49. export default {
  50. name: 'DeviceStatusPanel',
  51. components: {
  52. TechTabs,
  53. TechTabPane,
  54. DynamicDonutChart
  55. },
  56. data() {
  57. return {
  58. // 在线状态面板
  59. onlineStatusActiveTab: 'detector',
  60. onlineStatusDisplayData: mockDeviceData['detector'],
  61. };
  62. },
  63. computed: {
  64. // 获取当前激活 Tab 的数据
  65. currentData() {
  66. return this.tabs[this.activeIndex].data;
  67. }
  68. },
  69. mounted() {
  70. },
  71. beforeDestroy() {
  72. },
  73. methods: {
  74. // 监听 Tab 切换事件
  75. handleTabClick(selectedTabName) {
  76. console.log('用户切换了设备类型:', selectedTabName);
  77. // 从 mock 字典中取出对应的数据并赋值,图表会自动响应式更新!
  78. if (mockDeviceData[selectedTabName]) {
  79. this.onlineStatusDisplayData = mockDeviceData[selectedTabName];
  80. }
  81. },
  82. }
  83. };
  84. </script>
  85. <style scoped>
  86. .device-status-panel {
  87. width: 100%;
  88. height: 100%;
  89. display: flex;
  90. flex-direction: column;
  91. /* box-sizing: border-box; */
  92. }
  93. </style>