CamerasOverview.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <div class="camera-page">
  3. <ConditionQuery />
  4. <div class="camera-list">
  5. <BasicTable :columns="columns" :data-source="cameraItems" :row-key="(row) => row.code" :action-column="actionColumn"
  6. :pagination="{ total: total, pageSize: size, hideOnSinglePage: !cameraItems.length }" :loading="loading"
  7. :tableSetting="{
  8. size: false,
  9. redo: false,
  10. fullscreen: false,
  11. striped: false,
  12. setting: false,
  13. }" :striped="true" ref="tableRef" @order-change="orderByItem" @page-num-change="handlePageNumChange"
  14. @page-size-change="handlePageSizeChange">
  15. <template #tableTitle>
  16. <el-button type="primary" :icon="Plus" @click="showAddPopover = true">添加</el-button>
  17. </template>
  18. <template #empty>
  19. <div class="empty-content flex flex-col items-center">
  20. <img :src="emptyImg" class="empty-img" />
  21. <span class="empty-text">目前无内容,请先添加相机</span>
  22. </div>
  23. </template>
  24. </BasicTable>
  25. </div>
  26. <AddCamera class="add-popover" v-model="showAddPopover" />
  27. <EditCamera class="add-popover" v-model="showEditPopover" :edit-data="editCameraData" />
  28. </div>
  29. </template>
  30. <script setup lang="ts">
  31. import { h, onBeforeUnmount, onMounted, reactive, ref } from 'vue';
  32. import { BasicTable, TableActionIcons } from '@/components/Table';
  33. import { BasicColumn } from '@/components/Table';
  34. import { columns } from './overviewColumns';
  35. import ConditionQuery from './components/ConditionQuery.vue';
  36. import AddCamera from './components/CameraAddPopover.vue';
  37. import EditCamera from './components/CameraEditPopover.vue';
  38. import emptyImg from '@/assets/images/table/table-empty.png';
  39. import { Plus } from '@element-plus/icons-vue';
  40. import previewIcon from '@/assets/images/table/table-preview.png';
  41. import editIcon from '@/assets/images/table/table-edit.png';
  42. import deleteIcon from '@/assets/images/table/table-delete.png';
  43. import useCameraOverview from './stores/useCameraOverview';
  44. import { storeToRefs } from 'pinia';
  45. import { CameraIPItem } from './type';
  46. import { deleteCameraItem } from '@/api/camera/camera-overview';
  47. import { ElMessage, ElMessageBox } from 'element-plus';
  48. const cameraOverview = useCameraOverview();
  49. const { cameraItems, loading, total, page, size } = storeToRefs(cameraOverview);
  50. const { getCameraItems, openInterval, closeInterval } = cameraOverview;
  51. // 添加弹窗相关
  52. const showAddPopover = ref(false);
  53. const showEditPopover = ref(false);
  54. const editCameraData = ref<CameraIPItem | null>();
  55. //操作列
  56. const actionColumn: BasicColumn = reactive({
  57. width: 150,
  58. title: '操作',
  59. prop: 'action',
  60. key: 'action',
  61. fixed: 'right',
  62. render(record) {
  63. return h(TableActionIcons as any, {
  64. space: 20,
  65. color: '#629bf9',
  66. style: 'img',
  67. size: 16,
  68. actionIcons: [
  69. {
  70. label: '预览',
  71. icon: previewIcon,
  72. onClick: handlePreview.bind(null, record.row),
  73. },
  74. {
  75. label: '编辑',
  76. icon: editIcon,
  77. onClick: handleEdit.bind(null, record.row),
  78. },
  79. {
  80. label: '删除',
  81. icon: deleteIcon,
  82. onClick: handleDelete.bind(null, record.row),
  83. },
  84. ],
  85. });
  86. },
  87. });
  88. // 列排序操作
  89. const orderByItem = () => { };
  90. const handlePageNumChange = (pageNum) => {
  91. page.value = pageNum;
  92. getCameraItems();
  93. };
  94. const handlePageSizeChange = (pageSize) => {
  95. size.value = pageSize;
  96. getCameraItems();
  97. };
  98. const handlePreview = () => { };
  99. const handleDelete = (row) => {
  100. ElMessageBox.confirm(`您想删除相机${row.code}`, '提示', {
  101. confirmButtonText: '确定',
  102. cancelButtonText: '取消',
  103. type: 'warning',
  104. draggable: true,
  105. })
  106. .then(() => {
  107. deleteCameraItem({ cameraId: row.id }).then(() => {
  108. ElMessage.success('删除成功');
  109. getCameraItems();
  110. });
  111. })
  112. .catch(() => { });
  113. };
  114. const handleEdit = (row) => {
  115. showEditPopover.value = true;
  116. editCameraData.value = row;
  117. };
  118. onMounted(() => {
  119. getCameraItems();
  120. openInterval();
  121. });
  122. onBeforeUnmount(() => {
  123. closeInterval();
  124. });
  125. </script>
  126. <style scoped>
  127. .camera-page {
  128. position: relative;
  129. height: calc(100vh - 64px - 12px);
  130. background-color: #ffffff;
  131. }
  132. .camera-list {
  133. padding: 0 21px;
  134. }
  135. .empty-content {
  136. margin: auto;
  137. padding: 125px 0;
  138. }
  139. .empty-img {
  140. width: 396px;
  141. }
  142. .empty-text {
  143. font-size: 22px;
  144. color: #8e8e8e;
  145. line-height: 30px;
  146. text-align: center;
  147. }
  148. .add-popover {
  149. position: absolute;
  150. width: calc(100% - 21px);
  151. height: 622px;
  152. top: 0;
  153. bottom: 0;
  154. margin: auto;
  155. z-index: 99;
  156. }
  157. </style>