CameraPreview.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. fenceStore.clear();
  36. if (cameraId) {
  37. const presetList = await presetListStore.getPresetList(cameraId);
  38. if (cameraTree.value.length === 0) {
  39. /** 如果当前树为空,那么切换相机的时候,要重新请求树结构 */
  40. const tree = await getCameraTree();
  41. cameraTree.value = tree as unknown as CameraTree[];
  42. }
  43. const detail = getCameraDetail(cameraTree.value, cameraDetailStore.cameraId);
  44. console.log('cameraDetail', detail);
  45. if (detail) {
  46. cameraDetailStore.setDetail(detail);
  47. if (detail?.isPtz === IsPtz.disabled) {
  48. presetListStore.currentPresetToken = presetList?.[0].token;
  49. }
  50. }
  51. cameraAlgoStore.getCameraAlgoList(cameraId);
  52. cameraAlgoStore.selectedAlgoId = null;
  53. } else {
  54. /** 没有相机的时候也要请求相机树 */
  55. const tree = await getCameraTree();
  56. cameraTree.value = tree as unknown as CameraTree[];
  57. }
  58. },
  59. {
  60. immediate: true,
  61. },
  62. );
  63. onMounted(() => {
  64. cameraAlgoStore.getAllAlgoList();
  65. });
  66. onUnmounted(() => {
  67. /** 离开页面要清理掉所有的store */
  68. cameraDetailStore.clear();
  69. cameraAlgoStore.clear();
  70. fenceStore.clear();
  71. presetListStore.clear();
  72. console.log('camera preview onUnmounted');
  73. });
  74. function getCameraDetail(tree: CameraTree[], cameraId: number): CameraTree | null {
  75. let detail: CameraTree | null = null;
  76. function getDetail(t: CameraTree[]) {
  77. t.forEach((x) => {
  78. if (x.nodeType === 'camera' && x.id === cameraId) {
  79. detail = x;
  80. } else if (x.children && x.children.length > 0) {
  81. getDetail(x.children);
  82. }
  83. });
  84. }
  85. getDetail(tree);
  86. return detail;
  87. }
  88. </script>
  89. <style lang="scss" scoped>
  90. .cameraParamsSetting {
  91. width: 350px;
  92. min-height: 300px;
  93. // border: 1px solid #ccc;
  94. }
  95. .cameraParamsSetting {
  96. width: 350px;
  97. min-height: 300px;
  98. // border: 1px solid #ccc;
  99. }
  100. .algorithmsSetting {
  101. flex: 1;
  102. border-left: 1px solid #ccc;
  103. padding-left: 20px;
  104. }
  105. .cameraMain {
  106. display: flex;
  107. background: #fff;
  108. height: calc(100vh - 90px);
  109. }
  110. .cameraTree {
  111. width: 250px;
  112. flex-shrink: 0;
  113. // height: 800px;
  114. // border: 1px solid #ccc;
  115. border: 1px solid #f0f2f5;
  116. margin: 5px;
  117. }
  118. .cameraPlaceholder {
  119. color: #333;
  120. text-align: center;
  121. margin-top: 100px;
  122. margin-left: 100px;
  123. }
  124. </style>