yqdl.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <script setup lang="ts">
  2. import { ref, computed } from 'vue'
  3. import ElectricityDetail from '@/views/zhdpgl/yqzl/components/ElectricityDetail.vue'
  4. import { Search, Eye, Cpu, Gauge, X } from 'lucide-vue-next'
  5. import { ElButton, ElInput, ElDialog, ElCard } from 'element-plus'
  6. interface ElectricityDevice {
  7. tableNumber: string
  8. negativeSensor: number
  9. }
  10. // Sample data - replace with your actual data source
  11. const deviceList = ref<ElectricityDevice[]>([
  12. { tableNumber: '110125022003', negativeSensor: 20 },
  13. { tableNumber: '110125022004', negativeSensor: 15 },
  14. { tableNumber: '110125022005', negativeSensor: 30 },
  15. { tableNumber: '110125022006', negativeSensor: 25 },
  16. { tableNumber: '110125022007', negativeSensor: 18 }
  17. ])
  18. const searchQuery = ref('')
  19. const showDetail = ref(false)
  20. const currentDevice = ref<ElectricityDevice>({
  21. tableNumber: '',
  22. negativeSensor: 0
  23. })
  24. // Filter devices based on search query
  25. const filteredDevices = computed(() => {
  26. if (!searchQuery.value) return deviceList.value
  27. return deviceList.value.filter(device =>
  28. device.tableNumber.toLowerCase().includes(searchQuery.value.toLowerCase())
  29. )
  30. })
  31. // View device details
  32. const viewDeviceDetail = (device: ElectricityDevice) => {
  33. currentDevice.value = device
  34. showDetail.value = true
  35. }
  36. // Close detail view
  37. const closeDetail = () => {
  38. showDetail.value = false
  39. }
  40. </script>
  41. <template>
  42. <div class="device-list-container p-4">
  43. <!-- Search and header -->
  44. <div class="flex justify-between items-center mb-4">
  45. <h2 class="text-xl font-bold">设备列表</h2>
  46. <div class="search-box flex items-center">
  47. <ElInput
  48. v-model="searchQuery"
  49. placeholder="搜索设备表号"
  50. class="w-64"
  51. :prefix-icon="Search"
  52. />
  53. </div>
  54. </div>
  55. <!-- Replace the Device list table section with this card grid -->
  56. <div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 mt-4">
  57. <el-card
  58. v-for="device in filteredDevices"
  59. :key="device.tableNumber"
  60. class="device-card hover:shadow-lg transition-shadow duration-300"
  61. shadow="hover"
  62. >
  63. <div class="flex flex-col">
  64. <div class="flex items-center mb-3">
  65. <div class="bg-blue-100 p-2 rounded-full mr-3">
  66. <cpu class="text-blue-500 h-5 w-5" />
  67. </div>
  68. <div>
  69. <h3 class="font-bold">设备表号</h3>
  70. <p class="text-gray-600">{{ device.tableNumber }}</p>
  71. </div>
  72. </div>
  73. <div class="flex items-center mb-4">
  74. <div class="bg-green-100 p-2 rounded-full mr-3">
  75. <gauge class="text-green-500 h-5 w-5" />
  76. </div>
  77. <div>
  78. <h3 class="font-bold">负感器值</h3>
  79. <p class="text-gray-600">{{ device.negativeSensor }}</p>
  80. </div>
  81. </div>
  82. <el-button
  83. type="primary"
  84. @click="viewDeviceDetail(device)"
  85. class="w-full flex items-center justify-center"
  86. >
  87. <Eye class="mr-1 h-4 w-4" />
  88. 查看详情
  89. </el-button>
  90. </div>
  91. </el-card>
  92. </div>
  93. <!-- Modify the Full screen detail view section -->
  94. <ElDialog
  95. v-model="showDetail"
  96. fullscreen
  97. :show-close="false"
  98. @close="closeDetail"
  99. class="custom-dialog"
  100. >
  101. <div class="relative">
  102. <button
  103. @click="closeDetail"
  104. class="absolute top-2 left-4 bg-gray-200 hover:bg-gray-300 rounded-full p-2 transition-colors duration-200"
  105. >
  106. <x class="h-5 w-5" />
  107. </button>
  108. <div class="text-center pt-2 pb-4">
  109. <h3 class="text-lg font-bold">设备详情</h3>
  110. </div>
  111. </div>
  112. <electricity-detail
  113. :negativeSensor="currentDevice.negativeSensor"
  114. :tableNumber="currentDevice.tableNumber"
  115. />
  116. </ElDialog>
  117. </div>
  118. </template>
  119. <style scoped>
  120. .device-list-container {
  121. height: 100%;
  122. background-color: #fff;
  123. }
  124. .custom-dialog :deep(.el-dialog__header) {
  125. padding: 0;
  126. margin: 0;
  127. }
  128. .device-card {
  129. transition: all 0.3s;
  130. }
  131. .device-card:hover {
  132. transform: translateY(-5px);
  133. }
  134. </style>