CamerasOverview.vue 4.9 KB

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