feat: 新增环形图,新增NaiveUI-进度组件

This commit is contained in:
奔跑的面条 2022-06-13 13:18:30 +08:00
parent be0aa6d099
commit 3cc3714e94
14 changed files with 280 additions and 31 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -4,9 +4,36 @@ import { ProcessConfig } from './index'
import { chartInitConfig } from '@/settings/designSetting' import { chartInitConfig } from '@/settings/designSetting'
import cloneDeep from 'lodash/cloneDeep' import cloneDeep from 'lodash/cloneDeep'
export const types = [
{
label: '线形',
value: 'line'
},
{
label: '圆形',
value: 'circle'
},
{
label: '仪表盘',
value: 'dashboard'
},
]
export const indicatorPlacements = [
{
label: '内部',
value: 'inside'
},
{
label: '外部',
value: 'outside'
}
]
export const option = { export const option = {
dataset: 36, dataset: 36,
type: "circle", type: types[2].value,
color: '#4992FFFF', color: '#4992FFFF',
// 指标位置(线条时可用) // 指标位置(线条时可用)
indicatorPlacement: "outside" indicatorPlacement: "outside"

View File

@ -38,7 +38,7 @@ import {
} from '@/components/Pages/ChartItemSetting' } from '@/components/Pages/ChartItemSetting'
// option 便使 typeof // option 便使 typeof
import { option } from './config' import { option, types, indicatorPlacements} from './config'
const props = defineProps({ const props = defineProps({
optionData: { optionData: {
@ -46,30 +46,4 @@ const props = defineProps({
required: true required: true
} }
}) })
const types = [
{
label: '线形',
value: 'line'
},
{
label: '圆形',
value: 'circle'
},
{
label: '仪表盘',
value: 'dashboard'
},
]
const indicatorPlacements = [
{
label: '里面',
value: 'inside'
},
{
label: '外边',
value: 'outside'
}
]
</script> </script>

View File

@ -13,7 +13,7 @@ export const ProcessConfig: ConfigType = {
// 配置组件渲染 Components 格式: VC + key // 配置组件渲染 Components 格式: VC + key
conKey: 'VCProcess', conKey: 'VCProcess',
// 名称 // 名称
title: '多类进度条', title: 'NaiveUI-进度',
// 子分类目录 // 子分类目录
category: ChatCategoryEnum.MORE, category: ChatCategoryEnum.MORE,
// 子分类目录 // 子分类目录

View File

@ -0,0 +1,63 @@
import { echartOptionProfixHandle, publicConfig } from '@/packages/public'
import { PieCircleConfig } from './index'
import { CreateComponentType } from '@/packages/index.d'
export const includes = ['legend']
const option = {
tooltip: {
show: true,
trigger: 'item'
},
legend: {
show: true,
},
dataset: 0.25,
title: {
text: 25 + "%",
x: "center",
y: "center",
textStyle: {
color: "#56B9F8",
fontSize: 30
}
},
series: [
{
type: "pie",
radius: ["75%", "80%"],
center: ["50%", "50%"],
hoverAnimation: true,
color: ["#00bcd44a", "transparent"],
label: {
show: false
},
data: [
{
value: [25],
itemStyle: {
color: "#03a9f4",
shadowBlur: 10,
shadowColor:"#97e2f5"
}
},
{
value: [75],
itemStyle: {
color: "#00bcd44a",
shadowBlur: 0,
shadowColor:"#00bcd44a"
}
}
]
},
]
}
export default class Config extends publicConfig implements CreateComponentType {
public key: string = PieCircleConfig.key
public chartConfig = PieCircleConfig
// 图表配置项
public option = echartOptionProfixHandle(option, includes)
}

View File

@ -0,0 +1,89 @@
<template>
<!-- 遍历 seriesList -->
<CollapseItem v-for="(item, index) in config.series" :key="index" :name="`圆环`" :expanded="true">
<SettingItemBox name="数据">
<SettingItem name="数值">
<n-input-number v-model:value="config.dataset" :min="0" :max="1" :step="0.01" size="small" placeholder="数值">
</n-input-number>
</SettingItem>
</SettingItemBox>
<!-- Echarts 全局设置 -->
<SettingItemBox name="进度条">
<SettingItem name="颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.data[0].itemStyle.color"
></n-color-picker>
</SettingItem>
<SettingItem name="阴影模糊等级">
<n-input-number v-model:value="item.data[0].itemStyle.shadowBlur" :min="0" :max="50" :step="1" size="small" placeholder="阴影模糊等级">
</n-input-number>
</SettingItem>
<SettingItem name="阴影颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.data[0].itemStyle.shadowColor"
></n-color-picker>
</SettingItem>
</SettingItemBox>
<!-- 中心标题 -->
<SettingItemBox v-if="config.title" name="标题">
<SettingItem name="颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="config.title.textStyle.color"
></n-color-picker>
</SettingItem>
<SettingItem name="字体大小">
<n-input-number v-model:value="config.title.textStyle.fontSize" :min="0" :step="1" size="small" placeholder="字体大小">
</n-input-number>
</SettingItem>
</SettingItemBox>
<!-- 其他样式 -->
<SettingItemBox name="轨道样式">
<SettingItem name="颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.data[1].itemStyle.color"
></n-color-picker>
</SettingItem>
<SettingItem name="阴影模糊等级">
<n-input-number v-model:value="item.data[1].itemStyle.shadowBlur" :min="0" :step="1" size="small" placeholder="阴影模糊等级">
</n-input-number>
</SettingItem>
<SettingItem name="阴影颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.data[1].itemStyle.shadowColor"
></n-color-picker>
</SettingItem>
</SettingItemBox>
</CollapseItem>
</template>
<script setup lang="ts">
import { PropType, computed } from 'vue'
//
import {
CollapseItem,
SettingItemBox,
SettingItem
} from '@/components/Pages/ChartItemSetting'
import { GlobalThemeJsonType } from '@/settings/chartThemes'
const props = defineProps({
optionData: {
type: Object as PropType<GlobalThemeJsonType>,
required: true
}
})
const config = computed(() => {
return props.optionData
})
</script>

View File

@ -0,0 +1,14 @@
import image from '@/assets/images/chart/charts/pie-circle.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const PieCircleConfig: ConfigType = {
key: 'PieCircle',
chartKey: 'VPieCircle',
conKey: 'VCPieCircle',
title: '饼图-环形',
category: ChatCategoryEnum.PIE,
categoryName: ChatCategoryEnumName.PIE,
package: PackagesCategoryEnum.CHARTS,
image
}

View File

@ -0,0 +1,71 @@
<template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize></v-chart>
</template>
<script setup lang="ts">
import {computed, PropType, reactive, watch} from 'vue'
import VChart from 'vue-echarts'
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { PieChart } from 'echarts/charts'
import { mergeTheme } from '@/packages/public/chart'
import config, { includes } from './config'
import { useChartDataFetch } from '@/hooks'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { isPreview } from '@/utils'
import {
DatasetComponent,
GridComponent,
TooltipComponent,
LegendComponent,
TitleComponent,
} from 'echarts/components'
const props = defineProps({
themeSetting: {
type: Object,
required: true
},
themeColor: {
type: Object,
required: true
},
chartConfig: {
type: Object as PropType<config>,
required: true
}
})
use([
DatasetComponent,
CanvasRenderer,
PieChart,
GridComponent,
TooltipComponent,
LegendComponent,
TitleComponent
])
const option = reactive({
value: {}
})
watch(
() => props.chartConfig.option.dataset,
(newData) => {
// console.log('update:'+newData)
const d = parseFloat(`${newData}`) * 100
let config = props.chartConfig.option
config.title.text = d.toFixed(2) + "%"
config.series[0].data[0].value[0] = d
config.series[0].data[1].value[0] = 100 - d
option.value = mergeTheme(config, props.themeSetting, includes)
option.value = config
},
{
immediate: true,
}
)
const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore)
</script>

View File

@ -1,3 +1,4 @@
import { PieCommonConfig } from './PieCommon/index' import { PieCommonConfig } from './PieCommon/index'
import { PieCircleConfig } from './PieCircle/index'
export default [PieCommonConfig] export default [PieCommonConfig, PieCircleConfig]

View File

@ -4,4 +4,4 @@ import Lines from './Lines'
import Mores from './Mores' import Mores from './Mores'
import Maps from './Maps' import Maps from './Maps'
export const ChartList = [...Bars, ...Pies, ...Lines, ...Maps , ...Mores] export const ChartList = [...Bars, ...Pies, ...Lines, ...Maps, ...Mores]

View File

@ -7,6 +7,7 @@ export const option = {
from: 50000, from: 50000,
to: 100000, to: 100000,
dur: 3, dur: 3,
precision: 0,
showSeparator: true, showSeparator: true,
numberSize: 24, numberSize: 24,
numberColor: '#4a9ef8', numberColor: '#4a9ef8',

View File

@ -28,6 +28,13 @@
<n-text>展示分割符</n-text> <n-text>展示分割符</n-text>
</n-space> </n-space>
</SettingItem> </SettingItem>
<SettingItem name="精度">
<n-input-number
v-model:value="optionData.precision"
size="small"
:min="0"
></n-input-number>
</SettingItem>
</SettingItemBox> </SettingItemBox>
<SettingItemBox name="数值"> <SettingItemBox name="数值">

View File

@ -11,6 +11,7 @@
:to="to" :to="to"
:duration="dur * 1000" :duration="dur * 1000"
:show-separator="showSeparator" :show-separator="showSeparator"
:precision="precision"
></n-number-animation> ></n-number-animation>
</span> </span>
<template #suffix> <template #suffix>
@ -42,6 +43,7 @@ const {
suffixColor, suffixColor,
from, from,
to, to,
precision,
numberSize, numberSize,
numberColor, numberColor,
} = toRefs(props.chartConfig.option) } = toRefs(props.chartConfig.option)