Showing
15 changed files
with
201 additions
and
28 deletions
... | ... | @@ -230,6 +230,11 @@ |
230 | 230 | } catch (error) { |
231 | 231 | throw error; |
232 | 232 | } finally { |
233 | + activeKey.value = TabKeyEnum.BASIC; | |
234 | + selectWidgetKeys.value = { | |
235 | + componentKey: TextComponent1Config.key, | |
236 | + categoryKey: PackagesCategoryEnum.TEXT, | |
237 | + }; | |
233 | 238 | loading.value = false; |
234 | 239 | } |
235 | 240 | }; | ... | ... |
... | ... | @@ -80,16 +80,6 @@ |
80 | 80 | x2: 1, |
81 | 81 | y2: 0, |
82 | 82 | colorStops: instrumentPanelColor, |
83 | - // colorStops: [ | |
84 | - // { | |
85 | - // offset: 0, | |
86 | - // color: '#07ffd6', | |
87 | - // }, | |
88 | - // { | |
89 | - // offset: 1, | |
90 | - // color: '#5eff10', | |
91 | - // }, | |
92 | - // ], | |
93 | 83 | global: false, |
94 | 84 | }, |
95 | 85 | }, |
... | ... | @@ -100,10 +90,6 @@ |
100 | 90 | width: unref(getRatio) ? 30 * unref(getRatio) : 30, |
101 | 91 | }, |
102 | 92 | }, |
103 | - // itemStyle: { | |
104 | - // // color: instrumentPanelColor, | |
105 | - // color: new graphic.LinearGradient(0, 1, 0, 0, instrumentPanelColor), | |
106 | - // }, | |
107 | 93 | axisTick: { |
108 | 94 | show: false, |
109 | 95 | }, | ... | ... |
... | ... | @@ -53,18 +53,19 @@ |
53 | 53 | }, |
54 | 54 | progress: { |
55 | 55 | show: true, |
56 | - width: 30, | |
56 | + width: unref(getRatio) ? 24 * unref(getRatio) : 24, | |
57 | 57 | }, |
58 | 58 | pointer: { |
59 | 59 | show: false, |
60 | 60 | }, |
61 | 61 | axisLine: { |
62 | 62 | lineStyle: { |
63 | - width: 30, | |
63 | + width: unref(getRatio) ? 24 * unref(getRatio) : 24, | |
64 | 64 | }, |
65 | 65 | }, |
66 | 66 | axisTick: { |
67 | - distance: -35, | |
67 | + distance: unref(getRatio) ? -35 * unref(getRatio) : -35, | |
68 | + length: unref(getRatio) ? 8 * unref(getRatio) : 8, | |
68 | 69 | splitNumber: 5, |
69 | 70 | lineStyle: { |
70 | 71 | width: 2, |
... | ... | @@ -72,8 +73,8 @@ |
72 | 73 | }, |
73 | 74 | }, |
74 | 75 | splitLine: { |
75 | - distance: -40, | |
76 | - length: 10, | |
76 | + distance: unref(getRatio) ? -40 * unref(getRatio) : -40, | |
77 | + length: unref(getRatio) ? 12 * unref(getRatio) : 12, | |
77 | 78 | lineStyle: { |
78 | 79 | width: 3, |
79 | 80 | color: '#999', |
... | ... | @@ -94,8 +95,8 @@ |
94 | 95 | width: '60%', |
95 | 96 | lineHeight: 10, |
96 | 97 | borderRadius: 8, |
97 | - offsetCenter: [0, '30%'], | |
98 | - fontSize: 14, | |
98 | + offsetCenter: [0, '40%'], | |
99 | + fontSize: unref(getRatio) ? 14 * unref(getRatio) : 14, | |
99 | 100 | fontWeight: 'bolder', |
100 | 101 | formatter: `{value} ${unit ?? ''}`, |
101 | 102 | color: fontColor || 'inherit', |
... | ... | @@ -186,10 +187,37 @@ |
186 | 187 | |
187 | 188 | const resize = async () => { |
188 | 189 | await nextTick(); |
190 | + unref(chartInstance)?.setOption({ | |
191 | + series: [ | |
192 | + { | |
193 | + detail: { | |
194 | + fontSize: 14 * unref(getRatio), | |
195 | + }, | |
196 | + progress: { | |
197 | + width: 24 * unref(getRatio), | |
198 | + }, | |
199 | + axisLine: { | |
200 | + lineStyle: { | |
201 | + width: 24 * unref(getRatio), | |
202 | + }, | |
203 | + }, | |
204 | + axisTick: { | |
205 | + distance: -35 * unref(getRatio), | |
206 | + length: 6 * unref(getRatio), | |
207 | + }, | |
208 | + splitLine: { | |
209 | + // 分割线与轴线距离 | |
210 | + distance: -40 * unref(getRatio), | |
211 | + length: 12 * unref(getRatio), | |
212 | + }, | |
213 | + }, | |
214 | + ], | |
215 | + }); | |
189 | 216 | unref(chartInstance)?.resize(); |
190 | 217 | }; |
191 | 218 | |
192 | 219 | useComponentScale(props, resize); |
220 | + const { getRatio } = useComponentScale(props, resize); | |
193 | 221 | </script> |
194 | 222 | |
195 | 223 | <template> | ... | ... |
1 | +import { cloneDeep } from 'lodash-es'; | |
2 | +import { PictureConfig } from '.'; | |
3 | +import { | |
4 | + ConfigType, | |
5 | + CreateComponentType, | |
6 | + PublicComponentOptions, | |
7 | + PublicPresetOptions, | |
8 | +} from '../../../index.type'; | |
9 | +import { PublicConfigClass, componentInitConfig } from '../../../publicConfig'; | |
10 | + | |
11 | +export const option: PublicPresetOptions = { | |
12 | + componetDesign: false, | |
13 | +}; | |
14 | + | |
15 | +export default class Config extends PublicConfigClass implements CreateComponentType { | |
16 | + public key: string = PictureConfig.key; | |
17 | + | |
18 | + public attr = { ...componentInitConfig }; | |
19 | + | |
20 | + public componentConfig: ConfigType = cloneDeep(PictureConfig); | |
21 | + | |
22 | + public persetOption = cloneDeep(option); | |
23 | + | |
24 | + public option: PublicComponentOptions; | |
25 | + | |
26 | + constructor(option: PublicComponentOptions) { | |
27 | + super(); | |
28 | + this.option = { ...option }; | |
29 | + } | |
30 | +} | ... | ... |
1 | +<script lang="ts" setup> | |
2 | + // import { computed } from 'vue'; | |
3 | + import { commonDataSourceSchemas } from '../../../config/common.config'; | |
4 | + import { BasicForm, useForm } from '/@/components/Form'; | |
5 | + import { PublicFormInstaceType } from '/@/views/visual/dataSourceBindPanel/index.type'; | |
6 | + | |
7 | + // const props = defineProps<{ | |
8 | + // values: PublicComponentDataSourceProps; | |
9 | + // }>(); | |
10 | + | |
11 | + const [register, { getFieldsValue, setFieldsValue, validate, resetFields }] = useForm({ | |
12 | + labelWidth: 0, | |
13 | + showActionButtonGroup: false, | |
14 | + layout: 'horizontal', | |
15 | + labelCol: { span: 0 }, | |
16 | + schemas: commonDataSourceSchemas(), | |
17 | + }); | |
18 | + | |
19 | + // const getBindValues = computed(() => { | |
20 | + // return props.values.bindValue; | |
21 | + // }); | |
22 | + | |
23 | + const getFormValues = () => { | |
24 | + return getFieldsValue(); | |
25 | + }; | |
26 | + | |
27 | + const setFormValues = (record: Recordable) => { | |
28 | + return setFieldsValue(record); | |
29 | + }; | |
30 | + | |
31 | + defineExpose({ | |
32 | + getFormValues, | |
33 | + setFormValues, | |
34 | + validate, | |
35 | + resetFormValues: resetFields, | |
36 | + } as PublicFormInstaceType); | |
37 | +</script> | |
38 | + | |
39 | +<template> | |
40 | + <BasicForm @register="register" /> | |
41 | +</template> | ... | ... |
1 | +import { useComponentKeys } from '../../../hook/useComponentKeys'; | |
2 | +import { ConfigType, PackagesCategoryEnum } from '../../../index.type'; | |
3 | + | |
4 | +const componentKeys = useComponentKeys('Picture'); | |
5 | +export const PictureConfig: ConfigType = { | |
6 | + ...componentKeys, | |
7 | + title: '图片组件', | |
8 | + package: PackagesCategoryEnum.OTHER, | |
9 | +}; | ... | ... |
1 | +<script lang="ts" setup> | |
2 | + import { ref } from 'vue'; | |
3 | + import { Image as AntImage } from 'ant-design-vue'; | |
4 | + import { UpdateTime } from '/@/views/visual/commonComponents/UpdateTime'; | |
5 | + import { useDataFetch } from '../../../hook/useSocket'; | |
6 | + import { ComponentPropsConfigType, DataFetchUpdateFn } from '../../../index.type'; | |
7 | + | |
8 | + const props = defineProps<{ | |
9 | + config: ComponentPropsConfigType; | |
10 | + }>(); | |
11 | + | |
12 | + const fallback = | |
13 | + 'data:image/png;base64,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'; | |
14 | + | |
15 | + const time = ref<Nullable<number>>(null); | |
16 | + | |
17 | + const url = ref<string>(fallback); | |
18 | + | |
19 | + // const getImagBase64 = ref(fallback); | |
20 | + | |
21 | + // const getBase64Image = (url: string) => { | |
22 | + // let canvas: Nullable<HTMLCanvasElement> = document.createElement('canvas'); | |
23 | + // const ctx = canvas.getContext('2d'); | |
24 | + // let image: Nullable<HTMLImageElement> = new Image(); | |
25 | + | |
26 | + // image.onload = function () { | |
27 | + // canvas!.height = image!.height; | |
28 | + // canvas!.width = image!.width; | |
29 | + // ctx?.drawImage(image!, 0, 0); | |
30 | + // const dataUrl = canvas!.toDataURL('image/png'); | |
31 | + // getImagBase64.value = dataUrl; | |
32 | + // console.log(dataUrl); | |
33 | + // image = null; | |
34 | + // canvas = null; | |
35 | + // }; | |
36 | + // image.setAttribute('crossOrigin', 'Anonymous'); | |
37 | + // image.src = url; | |
38 | + // }; | |
39 | + | |
40 | + const updateFn: DataFetchUpdateFn = (message, attribute) => { | |
41 | + const { data = {} } = message; | |
42 | + const [latest] = data[attribute] || []; | |
43 | + const [timespan, value] = latest; | |
44 | + time.value = timespan; | |
45 | + url.value = `${value}?timespan=${timespan}`; | |
46 | + }; | |
47 | + | |
48 | + useDataFetch(props, updateFn); | |
49 | +</script> | |
50 | + | |
51 | +<template> | |
52 | + <main class="w-full h-full flex flex-col items-center"> | |
53 | + <AntImage :src="url" :fallback="fallback" /> | |
54 | + <UpdateTime :time="time" /> | |
55 | + </main> | |
56 | +</template> | |
57 | + | |
58 | +<style scoped lang="less"> | |
59 | + :deep(.ant-image) { | |
60 | + @apply flex justify-center w-auto; | |
61 | + | |
62 | + height: calc(100% - 56px); | |
63 | + | |
64 | + img { | |
65 | + @apply w-auto h-full; | |
66 | + } | |
67 | + } | |
68 | +</style> | ... | ... |
... | ... | @@ -16,7 +16,7 @@ export enum FetchComFlagTypeEnum { |
16 | 16 | export enum PackagesCategoryNameEnum { |
17 | 17 | TEXT = '文本组件', |
18 | 18 | INSTRUMENT = '仪表组件', |
19 | - PICTURE = '图片组件', | |
19 | + // PICTURE = '图片组件', | |
20 | 20 | CONTROL = '控制组件', |
21 | 21 | MAP = '地图组件', |
22 | 22 | FLOWMETER = '流量计', |
... | ... | @@ -30,7 +30,7 @@ export enum PackagesCategoryNameEnum { |
30 | 30 | export enum PackagesCategoryEnum { |
31 | 31 | TEXT = 'TEXT', |
32 | 32 | INSTRUMENT = 'INSTRUMENT', |
33 | - PICTURE = 'PICTURE', | |
33 | + // PICTURE = 'PICTURE', | |
34 | 34 | CONTROL = 'CONTROL', |
35 | 35 | MAP = 'MAP', |
36 | 36 | FLOWMETER = 'FLOWMETER', | ... | ... |
... | ... | @@ -3,7 +3,7 @@ import { FlowmeterList } from './components/Flowmeter'; |
3 | 3 | import { InstrumentList } from './components/Instrument'; |
4 | 4 | import { MapList } from './components/Map'; |
5 | 5 | import { OtherList } from './components/Other'; |
6 | -import { PictureList } from './components/Picture'; | |
6 | +// import { PictureList } from './components/Picture'; | |
7 | 7 | import { TextList } from './components/Text'; |
8 | 8 | import { STATISTICSList } from './components/Statistics'; |
9 | 9 | import { PackagesCategoryEnum, PackagesType } from './index.type'; |
... | ... | @@ -11,7 +11,7 @@ import { PackagesCategoryEnum, PackagesType } from './index.type'; |
11 | 11 | export const packageList: PackagesType = { |
12 | 12 | [PackagesCategoryEnum.TEXT]: TextList, |
13 | 13 | [PackagesCategoryEnum.INSTRUMENT]: InstrumentList, |
14 | - [PackagesCategoryEnum.PICTURE]: PictureList, | |
14 | + // [PackagesCategoryEnum.PICTURE]: PictureList, | |
15 | 15 | [PackagesCategoryEnum.CONTROL]: ControlList, |
16 | 16 | [PackagesCategoryEnum.MAP]: MapList, |
17 | 17 | [PackagesCategoryEnum.FLOWMETER]: FlowmeterList, | ... | ... |