Commit 04b6bc4d42d3d4dfcfc1f8854315683432d664df
1 parent
68e49550
fix: pictureComponent can not show image
Showing
3 changed files
with
49 additions
and
10 deletions
1 | 1 | <script lang="ts" setup> |
2 | - import { computed } from 'vue'; | |
3 | - import { Tooltip, Image } from 'ant-design-vue'; | |
2 | + import { computed, ref, watch } from 'vue'; | |
3 | + import { Tooltip, Image as AntImage } from 'ant-design-vue'; | |
4 | 4 | import { |
5 | 5 | DEFAULT_DATE_FORMAT, |
6 | 6 | DEFAULT_RADIO_RECORD, |
... | ... | @@ -19,6 +19,8 @@ |
19 | 19 | const fallback = |
20 | 20 | 'data:image/png;base64,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'; |
21 | 21 | |
22 | + const getImagBase64 = ref(fallback); | |
23 | + | |
22 | 24 | const getRadio = computed(() => { |
23 | 25 | const { radio } = props.radio || DEFAULT_RADIO_RECORD; |
24 | 26 | return radio; |
... | ... | @@ -26,29 +28,56 @@ |
26 | 28 | |
27 | 29 | const getWidth = computed(() => { |
28 | 30 | const marign = 5; |
29 | - const offsetHight = 62 + 62; | |
30 | - const { width = 140, height = 140 } = props.radio || {}; | |
31 | - console.log({ scalcWidth: width > height ? height - marign : width - marign, width, height }); | |
31 | + const offsetHight = 62 + (props.radio ? 62 : 0); | |
32 | + const { width = 240, height = 200 } = props.radio || {}; | |
32 | 33 | return width > height - offsetHight ? height - offsetHight - marign : width - marign; |
33 | 34 | }); |
35 | + | |
36 | + watch( | |
37 | + () => props.value?.value, | |
38 | + () => { | |
39 | + if (props.value?.value) { | |
40 | + getBase64Image(props.value.value); | |
41 | + } | |
42 | + } | |
43 | + ); | |
44 | + | |
45 | + const getBase64Image = (url: string) => { | |
46 | + let canvas: Nullable<HTMLCanvasElement> = document.createElement('canvas'); | |
47 | + const ctx = canvas.getContext('2d'); | |
48 | + let image: Nullable<HTMLImageElement> = new Image(); | |
49 | + | |
50 | + image.onload = function () { | |
51 | + canvas!.height = image!.height; | |
52 | + canvas!.width = image!.width; | |
53 | + ctx?.drawImage(image!, 0, 0); | |
54 | + const dataUrl = canvas!.toDataURL('image/png'); | |
55 | + getImagBase64.value = dataUrl; | |
56 | + image = null; | |
57 | + canvas = null; | |
58 | + }; | |
59 | + image.setAttribute('crossOrigin', 'Anonymous'); | |
60 | + image.src = url; | |
61 | + }; | |
34 | 62 | </script> |
35 | 63 | |
36 | 64 | <template> |
37 | 65 | <section |
38 | 66 | class="w-full h-full flex flex-col justify-center items-center justify-between widget-picture" |
39 | 67 | > |
40 | - <Image :width="getWidth" :src="props?.value?.value || ''" :fallback="fallback" /> | |
68 | + <AntImage :width="getWidth" :src="getImagBase64" :fallback="fallback" /> | |
69 | + <!-- <Image :style="{ width: `${getWidth}px` }" :src="getImagBase64" /> --> | |
41 | 70 | <div |
42 | 71 | class="w-full text-center truncate p-5" |
43 | 72 | :style="{ fontSize: fontSize({ radio: getRadio, basic: 12, max: 16 }), color: '#999' }" |
44 | 73 | > |
45 | 74 | <Tooltip |
46 | 75 | placement="top" |
47 | - :title="props?.value?.updateTime || dateUtil().format(DEFAULT_DATE_FORMAT)" | |
76 | + :title="dateUtil(props?.value?.updateTime || new Date()).format(DEFAULT_DATE_FORMAT)" | |
48 | 77 | > |
49 | 78 | <span>更新时间:</span> |
50 | 79 | <span class="truncate"> |
51 | - {{ props?.value?.updateTime || dateUtil().format(DEFAULT_DATE_FORMAT) }} | |
80 | + {{ dateUtil(props?.value?.updateTime || new Date()).format(DEFAULT_DATE_FORMAT) }} | |
52 | 81 | </span> |
53 | 82 | </Tooltip> |
54 | 83 | </div> | ... | ... |
... | ... | @@ -14,5 +14,11 @@ export const transformPictureConfig = ( |
14 | 14 | record: DataComponentRecord, |
15 | 15 | dataSourceRecord: DataSource |
16 | 16 | ) => { |
17 | - return {}; | |
17 | + const componentInfo = dataSourceRecord.componentInfo; | |
18 | + return { | |
19 | + value: { | |
20 | + value: componentInfo.value, | |
21 | + updateTime: componentInfo.updateTime, | |
22 | + } as PictureComponentValue, | |
23 | + }; | |
18 | 24 | }; | ... | ... |
... | ... | @@ -228,7 +228,7 @@ |
228 | 228 | const loading = ref(false); |
229 | 229 | const getDataBoardComponent = async () => { |
230 | 230 | try { |
231 | - // dataBoardList.value = []; | |
231 | + dataBoardList.value = []; | |
232 | 232 | loading.value = true; |
233 | 233 | const data = await getDataBoradDetail(); |
234 | 234 | |
... | ... | @@ -327,6 +327,10 @@ |
327 | 327 | |
328 | 328 | layoutInfo.push({ |
329 | 329 | id: _id, |
330 | + // x: (unref(layoutInfo).length * 2) % (GirdLayoutColNum || 24), | |
331 | + // y: unref(layoutInfo).length + (GirdLayoutColNum || 24), | |
332 | + // w: record?.w || DEFAULT_WIDGET_WIDTH, | |
333 | + // h: record?.h || DEFAULT_WIDGET_HEIGHT, | |
330 | 334 | h: record?.h, |
331 | 335 | w: record?.w, |
332 | 336 | x: record?.x, | ... | ... |