feat: 新增基础树图

This commit is contained in:
奔跑的面条 2022-09-26 21:18:01 +08:00
parent 62aec195ea
commit 0d1abd00a1
10 changed files with 220 additions and 17 deletions

View File

@ -16,6 +16,7 @@ export const heatMapUrl = '/mock/heatMapData'
export const scatterBasicUrl = '/mock/scatterBasic' export const scatterBasicUrl = '/mock/scatterBasic'
export const mapUrl = '/mock/map' export const mapUrl = '/mock/map'
export const wordCloudUrl = '/mock/wordCloud' export const wordCloudUrl = '/mock/wordCloud'
export const treemapUrl = '/mock/treemap'
const mockObject: MockMethod[] = [ const mockObject: MockMethod[] = [
{ {
@ -84,7 +85,12 @@ const mockObject: MockMethod[] = [
url: wordCloudUrl, url: wordCloudUrl,
method: RequestHttpEnum.GET, method: RequestHttpEnum.GET,
response: () => test.fetchWordCloud response: () => test.fetchWordCloud
} },
{
url: treemapUrl,
method: RequestHttpEnum.GET,
response: () => test.fetchTreemap
},
] ]
export default mockObject export default mockObject

View File

@ -1,6 +1,7 @@
import heatmapJson from './heatMapData.json' import heatmapJson from './heatMapData.json'
import scatterJson from './scatter.json' import scatterJson from './scatter.json'
import mapJson from './map.json' import mapJson from './map.json'
import tTreemapJson from './treemap.json'
export default { export default {
// 单图表 // 单图表
@ -245,5 +246,12 @@ export default {
{ name: '@name', value: '@integer(10, 8000)' }, { name: '@name', value: '@integer(10, 8000)' },
{ name: '@name', value: '@integer(10, 8000)' } { name: '@name', value: '@integer(10, 8000)' }
] ]
} },
// 树图
fetchTreemap: {
code: 0,
status: 200,
msg: '请求成功',
data: tTreemapJson
},
} }

50
src/api/mock/treemap.json Normal file
View File

@ -0,0 +1,50 @@
[
{
"name": "@name",
"value": "@integer(0, 1000)",
"children": [
{
"name": "@name",
"value": "@integer(0, 500)"
},
{
"name": "@name",
"value": "@integer(0, 500)"
}
]
},
{
"name": "@name",
"value": "@integer(0, 1000)",
"children": [
{
"name": "@name",
"value": "@integer(0, 00)"
},
{
"name": "@name",
"value": "@integer(0, 500)"
}
]
},
{
"name": "@name",
"value": "@integer(0, 1000)",
"children": [
{
"name": "@name",
"value": "@integer(0, 1000)"
}
]
},
{
"name": "@name",
"value": "@integer(0, 1000)",
"children": [
{
"name": "@name",
"value": "@integer(0, 1000)"
}
]
}
]

View File

@ -1,11 +1,9 @@
<template> <template>
<div> <global-setting :optionData="optionData"></global-setting>
<global-setting :optionData="optionData"></global-setting>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { PropType, computed } from 'vue' import { PropType, computed } from 'vue'
import { GlobalSetting } from '@/components/Pages/ChartItemSetting' import { GlobalSetting } from '@/components/Pages/ChartItemSetting'
import { option } from './config' import { option } from './config'
import { GlobalThemeJsonType } from '@/settings/chartThemes/index' import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
@ -13,12 +11,11 @@ import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
const props = defineProps({ const props = defineProps({
optionData: { optionData: {
type: Object as PropType<typeof option & GlobalThemeJsonType>, type: Object as PropType<typeof option & GlobalThemeJsonType>,
required: true required: true
} }
}) })
const heatMapConfig = computed<typeof option>(() => { const heatMapConfig = computed<typeof option>(() => {
return props.optionData return props.optionData
}) })
</script> </script>

View File

