Commit af32762cb60dd81802bf71e9aa9125ce4b7a79ea

Authored by ww
1 parent 05122beb

perf: DEFECT-806 not found data split mode default show layout

1 1 <script setup lang="ts">
2 2 import { PageWrapper } from '/@/components/Page';
3 3 import OrganizationIdTree from '../../common/organizationIdTree/src/OrganizationIdTree.vue';
4   - import { computed, onMounted, reactive, ref, unref, watch } from 'vue';
5   - import { Row, Col, Spin, Button, Pagination, Empty, Space } from 'ant-design-vue';
  4 + import { onMounted, reactive, ref, unref, watch } from 'vue';
  5 + import { Spin, Button, Pagination, Space, List } from 'ant-design-vue';
6 6 import { cameraPage } from '/@/api/camera/cameraManager';
7 7 import { CameraRecord } from '/@/api/camera/model/cameraModel';
8 8 import { videoPlay as VideoPlay } from 'vue3-video-play';
... ... @@ -14,6 +14,7 @@
14 14 import SvgIcon from '/@/components/Icon/src/SvgIcon.vue';
15 15 import { isDef } from '/@/utils/is';
16 16 import { getStreamingPlayUrl } from '/@/api/camera/cameraManager';
  17 + import { buildUUID } from '/@/utils/uuid';
17 18
18 19 type CameraRecordItem = CameraRecord & {
19 20 canPlay?: boolean;
... ... @@ -67,15 +68,11 @@
67 68 getCameraList();
68 69 };
69 70
70   - const getColLayout = computed(() => {
71   - const totalSpan = 24;
72   - return totalSpan / pagination.colNumber;
73   - });
74   -
75 71 const getCameraList = async () => {
76 72 try {
  73 + cameraList.value = [];
77 74 loading.value = true;
78   - const { items, total } = await cameraPage({
  75 + let { items, total } = await cameraPage({
79 76 page: pagination.page,
80 77 pageSize: pagination.pageSize,
81 78 organizationId: unref(organizationId)!,
... ... @@ -87,6 +84,14 @@
87 84 (item as CameraRecordItem).isTransform = false;
88 85 beforeVideoPlay(item);
89 86 }
  87 + if (items.length < pagination.pageSize) {
  88 + const fillArr: any = Array.from({ length: pagination.pageSize - items.length }).map(() => ({
  89 + id: buildUUID(),
  90 + placeholder: true,
  91 + }));
  92 + items = [...items, ...fillArr];
  93 + console.log(fillArr);
  94 + }
90 95 cameraList.value = items;
91 96 } catch (error) {
92 97 } finally {
... ... @@ -128,7 +133,10 @@
128 133 }
129 134 };
130 135
  136 + const gridLayout = ref({ gutter: 1, column: 2 });
  137 +
131 138 const handleSwitchLayoutWay = (pageSize: number, layout: number) => {
  139 + gridLayout.value = { gutter: 1, column: Math.sqrt(pageSize) };
132 140 pagination.colNumber = layout;
133 141 pagination.pageSize = pageSize;
134 142 pagination.page = 1;
... ... @@ -238,7 +246,54 @@
238 246 </Space>
239 247 </div>
240 248 </div>
241   - <section ref="videoContainer" class="bg-light-50 flex-auto dark:bg-dark-900">
  249 + <List
  250 + :loading="loading"
  251 + :data-source="cameraList"
  252 + class="bg-light-50 flex-auto dark:bg-dark-900 split-mode-list"
  253 + :grid="gridLayout"
  254 + :style="{ '--height': `${100 / pagination.colNumber}%` }"
  255 + >
  256 + <template #renderItem="{ item }">
  257 + <List.Item>
  258 + <div class="box-border w-full h-full p-1px">
  259 + <div
  260 + v-if="item.placeholder"
  261 + class="bg-black w-full h-full overflow-hidden relative"
  262 + ></div>
  263 + <div
  264 + v-if="!item.placeholder"
  265 + class="bg-black w-full h-full overflow-hidden relative video-container"
  266 + >
  267 + <Spin v-show="!item.isTransform" :spinning="!item.isTransform">
  268 + <div class="bg-black text-light-50"> </div>
  269 + </Spin>
  270 + <VideoPlay
  271 + v-show="item.isTransform"
  272 + @loadstart="handleLoadStart(item)"
  273 + @loadeddata="handleLoadData(item)"
  274 + v-bind="options"
  275 + :src="item.videoUrl"
  276 + :title="item.name"
  277 + :type="item.type"
  278 + />
  279 + <div
  280 + v-if="item.isTransform && isDef(item.canPlay) && !item.canPlay"
  281 + class="video-container-error-msk absolute top-0 left-0 text-lg w-full h-full text-light-50 flex justify-center items-center z-50 bg-black"
  282 + >
  283 + 视频加载出错了!
  284 + </div>
  285 + <div
  286 + class="video-container-mask absolute top-0 left-0 z-50 text-lg w-full text-light-50 flex justify-center items-center"
  287 + style="height: 100%; background-color: rgba(0, 0, 0, 0.5)"
  288 + >
  289 + <span>{{ item.name }}</span>
  290 + </div>
  291 + </div>
  292 + </div>
  293 + </List.Item>
  294 + </template>
  295 + </List>
  296 + <!-- <section ref="videoContainer" class="bg-light-50 flex-auto dark:bg-dark-900">
242 297 <Spin :spinning="loading" class="h-full">
243 298 <Empty
244 299 class="h-full flex flex-col justify-center items-center"
... ... @@ -283,7 +338,7 @@
283 338 </Col>
284 339 </Row>
285 340 </Spin>
286   - </section>
  341 + </section> -->
287 342 </section>
288 343 </PageWrapper>
289 344 <CameraDrawer @register="registerDrawer" @success="getCameraList" />
... ... @@ -340,4 +395,20 @@
340 395 }
341 396 }
342 397 }
  398 +
  399 + .split-mode-list:deep(.ant-row) {
  400 + width: 100%;
  401 + height: 100%;
  402 + }
  403 +
  404 + .split-mode-list:deep(.ant-list-item) {
  405 + width: 100%;
  406 + height: 100%;
  407 + }
  408 +
  409 + .split-mode-list:deep(.ant-col) {
  410 + width: 100%;
  411 + // height: var(--height);
  412 + height: 100%;
  413 + }
343 414 </style>
... ...