CamerasOverview.vue 7.5 KB

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