@ -0,0 +1,27 @@
import { echartOptionProfixHandle, PublicConfigClass } from '@/packages/public'
import { TreeMapConfig } from './index'
import { CreateComponentType } from '@/packages/index.d'
import cloneDeep from 'lodash/cloneDeep'
import dataJson from './data.json'
export const includes = []
export const option = {
dataset: dataJson,
series: [
{
name: 'treemap',
type: 'treemap',
leafDepth: 1,
roam: false,
data: dataJson
}
]
}
export default class Config extends PublicConfigClass implements CreateComponentType {
public key = TreeMapConfig.key
public chartConfig = cloneDeep(TreeMapConfig)
// 图表配置项
public option = echartOptionProfixHandle(option, includes)
}

View File

@ -1,6 +1,17 @@
<template> <template>
<global-setting :optionData="optionData"></global-setting>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { PropType } from 'vue'
import { GlobalSetting } from '@/components/Pages/ChartItemSetting'
import { option } from './config'
import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
defineProps({
optionData: {
type: Object as PropType<typeof option & GlobalThemeJsonType>,
required: true
}
})
</script> </script>

View File

@ -0,0 +1,50 @@
[
{
"name": "nodeA",
"value": 10,
"children": [
{
"name": "nodeAa",
"value": 4
},
{
"name": "nodeAb",
"value": 6
}
]
},
{
"name": "nodeA",
"value": 10,
"children": [
{
"name": "nodeAa",
"value": 4
},
{
"name": "nodeAb",
"value": 6
}
]
},
{
"name": "nodeB",
"value": 20,
"children": [
{
"name": "nodeba",
"value": 20
}
]
},
{
"name": "nodeC",
"value": 20,
"children": [
{
"name": "nodeca",
"value": 20
}
]
}
]

View File

@ -1,5 +1,5 @@
import image from '@/assets/images/chart/charts/tree_map.png' import image from '@/assets/images/chart/charts/tree_map.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const TreeMapConfig: ConfigType = { export const TreeMapConfig: ConfigType = {
@ -10,5 +10,6 @@ export const TreeMapConfig: ConfigType = {
category: ChatCategoryEnum.MORE, category: ChatCategoryEnum.MORE,
categoryName: ChatCategoryEnumName.MORE, categoryName: ChatCategoryEnumName.MORE,
package: PackagesCategoryEnum.CHARTS, package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.COMMON,
image image
} }

View File

@ -1,13 +1,62 @@
<template> <template>
<div> <v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
水波
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, PropType, watch } from 'vue'
import VChart from 'vue-echarts'
import dataJson from './data.json'
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { TreemapChart } from 'echarts/charts'
import { includes } from './config'
import { mergeTheme } from '@/packages/public/chart'
import { useChartDataFetch } from '@/hooks'
import { CreateComponentType } from '@/packages/index.d'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { isPreview } from '@/utils'
const props = defineProps({
themeSetting: {
type: Object,
required: true
},
themeColor: {
type: Object,
required: true
},
chartConfig: {
type: Object as PropType<CreateComponentType>,
required: true
}
})
use([CanvasRenderer, TreemapChart])
const vChartRef = ref<typeof VChart>()
const option = computed(() => {
return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
})
const dataSetHandle = (dataset: typeof dataJson) => {
if (dataset) {
props.chartConfig.option.series[0].data = dataset
vChartRef.value?.setOption(props.chartConfig.option)
}
}
watch(
() => props.chartConfig.option.dataset,
newData => {
dataSetHandle(newData)
},
{
deep: false
}
)
useChartDataFetch(props.chartConfig, useChartEditStore, (newData: typeof dataJson) => {
dataSetHandle(newData)
})
</script> </script>
<style lang="scss" scoped>
</style>

View File

@ -75,7 +75,8 @@ import {
heatMapUrl, heatMapUrl,
scatterBasicUrl, scatterBasicUrl,
mapUrl, mapUrl,
wordCloudUrl wordCloudUrl,
treemapUrl
} from '@/api/mock' } from '@/api/mock'
const { HelpOutlineIcon } = icon.ionicons5 const { HelpOutlineIcon } = icon.ionicons5
@ -123,6 +124,9 @@ const apiList = [
{ {
value: `【词云】${wordCloudUrl}` value: `【词云】${wordCloudUrl}`
}, },
{
value: `【树图】${treemapUrl}`
},
] ]
</script> </script>