Commit d0ebdb193894fe1140669fbd02a67207b368909f

Authored by fengtao
Committed by xp.Huang
1 parent f2347107

perf(src/packages): 3D模型预览添加loading效果

... ... @@ -18,7 +18,7 @@ function Menubar( editor ) {
18 18 container.add( new MenubarView( editor ) );
19 19 container.add( new MenubarHelp( editor ) );
20 20
21   - container.add( new MenubarStatus( editor ) );
  21 + // container.add( new MenubarStatus( editor ) );
22 22
23 23 return container;
24 24
... ...
... ... @@ -25,3 +25,13 @@ export function getThreeJsModel(id) {
25 25 url: API['URL'] + '/' + id
26 26 })
27 27 }
  28 +
  29 +/**
  30 + * @description: 3D模型 获取json数据 api
  31 + */
  32 +export function getThreeJsModelByJson(id) {
  33 + return defHttp.get({
  34 + url: API['URL'] + '/json' +'/'+id + '/root.json',
  35 + timeout: 30 * 1000
  36 + })
  37 +}
\ No newline at end of file
... ...
... ... @@ -8,7 +8,7 @@ import { Player } from './js/Player.js'
8 8 import { Sidebar } from './js/Sidebar.js'
9 9 import { Menubar } from './js/Menubar.js'
10 10 import { Resizer } from './js/Resizer.js'
11   -import { getThreeJsModel } from './js/libs/http/api.js'
  11 +import { getThreeJsModelByJson } from './js/libs/http/api.js'
