CameraPreview.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <div>
  3. <div class="cameraMain">
  4. <div class="cameraTree">
  5. <CameraTreeCom :loading="presetListStore.loading" :camera-tree="cameraTree || []" />
  6. </div>
  7. <div class="cameraSettingWrapper">
  8. <div class="cameraView">
  9. <CameraViewSetting v-if="cameraDetailStore.cameraId" />
  10. <div class="cameraPlaceholder" v-else>请选择左侧相机</div>
  11. </div>
  12. </div>
  13. </div>
  14. </div>
  15. </template>
  16. <script lang="ts" setup>
  17. import { onUnmounted, ref, watch } from 'vue';
  18. import CameraTreeCom from './components/CameraTree/CameraTree.vue';
  19. import CameraViewSetting from './components/CameraViewSetting/CameraViewSetting.vue';
  20. import useCameraDetailStore from './store/useCameraDetailStore';
  21. import useCameraAlgoStore from './store/useCameraAlgoStore';
  22. import usePresetListStore from './store/usePresetListStore';
  23. import useFenceStore from './store/useFenceStore';
  24. import { onMounted } from 'vue';
  25. import { IsPtz } from '@/api/camera/camera-overview';
  26. import { CameraTree, getCameraTree } from '@/api/camera/camera-preview';
  27. const cameraDetailStore = useCameraDetailStore();
  28. const cameraAlgoStore = useCameraAlgoStore();
  29. const fenceStore = useFenceStore();
  30. const presetListStore = usePresetListStore();
  31. const cameraTree = ref<CameraTree[]>([]);
  32. watch(
  33. () => cameraDetailStore.cameraId,
  34. async (cameraId) => {
  35. if (cameraId) {
  36. const presetList = await presetListStore.getPresetList(cameraId);
  37. if (cameraTree.value.length === 0) {
  38. /** 如果当前树为空,那么切换相机的时候,要重新请求树结构 */
  39. const tree = await getCameraTree();
  40. cameraTree.value = tree as unknown as CameraTree[];
  41. }
  42. const detail = getCameraDetail(cameraTree.value, cameraDetailStore.cameraId);
  43. console.log('cameraDetail', detail);
  44. if (detail) {
  45. cameraDetailStore.setDetail(detail);
  46. if (detail?.isPtz === IsPtz.disabled) {
  47. presetListStore.currentPresetToken = presetList?.[0].token;
  48. }
  49. }
  50. cameraAlgoStore.getCameraAlgoList(cameraId);
  51. cameraAlgoStore.selectedAlgoId = null;
  52. } else {
  53. /** 没有相机的时候也要请求相机树 */
  54. const tree = await getCameraTree();
  55. cameraTree.value = tree as unknown as CameraTree[];
  56. }
  57. },
  58. {
  59. immediate: true,
  60. },
  61. );
  62. onMounted(() => {
  63. cameraAlgoStore.getAllAlgoList();
  64. });
  65. onUnmounted(() => {
  66. /** 离开页面要清理掉所有的store */
  67. cameraDetailStore.clear();
  68. cameraAlgoStore.clear();
  69. fenceStore.clear();
  70. presetListStore.clear();
  71. console.log('camera preview onUnmounted');
  72. });
  73. function getCameraDetail(tree: CameraTree[], cameraId: number): CameraTree | null {
  74. let detail: CameraTree | null = null;
  75. function getDetail(t: CameraTree[]) {
  76. t.forEach((x) => {
  77. if (x.nodeType === 'camera' && x.id === cameraId) {
  78. detail = x;
  79. } else if (x.children && x.children.length > 0) {
  80. getDetail(x.children);
  81. }
  82. });
  83. }
  84. getDetail(tree);
  85. return detail;
  86. }
  87. </script>
  88. <style lang="scss" scoped>
  89. .cameraParamsSetting {
  90. width: 350px;
  91. min-height: 300px;
  92. // border: 1px solid #ccc;
  93. }
  94. .cameraParamsSetting {
  95. width: 350px;
  96. min-height: 300px;
  97. // border: 1px solid #ccc;
  98. }
  99. .algorithmsSetting {
  100. flex: 1;
  101. border-left: 1px solid #ccc;
  102. padding-left: 20px;
  103. }
  104. .cameraMain {
  105. display: flex;
  106. background: #fff;
  107. height: calc(100vh - 90px);
  108. }
  109. .cameraTree {
  110. width: 250px;
  111. // height: 800px;
  112. // border: 1px solid #ccc;
  113. border: 1px solid #f0f2f5;
  114. margin: 5px;
  115. }
  116. .cameraPlaceholder {
  117. color: #333;
  118. text-align: center;
  119. margin-top: 100px;
  120. margin-left: 100px;
  121. }
  122. </style>