zoukankan      html  css  js  c++  java
  • 基于Danvici二开,扩展水滴图与进度条图

    想要完成上面的功能需要修改的文件比较多,图标自己到iconfont网站上面自己下载。为了不影响别的图标,自己在app/assets/目录下面新建一个目录,下载好的字体放进去

    在/app/app.tsx文件中全局引入

    import 'assets/BIfonts/iconfont.css'
    

     然后要改动的主要就是containers/Widget目录下面的文件

    conponents/Chart/Chrats.tsx文件中头部引入echarts-liquidfill
    import 'echarts-liquidfill'
    
    
    
    conponents/Chart/Widget/index.tsx文件中
    export interface IChartStyles {
    ...
    //TODO 该文件暂时可以不改不影响图表展示
    //progress?: IGaugeConfig
    }
    
    
    
    conponents/Chart/Workbench/OperatingPanel.tsx文件中
    const {
      ...
       doubleYAxis,
    
      progress,
      liquidfill
    
    } = styleParams
    
    {gauge && (
      <GaugeSection
        title="仪表盘"
        config={gauge}
        onChange={this.styleChange('gauge')}
      />
    )}代码后面添加下面代码
    
    {progress && (
      <GaugeSection
        title="进度条"
        config={progress}
        onChange={this.styleChange('progress')}
      />
    )}
    {liquidfill && (
      <GaugeSection
        title="水滴图"
        config={liquidfill}
        onChange={this.styleChange('liquidfill')}
      />
    )}
    //GaugeSection组件后期需要替换掉,暂时不影响 在conponents/Chart/Workbench/ConfigSections文件夹下面创建需要的水滴图与进度条Setion页面可以参照GaugeSetion.tsx
    

      


    修改 conponents/Chart/config/chart目录下面的ChartTypes.ts 在enum中添加下面代码
    /**
       * 进度条 jeiiy
       */
      Progress = 18,
    /**
     * 进度条 jeiiy
     */
      Liquidfill = 19
    修改 conponents/Chart/config/chart目录下面的index.tsx 
    import progress from './progress'
    import liquidfill from './liquidfill'
    
    const widgetlibs: IChartInfo[] = [
      ...
      progress,
      liquidfill
    ]
    

    conponents/Chart/config/chart 目录下添加liquidfill.ts

    //jeiiy
    import ChartTypes from './ChartTypes'
    import echarts from 'echarts'
    import {
      PIVOT_CHART_FONT_FAMILIES,
      PIVOT_DEFAULT_FONT_COLOR,
      PIVOT_DEFAULT_AXIS_LINE_COLOR,
      CHART_FUNNEL_LABEL_POSITIONS,
      CHART_SORT_MODES,
      CHART_ALIGNMENT_MODES,
      DEFAULT_FONT_STYLE,
      DEFAULT_ECHARTS_THEME
    } from 'app/globalConstants'
    
    import { IChartInfo } from 'containers/Widget/components/Widget'
    
    const liquidfill: IChartInfo = {
      id: ChartTypes.Liquidfill,
      name: 'liquidfill',
      title: '水波图',
      icon: 'icon-chart-liquidfill',
      coordinate: 'cartesian',
      rules: [{ dimension: 1, metric: [1, 9999] }],
      dimetionAxis: 'col',
      data: {
        cols: {
          title: '列',
          type: 'category'
        },
        rows: {
          title: '行',
          type: 'category'
        },
        metrics: {
          title: '指标',
          type: 'value'
        },
        filters: {
          title: '筛选',
          type: 'all'
        },
        color: {
          title: '颜色',
          type: 'category'
        },
        tip: {
          title: '提示信息',
          type: 'value'
        }
      },
      style: {
        liquidfill: {
          radius: 75,
          splitNumber: 10,
          startAngle: 225,
          endAngle: -45,
          clockwise: true,
          max: 100,
          prefix: '',
          suffix: '%',
          showTitle: true,
          titleFontFamily: PIVOT_CHART_FONT_FAMILIES[0].value,
          titleFontSize: '16',
          titleColor: PIVOT_DEFAULT_FONT_COLOR,
          titleOffsetLeft: 0,
          titleOffsetTop: -40,
          showDetail: true,
          detailFontFamily: PIVOT_CHART_FONT_FAMILIES[0].value,
          detailFontSize: '28',
          detailColor: PIVOT_DEFAULT_FONT_COLOR,
          detailOffsetLeft: 0,
          detailOffsetTop: 40,
          showPointer: true,
          pointerLength: 80,
          pointerWidth: 8,
          customPointerColor: false,
          pointerColor: DEFAULT_ECHARTS_THEME.color[0],
          pointerBorderStyle: 'solid',
          pointerBorderWidth: 0,
          pointerBorderColor: PIVOT_DEFAULT_AXIS_LINE_COLOR,
          axisLineSize: 30,
          axisLineColor: DEFAULT_ECHARTS_THEME.color[0],
          showAxisTick: true,
          showAxisLabel: true,
          axisLabelDistance: 5,
          axisLabelFontFamily: PIVOT_CHART_FONT_FAMILIES[0].value,
          axisLabelFontSize: '12',
          axisLabelColor: PIVOT_DEFAULT_FONT_COLOR,
          showSplitLine: true,
          splitLineLength: 30,
          splitLineSize: '1',
          splitLineStyle: 'solid',
          splitLineColor: PIVOT_DEFAULT_AXIS_LINE_COLOR
        }
      }
    }
    
    export default liquidfill
    

      conponents/Chart/config/chart 目录下添加progress.ts

    //jeiiy
    import ChartTypes from './ChartTypes'
    import echarts from 'echarts'
    import {
      PIVOT_CHART_FONT_FAMILIES,
      PIVOT_DEFAULT_FONT_COLOR,
      PIVOT_DEFAULT_AXIS_LINE_COLOR,
      CHART_FUNNEL_LABEL_POSITIONS,
      CHART_SORT_MODES,
      CHART_ALIGNMENT_MODES,
      DEFAULT_FONT_STYLE,
      DEFAULT_ECHARTS_THEME
    } from 'app/globalConstants'
    
    import { IChartInfo } from 'containers/Widget/components/Widget'
    
    const progress: IChartInfo = {
      id: ChartTypes.Progress,
      name: 'progress',
      title: '进度图',
      icon: 'icon-chart-progress',
      coordinate: 'cartesian',
      rules: [{ dimension: 1, metric: [1, 9999] }],
      dimetionAxis: 'col',
      data: {
        cols: {
          title: '列',
          type: 'category'
        },
        rows: {
          title: '行',
          type: 'category'
        },
        metrics: {
          title: '指标',
          type: 'value'
        },
        filters: {
          title: '筛选',
          type: 'all'
        },
        color: {
          title: '颜色',
          type: 'category'
        },
        tip: {
          title: '提示信息',
          type: 'value'
        }
      },
      style: {
        progress: {
          radius: 75,
          splitNumber: 10,
          startAngle: 225,
          endAngle: -45,
          clockwise: true,
          max: 100,
          prefix: '',
          suffix: '%',
          showTitle: true,
          titleFontFamily: PIVOT_CHART_FONT_FAMILIES[0].value,
          titleFontSize: '16',
          titleColor: PIVOT_DEFAULT_FONT_COLOR,
          titleOffsetLeft: 0,
          titleOffsetTop: -40,
          showDetail: true,
          detailFontFamily: PIVOT_CHART_FONT_FAMILIES[0].value,
          detailFontSize: '28',
          detailColor: PIVOT_DEFAULT_FONT_COLOR,
          detailOffsetLeft: 0,
          detailOffsetTop: 40,
          showPointer: true,
          pointerLength: 80,
          pointerWidth: 8,
          customPointerColor: false,
          pointerColor: DEFAULT_ECHARTS_THEME.color[0],
          pointerBorderStyle: 'solid',
          pointerBorderWidth: 0,
          pointerBorderColor: PIVOT_DEFAULT_AXIS_LINE_COLOR,
          axisLineSize: 30,
          axisLineColor: DEFAULT_ECHARTS_THEME.color[0],
          showAxisTick: true,
          showAxisLabel: true,
          axisLabelDistance: 5,
          axisLabelFontFamily: PIVOT_CHART_FONT_FAMILIES[0].value,
          axisLabelFontSize: '12',
          axisLabelColor: PIVOT_DEFAULT_FONT_COLOR,
          showSplitLine: true,
          splitLineLength: 30,
          splitLineSize: '1',
          splitLineStyle: 'solid',
          splitLineColor: PIVOT_DEFAULT_AXIS_LINE_COLOR
        }
      }
    }
    
    export default progress
    

    conponents/Chart/render/chart目录下创建liquidfill.ts
    /*
     * <<
     * Davinci
     * ==
     * Copyright (C) 2016 - 2017 EDP
     * ==
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     * >>
     */
    
    import Echarts from 'echarts'
    
    /*
     * jeiiy
     */
    import { IChartProps } from '../../components/Chart'
    import { decodeMetricName } from '../../components/util'
    // import { EChartOption } from 'echarts'
    import { getFormattedValue } from '../../components/Config/Format'
    
    export default function (chartProps: IChartProps, drillOptions?: any) {
      const { width, height, data, cols, metrics, chartStyles } = chartProps
    
      const { axis, splitLine, liquidfill } = chartStyles
    
      const {
        radius,
        splitNumber,
        startAngle,
        endAngle,
        clockwise,
        prefix,
        suffix,
        showTitle,
        titleFontFamily,
        titleFontSize,
        titleColor,
        titleOffsetLeft,
        titleOffsetTop,
        showDetail,
        detailFontFamily,
        detailFontSize,
        detailColor,
        detailOffsetLeft,
        detailOffsetTop,
        showPointer,
        pointerLength,
        pointerWidth,
        customPointerColor,
        pointerColor,
        pointerBorderStyle,
        pointerBorderWidth,
        pointerBorderColor,
        axisLineSize,
        axisLineColor,
        showAxisTick,
        showAxisLabel,
        axisLabelDistance,
        axisLabelFontFamily,
        axisLabelFontSize,
        axisLabelColor,
        showSplitLine,
        splitLineLength,
        splitLineSize,
        splitLineStyle,
        splitLineColor
      } = liquidfill
      const max = liquidfill.max || 100
    
      const seriesObj = {}
      const seriesArr = []
    
      const value = 0.2
      const datas = [value, value, value]
      const options = {
        backgroundColor: new Echarts.graphic.RadialGradient(0.3, 0.3, 0.8, [
          {
            offset: 0,
            color: '#431ab8'
          },
          {
            offset: 1,
            color: '#471bba'
          }
        ]),
        title: {
          text: `${(value * 100).toFixed(0)}{a|%}`,
          textStyle: {
            fontSize: 50,
            fontFamily: 'Microsoft Yahei',
            fontWeight: 'normal',
            color: '#bcb8fb',
            rich: {
              a: {
                fontSize: 28
              }
            }
          },
          x: 'center',
          y: '35%'
        },
        graphic: [
          {
            type: 'group',
            left: 'center',
            top: '60%',
            children: [
              {
                type: 'text',
                z: 100,
                left: '10',
                top: 'middle',
                style: {
                  fill: '#aab2fa',
                  text: '流量统计',
                  font: '20px Microsoft YaHei'
                }
              }
            ]
          }
        ],
        series: [
          {
            type: 'liquidFill',
            radius: '80%',
            center: ['50%', '50%'],
            //  shape: 'roundRect',
            data: datas,
            backgroundStyle: {
              color: {
                type: 'linear',
                x: 1,
                y: 0,
                x2: 0.5,
                y2: 1,
                colorStops: [
                  {
                    offset: 1,
                    color: 'rgba(68, 145, 253, 0)'
                  },
                  {
                    offset: 0.5,
                    color: 'rgba(68, 145, 253, .25)'
                  },
                  {
                    offset: 0,
                    color: 'rgba(68, 145, 253, 1)'
                  }
                ],
                globalCoord: false
              }
            },
            outline: {
              borderDistance: 0,
              itemStyle: {
                borderWidth: 20,
                borderColor: {
                  type: 'linear',
                  x: 0,
                  y: 0,
                  x2: 0,
                  y2: 1,
                  colorStops: [
                    {
                      offset: 0,
                      color: 'rgba(69, 73, 240, 0)'
                    },
                    {
                      offset: 0.5,
                      color: 'rgba(69, 73, 240, .25)'
                    },
                    {
                      offset: 1,
                      color: 'rgba(69, 73, 240, 1)'
                    }
                  ],
                  globalCoord: false
                },
                shadowBlur: 10,
                shadowColor: '#000'
              }
            },
            itemStyle: {
              color: {
                type: 'linear',
                x: 0,
                y: 0,
                x2: 0,
                y2: 1,
                colorStops: [
                  {
                    offset: 1,
                    color: 'rgba(58, 71, 212, 0)'
                  },
                  {
                    offset: 0.5,
                    color: 'rgba(31, 222, 225, .2)'
                  },
                  {
                    offset: 0,
                    color: 'rgba(31, 222, 225, 1)'
                  }
                ],
                globalCoord: false
              }
            },
            label: {
              normal: {
                formatter: ''
              }
            }
          }
        ]
      }
    
      metrics.forEach((m) => {
        const decodedMetricName = decodeMetricName(m.name)
        seriesArr.push(seriesObj)
      })
    
      // const tooltip: EChartOption.Tooltip = {
      //   trigger: 'item',
      //   formatter: '{b}: {c}'
      // }
    
      return options
    }
    

     conponents/Chart/render/chart 目录下创建progress.ts

    /*
     * <<
     * Davinci
     * ==
     * Copyright (C) 2016 - 2017 EDP
     * ==
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     * >>
     */
    
    import Echarts from 'echarts'
    
    /*
     * jeiiy
     */
    import { IChartProps } from '../../components/Chart'
    import { decodeMetricName } from '../../components/util'
    // import { EChartOption } from 'echarts'
    import { getFormattedValue } from '../../components/Config/Format'
    
    export default function (chartProps: IChartProps, drillOptions?: any) {
      console.log('又进来了')
      const { width, height, data, cols, metrics, chartStyles } = chartProps
    
      const { axis, splitLine, progress } = chartStyles
    
      const {
        radius,
        splitNumber,
        startAngle,
        endAngle,
        clockwise,
        prefix,
        suffix,
        showTitle,
        titleFontFamily,
        titleFontSize,
        titleColor,
        titleOffsetLeft,
        titleOffsetTop,
        showDetail,
        detailFontFamily,
        detailFontSize,
        detailColor,
        detailOffsetLeft,
        detailOffsetTop,
        showPointer,
        pointerLength,
        pointerWidth,
        customPointerColor,
        pointerColor,
        pointerBorderStyle,
        pointerBorderWidth,
        pointerBorderColor,
        axisLineSize,
        axisLineColor,
        showAxisTick,
        showAxisLabel,
        axisLabelDistance,
        axisLabelFontFamily,
        axisLabelFontSize,
        axisLabelColor,
        showSplitLine,
        splitLineLength,
        splitLineSize,
        splitLineStyle,
        splitLineColor
      } = progress
      const max = progress.max || 100
    
      const seriesObj = {}
      const seriesArr = []
    
      const category = [
        {
          name: '累计完成',
          value: 612.5
        }
      ] // 类别
      const total = 1000 // 数据总数
      // const datas = []
      // category.forEach((value) => {
      //   datas.push(value.value)
      // })
      const options = {
        grid: {
          // 直角坐标系内绘图网格
          left: '80', // grid 组件离容器左侧的距离,
          // left的值可以是80这样具体像素值,
          // 也可以是'80%'这样相对于容器高度的百分比
          top: '80',
          right: '0',
          bottom: '0',
          containLabel: true // gid区域是否包含坐标轴的刻度标签。为true的时候,
          // left/right/top/bottom/width/height决定的是包括了坐标轴标签在内的
          // 所有内容所形成的矩形的位置.常用于【防止标签溢出】的场景
        },
        xAxis: {
          // 直角坐标系grid中的x轴,
          // 一般情况下单个grid组件最多只能放上下两个x轴,
          // 多于两个x轴需要通过配置offset属性防止同个位置多个x轴的重叠。
          type: 'value', // 坐标轴类型,分别有:
          // 'value'-数值轴;'category'-类目轴;
          // 'time'-时间轴;'log'-对数轴
          splitLine: { show: false }, // 坐标轴在 grid 区域中的分隔线
          axisLabel: { show: false }, // 坐标轴刻度标签
          axisTick: { show: false }, // 坐标轴刻度
          axisLine: { show: false } // 坐标轴轴线
        },
        yAxis: {
          type: 'category',
          axisTick: { show: false },
          axisLine: { show: false },
          axisLabel: {
            color: 'black',
            fontSize: 36
          },
          data: ['a'] // 类目数据,在类目轴(type: 'category')中有效。
          // 如果没有设置 type,但是设置了axis.data,则认为type 是 'category'。
        },
        series: [
          // 系列列表。每个系列通过 type 决定自己的图表类型
          {
            name: '%', // 系列名称
            type: 'bar', // 柱状、条形图
            barWidth: 19, // 柱条的宽度,默认自适应
            data: [20], // 系列中数据内容数组
            label: {
              // 图形上的文本标签
              show: true,
              position: 'right', // 标签的位置
              offset: [0, -40], // 标签文字的偏移,此处表示向上偏移40
              formatter: '{c}{a}', // 标签内容格式器 {a}-系列名,{b}-数据名,{c}-数据值
              color: 'black', // 标签字体颜色
              fontSize: 36 // 标签字号
            },
            itemStyle: {
              // 图形样式
              normal: {
                // normal 图形在默认状态下的样式;
                // emphasis图形在高亮状态下的样式
                barBorderRadius: 10, // 柱条圆角半径,单位px.
                // 此处统一设置4个角的圆角大小;
                // 也可以分开设置[10,10,10,10]顺时针左上、右上、右下、左下
                color: new Echarts.graphic.LinearGradient(0, 0, 1, 0, [
                  {
                    offset: 0,
                    color: '#22B6ED'
                  },
                  {
                    offset: 1,
                    color: '#3FE279'
                  }
                ])
              }
            },
            zlevel: 1 // 柱状图所有图形的 zlevel 值,
            // zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面
          },
          {
            name: '进度条背景',
            type: 'bar',
            barGap: '-100%', // 不同系列的柱间距离,为百分比。
            // 在同一坐标系上,此属性会被多个 'bar' 系列共享。
            // 此属性应设置于此坐标系中最后一个 'bar' 系列上才会生效,
            // 并且是对此坐标系中所有 'bar' 系列生效。
            barWidth: 19,
            data: [100],
            color: '#151B87', // 柱条颜色
            itemStyle: {
              normal: {
                barBorderRadius: radius
              }
            }
          }
        ]
      }
    
      metrics.forEach((m) => {
        const decodedMetricName = decodeMetricName(m.name)
    
        // seriesObj = {
        //   type: 'gauge',
        //   splitNumber,
        //   startAngle,
        //   endAngle,
        //   clockwise,
        //   max,
        //   radius: radius ? `${radius}%` : '75%',
        //   title: {
        //     show: showTitle,
        //     fontFamily: titleFontFamily,
        //     fontSize: titleFontSize,
        //     color: titleColor,
        //     offsetCenter: [
        //       titleOffsetLeft ? `${titleOffsetLeft}%` : 0,
        //       titleOffsetTop ? `${titleOffsetTop}%` : 0
        //     ]
        //   },
        //   detail: {
        //     show: showDetail,
        //     fontFamily: detailFontFamily,
        //     fontSize: detailFontSize,
        //     color: detailColor,
        //     offsetCenter: [
        //       detailOffsetLeft ? `${detailOffsetLeft}%` : 0,
        //       detailOffsetTop ? `${detailOffsetTop}%` : 0
        //     ],
        //     formatter: (value) => `${prefix}${getFormattedValue(Number(value) * 100 / max, m.format)}${suffix}`,
        //     // rich: {},
        //     //  240,
        //     // height: 240,
        //     // borderRadius: 120,
        //     // lineHeight: 240,
        //     // backgroundColor: '#05354a'
        //   },
        //   // animationDuration: 1000,
        //   // animationDurationUpdate: 1000,
        //   data: [{
        //     value: data.length ? data[0][`${m.agg}(${decodedMetricName})`] : 0,
        //     name: m.field.alias || decodedMetricName
        //   }],
        //   axisLine: {
        //     lineStyle: {
        //        axisLineSize,
        //       color: [
        //         [data.length ? data[0][`${m.agg}(${decodedMetricName})`] / max : 0, axisLineColor],
        //         [1, '#ddd']
        //       ]
        //     }
        //   },
        //   axisTick: {
        //     show: showAxisTick
        //   },
        //   axisLabel: {
        //     show: showAxisLabel,
        //     distance: axisLabelDistance,
        //     fontSize: axisLabelFontSize,
        //     fontFamily: axisLabelFontFamily,
        //     color: axisLabelColor
        //   },
        //   splitLine: {
        //     show: showSplitLine,
        //     length: splitLineLength,
        //     lineStyle: {
        //       color: splitLineColor,
        //        splitLineSize,
        //       type: splitLineStyle
        //     }
        //   },
        //   pointer: {
        //     show: showPointer,
        //     length: pointerLength ? `${pointerLength}%` : 0,
        //      pointerWidth
        //   },
        //   itemStyle: {
        //     color: customPointerColor ? pointerColor : 'auto',
        //     borderType: pointerBorderStyle,
        //     borderWidth: pointerBorderWidth,
        //     borderColor: pointerBorderColor
        //   }
        // }
        seriesArr.push(seriesObj)
      })
    
      // const tooltip: EChartOption.Tooltip = {
      //   trigger: 'item',
      //   formatter: '{b}: {c}'
      // }
    
      return options
    }
    

      修改 conponents/Chart/render/chart/index.ts

    import progress from './progress'
    import liquidfill from './liquidfill'
    
    switch 方法中添加下面逻辑 
    case 'progress':
      return progress(chartProps, drillOptions)
    case 'liquidfill':
      return liquidfill(chartProps, drillOptions)
    

       

    代码搬运工
  • 相关阅读:
    接口测试基础-ddt
    接口测试基础-json.loads-json数据格式转换成字典格式
    接口测试基础-拆包
    接口测试基础-导入第三方模块和删除第三方模块
    接口测试基础-正则表达式和参数化
    接口测试基础-Exece的操作-openpyxl模块
    matlab学习
    matlab学习笔记
    SSH框架配置及Maven使用
    运筹学框架图
  • 原文地址:https://www.cnblogs.com/tw6668/p/14601227.html
Copyright © 2011-2022 走看看