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, | ... | ... |