CamerasOverview.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. <el-badge :value="unAddlength" :hidden="unAddlength < 1" class="item">
  28. <el-button color="#1890FF" @click="showSharedPopover = true" plain>共享相机</el-button>
  29. </el-badge>
  30. <!-- <div class="add-tip" v-if="unAddlength > 0">{{ unAddlength }}</div> -->
  31. </template>
  32. <template #empty>
  33. <div class="empty-content flex flex-col items-center">
  34. <img :src="emptyImg" class="empty-img" />
  35. <span class="empty-text">目前无内容,请先添加相机</span>
  36. </div>
  37. </template>
  38. </BasicTable>
  39. </div>
  40. <AddCamera class="add-popover" v-model="showAddPopover" />
  41. <EditCamera class="add-popover" v-model="showEditPopover" :edit-data="editCameraData" />
  42. <ShareCamera class="add-popover" v-model="addSharedPopover" :share-data="shareCameraData" />
  43. <EditSharedCamera class="add-popover" v-model="showSharedPopover" />
  44. </div>
  45. </template>
  46. <script setup lang="ts">
  47. import { h, onBeforeUnmount, onMounted, reactive, ref } from 'vue';
  48. import { BasicTable, TableActionIcons } from '@/components/Table';
  49. import { BasicColumn } from '@/components/Table';
  50. import { columns } from './overviewColumns';
  51. import ConditionQuery from './components/ConditionQuery.vue';
  52. import AddCamera from './components/CameraAddPopover.vue';
  53. import ShareCamera from './components/CameraSharePopover.vue';
  54. import EditCamera from './components/CameraEditPopover.vue';
  55. import EditSharedCamera from './components/CameraSharedEdit.vue';
  56. import emptyImg from '@/assets/images/table/table-empty.png';
  57. import { Plus } from '@element-plus/icons-vue';
  58. import shareIcon from '@/assets/images/table/table-share.png';
  59. import previewIcon from '@/assets/images/table/table-preview.png';
  60. import editIcon from '@/assets/images/table/table-edit.png';
  61. import deleteIcon from '@/assets/images/table/table-delete.png';
  62. import useCameraOverview from './stores/useCameraOverview';
  63. import { storeToRefs } from 'pinia';
  64. import { CameraIPItem, CameraShowItem } from './type';
  65. import { deleteCameraItem } from '@/api/camera/camera-overview';
  66. import { ElMessage, ElMessageBox } from 'element-plus';
  67. import useCameraShared from './stores/useSharedCamera';
  68. const CameraShared = useCameraShared();
  69. const { unAddlength } = storeToRefs(CameraShared);
  70. const cameraOverview = useCameraOverview();
  71. const { cameraItems, loading, total, page, size } = storeToRefs(cameraOverview);
  72. const { getCameraItems, openInterval, closeInterval } = cameraOverview;
  73. // 添加弹窗相关
  74. const showAddPopover = ref(false);
  75. const showSharedPopover = ref(false);
  76. const addSharedPopover = ref(false);
  77. const showEditPopover = ref(false);
  78. const editCameraData = ref<CameraIPItem | null>();
  79. const shareCameraData = ref<CameraShowItem | null>();
  80. //操作列
  81. const actionColumn: BasicColumn = reactive({
  82. width: 200,
  83. title: '操作',
  84. prop: 'action',
  85. key: 'action',
  86. fixed: 'right',
  87. render(record) {
  88. return h(TableActionIcons as any, {
  89. space: 20,
  90. color: '#629bf9',
  91. style: 'img',
  92. size: 16,
  93. actionIcons: [
  94. {
  95. label: '分享',
  96. icon: shareIcon,
  97. onClick: handleShare.bind(null, record.row),
  98. },
  99. {
  100. label: '预览',
  101. icon: previewIcon,
  102. onClick: handlePreview.bind(null, record.row),
  103. },
  104. {
  105. label: '编辑',
  106. icon: editIcon,
  107. onClick: handleEdit.bind(null, record.row),
  108. },
  109. {
  110. label: '删除',
  111. icon: deleteIcon,
  112. onClick: handleDelete.bind(null, record.row),
  113. },
  114. ],
  115. });
  116. },
  117. });
  118. // 列排序操作
  119. const orderByItem = () => {};
  120. const handlePageNumChange = (pageNum) => {
  121. page.value = pageNum;
  122. getCameraItems();
  123. };
  124. const handlePageSizeChange = (pageSize) => {
  125. size.value = pageSize;
  126. getCameraItems();
  127. };
  128. const handleShare = (row) => {
  129. addSharedPopover.value = true;
  130. shareCameraData.value = row;
  131. };
  132. const handlePreview = (_row) => {};
  133. const handleDelete = (row) => {
  134. ElMessageBox.confirm(`您想删除相机${row.code}`, '提示', {
  135. confirmButtonText: '确定',
  136. cancelButtonText: '取消',
  137. type: 'warning',
  138. draggable: true,
  139. })
  140. .then(() => {
  141. deleteCameraItem({ cameraId: row.id }).then(() => {
  142. ElMessage.success('删除成功');
  143. getCameraItems();
  144. });
  145. })
  146. .catch(() => {});
  147. };
  148. const handleEdit = (row) => {
  149. showEditPopover.value = true;
  150. editCameraData.value = row;
  151. };
  152. onMounted(() => {
  153. getCameraItems();
  154. openInterval();
  155. });
  156. onBeforeUnmount(() => {
  157. closeInterval();
  158. });
  159. </script>
  160. <style scoped>
  161. .camera-page {
  162. position: relative;
  163. height: calc(100vh - 64px - 12px);
  164. background-color: #ffffff;
  165. }
  166. .camera-list {
  167. padding: 0 21px;
  168. }
  169. .empty-content {
  170. margin: auto;
  171. padding: 125px 0;
  172. }
  173. .empty-img {
  174. width: 396px;
  175. }
  176. .empty-text {
  177. font-size: 22px;
  178. color: #8e8e8e;
  179. line-height: 30px;
  180. text-align: center;
  181. }
  182. .add-tip {
  183. position: absolute;
  184. left: 187px;
  185. top: 64px;
  186. font-size: 16px;
  187. color: red;
  188. }
  189. .add-popover {
  190. position: absolute;
  191. width: calc(100% - 21px);
  192. height: 622px;
  193. top: 0;
  194. bottom: 0;
  195. margin: auto;
  196. z-index: 99;
  197. }
  198. .item {
  199. margin: 0px 40px 0px 15px;
  200. }
  201. </style>