Pārlūkot izejas kodu

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

奔跑的面条 3 gadi atpakaļ
vecāks
revīzija
3cc3714e94

BIN
src/assets/images/chart/charts/pie-circle.png


BIN
src/assets/images/chart/charts/process.png


+ 28 - 1
src/packages/components/Charts/Mores/Process/config.ts

@@ -4,9 +4,36 @@ import { ProcessConfig } from './index'
 import { chartInitConfig } from '@/settings/designSetting'
 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 = {
   dataset: 36,
-  type: "circle",
+  type: types[2].value,
   color: '#4992FFFF',
   // 指标位置(线条时可用)
   indicatorPlacement: "outside"

+ 1 - 27
src/packages/components/Charts/Mores/Process/config.vue

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

+ 1 - 1
src/packages/components/Charts/Mores/Process/index.ts

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

+ 63 - 0
src/packages/components/Charts/Pies/PieCircle/config.ts

@@ -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)
+}

+ 89 - 0
src/packages/components/Charts/Pies/PieCircle/config.vue

@@ -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>

+ 14 - 0
src/packages/components/Charts/Pies/PieCircle/index.ts

@@ -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
+}

+ 71 - 0
src/packages/components/Charts/Pies/PieCircle/index.vue

@@ -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>

+ 2 - 1
src/packages/components/Charts/Pies/index.ts

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

+ 1 - 1
src/packages/components/Charts/index.ts

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

+ 1 - 0
src/packages/components/Decorates/Mores/Number/config.ts

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

+ 7 - 0
src/packages/components/Decorates/Mores/Number/config.vue

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

+ 2 - 0
src/packages/components/Decorates/Mores/Number/index.vue

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