CamerasOverview.vue 7.6 KB

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