12 12 import { useSpin } from './js/libs/spin/useSpin.js'
13 13
14 14 window.URL = window.URL || window.webkitURL
... ... @@ -58,10 +58,9 @@ editor.storage.init(async function () {
58 58 const { spin, stop } = useSpin()
59 59 try {
60 60 spin()
61   - const fileData = await getThreeJsModel(file_uuid)
  61 + const fileData = await getThreeJsModelByJson(file_uuid)
62 62 if (!fileData) return
63   - if (!fileData['content']) return
64   - await editor.fromJSON(fileData['content'])
  63 + await editor.fromJSON(fileData)
65 64 } finally {
66 65 stop()
67 66 }
... ...
... ... @@ -15,21 +15,19 @@
15 15 :intersectRecursive="true"
16 16 />
17 17 <div v-show="show" class="process">
18   - <span> 拼命加载中... </span>
19   - <n-progress type="line" :color="themeColor" :percentage="process" :indicator-placement="'inside'" processing />
  18 + <n-spin :show="show">
  19 + <template #description> 拼命加载中... </template>
  20 + </n-spin>
20 21 </div>
21 22 </div>
22 23 </div>
23 24 </template>
24 25 <script setup lang="ts">
25   -import { PropType, toRefs, ref, nextTick, computed } from 'vue'
  26 +import { PropType, toRefs, ref, nextTick } from 'vue'
26 27 import { CreateComponentType } from '@/packages/index.d'
27 28 import { vue3dLoader } from 'vue-3d-loader'
28   -import { useDesignStore } from '@/store/modules/designStore/designStore'
29 29 import { getJwtToken } from '@/utils/external/auth'
30 30
31   -const designStore = useDesignStore()
32   -
33 31 const props = defineProps({
34 32 chartConfig: {
35 33 type: Object as PropType<CreateComponentType>,
... ... @@ -37,10 +35,6 @@ const props = defineProps({
37 35 }
38 36 })
39 37
40   -const themeColor = computed(() => {
41   - return designStore.getAppTheme
42   -})
43   -
44 38 const vue3dLoaderRef = ref(null)
45 39
46 40 const headers = {
... ... @@ -54,12 +48,16 @@ const webGLRendererOptions = {
54 48 }
55 49
56 50 //三维模型加载
57   -const show = ref(false)
  51 +const show = ref(true)
  52 +
  53 +const { dataset, backgroundColor, backgroundAlpha, borderConfig } = toRefs(props.chartConfig.option) as Recordable
58 54
59 55 const onLoad = async () => {
60 56 //加载完成
61 57 await nextTick()
62   - show.value = false
  58 + if (dataset.value) {
  59 + show.value = false
  60 + }
63 61 }
64 62
65 63 //三维模型进度条
... ... @@ -70,8 +68,6 @@ const onProcess = (event: Recordable) => {
70 68 }
71 69
72 70 const { w, h } = toRefs(props.chartConfig.attr)
73   -
74   -const { dataset, backgroundColor, backgroundAlpha,borderConfig } = toRefs(props.chartConfig.option) as Recordable
75 71 </script>
76 72
77 73 <style lang="scss" scoped>
... ... @@ -86,6 +82,9 @@ const { dataset, backgroundColor, backgroundAlpha,borderConfig } = toRefs(props.
86 82 left: 50%;
87 83 width: 50%;
88 84 transform: translate(-50%, -50%);
  85 + display:flex;
  86 + align-items: center;
  87 + justify-content: center;
89 88 }
90 89 }
91 90 </style>
... ...
... ... @@ -108,7 +108,6 @@ export async function getPlayUrl(
108 108 }
109 109 } else if (accessMode === AccessMode.GBT28181) {
110 110 const { securityPolicy } = useGlobSetting()
111   - console.log(useGlobSetting())
112 111 const { deviceId, channelNo } = params?.params || {};
113 112 const result = await getVideoControlStart({ channelId: channelNo!, deviceId: deviceId! });
114 113 return { url: securityPolicy ? result.data.https_flv : result.data.flv, type: 'flv' };
... ...
... ... @@ -20,28 +20,29 @@
20 20 <template #action>
21 21 <div class="go-flex-items-center list-footer" justify="space-between">
22 22 <div style="display: flex; flex-direction: column; align-items: start">
23   - <n-text v-if="!focus" @click="handleFocus">
24   - <n-button
25   - class="list-footer-button"
26   - secondary
27   - size="tiny"
28   - >
29   - <span class="title">
30   - {{ cardData.name || cardData.id }}
31   - </span>
32   - </n-button>
33   - </n-text>
34   - <n-input
35   - v-else
36   - ref="inputInstRef"
37   - size="small"
38   - type="text"
39   - maxlength="16"
40   - show-count
41   - v-model:value.trim="title"
42   - @keyup.enter="handleBlur"
43   - @blur="handleBlur"
44   - ></n-input>
  23 + <n-tooltip trigger="hover">
  24 + <template #trigger>
  25 + <n-text v-if="!focus" @click="handleFocus">
  26 + <n-button class="list-footer-button" secondary size="tiny">
  27 + <span class="title">
  28 + {{ cardData.name || cardData.id }}
  29 + </span>
  30 + </n-button>
  31 + </n-text>
  32 + <n-input
  33 + v-else
  34 + ref="inputInstRef"
  35 + size="small"
  36 + type="text"
  37 + maxlength="16"
  38 + show-count
  39 + v-model:value.trim="title"
  40 + @keyup.enter="handleBlur"
  41 + @blur="handleBlur"
  42 + ></n-input>
  43 + </template>
  44 + {{ cardData.name || cardData.id }}
  45 + </n-tooltip>
45 46 <n-text style="font-size: 12px; margin-left: 6px">{{ cardData.createTime }}</n-text>
46 47 </div>
47 48 <!-- 工具 -->
... ... @@ -241,7 +242,7 @@ $contentHeight: 180px;
241 242 .list-footer-button {
242 243 display: flex;
243 244 // justify-content: flex-start;
244   - width: 135px;
  245 + width: 125px;
245 246 overflow: hidden;
246 247 text-overflow: ellipsis;
247 248 white-space: nowrap;
... ...
... ... @@ -88,21 +88,22 @@ export const useDataListInit = (formValue: { name: string; state: string | null
88 88 // 发布处理
89 89 const releaseHandle = async (cardData: ChartType) => {
90 90 const { id, state } = cardData
91   - await putThreeJsModelRelease({
  91 + const res = await putThreeJsModelRelease({
92 92 id,
93 93 // [0未发布, 1发布]
94 94 state: state === 1 ? 0 : 1
95 95 })
96   - list.value = []
97   - fetchList()
98   - // 发布 -> 未发布
99 96 if (state === 1) {
100 97 window['$message'].success(window['$t']('common.cancelReleaseSuccessText'))
101   - return
  98 + } else {
  99 + window['$message'].success(window['$t']('common.releaseSuccessText'))
  100 + }
  101 + if(res) {
  102 + setTimeout(() => {
  103 + list.value = []
  104 + fetchList()
  105 + }, 500)
102 106 }
103   - // 未发布 -> 发布
104   - window['$message'].success(window['$t']('common.releaseSuccessText'))
105   - return
106 107 }
107 108
108 109 // 立即请求
... ...
... ... @@ -161,14 +161,15 @@ const releaseGoDialog = (message: string, state: number, messageText: string) =>
161 161 // eslint-disable-next-line @typescript-eslint/no-empty-function
162 162 onPositiveCallback: () => {},
163 163 promiseResCallback: async () => {
164   - console.log(list.value)
165 164 // eslint-disable-next-line no-case-declarations
166 165 const bulkDeleteIds = list.value
167 166 ?.filter((item: ChartType) => item.checkedValue)
168 167 ?.map((item: ChartType) => item.id)
169 168 await putReleaseThreeJsModel(state, bulkDeleteIds as unknown as string[])
170 169 window['$message'].success(window['$t'](messageText))
171   - handleSearchClick()
  170 + setTimeout(() => {
  171 + handleSearchClick()
  172 + }, 500)
172 173 isBulkOperationFlag.value = true
173 174 selectAllTextFlag.value = true
174 175 operationKey.value = ''
... ... @@ -188,14 +189,15 @@ const handleOperationSelect = async (key: string) => {
188 189 // eslint-disable-next-line @typescript-eslint/no-empty-function
189 190 onPositiveCallback: () => {},
190 191 promiseResCallback: async () => {
191   - console.log(list.value)
192 192 // eslint-disable-next-line no-case-declarations
193 193 const bulkDeleteIds = list.value
194 194 ?.filter((item: ChartType) => item.checkedValue)
195 195 ?.map((item: ChartType) => item.id)
196 196 await threeJsDeleteApi([bulkDeleteIds] as unknown as string[])
197 197 window['$message'].success(window['$t']('common.deleteSuccessText'))
198   - handleSearchClick()
  198 + setTimeout(() => {
  199 + handleSearchClick()
  200 + }, 500)
199 201 isBulkOperationFlag.value = true
200 202 selectAllTextFlag.value = true
201 203 operationKey.value = ''
... ...