大屏开源项目go-view二次开发2----半环形控件(C#)
环境搭建参考:
大屏开源项目go-view二次开发1----环境搭建(C#)-CSDN博客
要做的半环形控件最终效果如下图:

步骤如下:
1 在go-view前端项目的\src\packages\components\Charts目录下新增Others目录,并在Others目录下新增PieExt2目录,并把src\packages\components\Charts\Pies\PieCommon目录下的5个文件拷贝到新增PieExt2目录下(因为要做的半环形控件和PieCommon长得最像,拷贝它的过来修改是改动量最小的),接着在Others目录下新增index.ts文件,(由于我已经新增了好几个自定义控件,所以你还会看到BarExt1、PictorialBar、PieExt1目录),最终的目录结构如下图:

2 接着在src\packages\components\Charts目录下的index.d.ts文件和index.ts文件分别添加内容如下:


3 编辑PieExt2目录下的config.ts的文件如下:
import { echartOptionProfixHandle, PublicConfigClass } from '@/packages/public'
import { PieExt2 } from './index'
import { CreateComponentType } from '@/packages/index.d'
import cloneDeep from 'lodash/cloneDeep'
import dataJson from './data.json'
import { fontFamily } from 'html2canvas/dist/types/css/property-descriptors/font-family'
import { height } from 'dom-helpers'export const includes = ['legend']// 其它配置
const otherConfig = {// 轮播动画isCarousel: false,
}export const seriesItem={name: 'Access From',type: 'pie',radius: ['40%', '70%'],center: ['50%', '70%'],// adjust the start and end anglestartAngle: 180,endAngle: 360,label: {formatter: '{b}: {d}',fontSize: 20, // 设置字体大小fontWeight: 'normal',textBorderColor: '#ffffff',color:'#ffffff',textBorderWidth: 0},labelLine: {normal: {length: 40, // 调整引出线的长度lineStyle: {width: 3 // 设置引出线的宽度}}}
}const option = {tooltip: {trigger: 'item',formatter: '{b}:{d}'},legend: {selectedMode: false},dataset: { ...dataJson },series: [seriesItem]
}export default class Config extends PublicConfigClass implements CreateComponentType {public key: string = PieExt2.keypublic chartConfig = cloneDeep(PieExt2)// 图表配置项public option = echartOptionProfixHandle(option, includes)
}
4 编辑PieExt2目录下的config.vue的文件如下:
<template><!-- Echarts 全局设置 --><global-setting :optionData="optionData"></global-setting><CollapseItem name="扩展2饼图配置" :expanded="true"><SettingItemBox name="字体"><setting-item name="格式化"><n-input v-model:value="optionData.series[0].label.formatter" size="small"></n-input></setting-item><setting-item name="大小"><n-input-numberv-model:value="optionData.series[0].label.fontSize"size="small":min="1"></n-input-number></setting-item></SettingItemBox><SettingItemBox name="引出线条"><setting-item name="长度"><n-input v-model:value="optionData.series[0].labelLine.normal.length" size="small"></n-input></setting-item><setting-item name="宽度"><n-input-numberv-model:value="optionData.series[0].labelLine.normal.lineStyle.width"size="small":min="1"></n-input-number></setting-item></SettingItemBox></CollapseItem>
</template><script setup lang="ts">
import { PropType, watch } from 'vue'
import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
import { GlobalSetting, CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'const props = defineProps({optionData: {type: Object as PropType<GlobalThemeJsonType>,required: true}
})
</script>
5 编辑PieExt2目录下的data.json的文件如下:
{"dimensions": ["product", "data1"],"source": [{"product": "Mon","data1": 120},{"product": "Tue","data1": 200},{"product": "Wed","data1": 150},{"product": "Thu","data1": 80},{"product": "Fri","data1": 70},{"product": "Sat","data1": 110},{"product": "Sun","data1": 130}]
}
6 编辑PieExt2目录下的index.ts的文件如下:
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'export const PieExt2: ConfigType = {key: 'PieExt2',chartKey: 'VPieExt2',conKey: 'VCPieExt2',title: '饼图扩展2',category: ChatCategoryEnum.OTHERCHART,categoryName: ChatCategoryEnumName.OTHERCHART,package: PackagesCategoryEnum.CHARTS,chartFrame: ChartFrameEnum.ECHARTS,image: 'PieExt2.png'
}
注意:
key: 'PieExt2',
chartKey: 'VPieExt2',
conKey: 'VCPieExt2',
这三个玩意有特定的命名规则,key要与前面新增的目录名PieExt2保持一致,chartKey要在PieExt2前面加V变成VPieExt2,conKey要在PieExt2前面加上VC变成VCPieExt2
接着把这个图

下载后,修改名称为PieExt2.png,并放到src\assets\images\chart\charts目录下:

7 编辑PieExt2目录下的index.vue的文件如下:
<template><v-chartref="vChartRef":init-options="initOptions":theme="themeColor":option="option":update-options="{replaceMerge: replaceMergeArr}"autoresize></v-chart>
</template><script setup lang="ts">
import { ref, nextTick, computed, watch, PropType } from 'vue'
import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { PieChart } from 'echarts/charts'
import { mergeTheme } from '@/packages/public/chart'
import config, { includes, seriesItem } from './config'
import { useChartDataFetch } from '@/hooks'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
import isObject from 'lodash/isObject'
import cloneDeep from 'lodash/cloneDeep'const props = defineProps({themeSetting: {type: Object,required: true},themeColor: {type: Object,required: true},chartConfig: {type: Object as PropType<config>,required: true}
})const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent])const replaceMergeArr = ref<string[]>()const option = computed(() => {return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
})// dataset 无法变更条数的补丁
watch(() => props.chartConfig.option.dataset,(newData: { dimensions: any }, oldData) => {try {if (!isObject(newData) || !('dimensions' in newData)) returnif (Array.isArray(newData?.dimensions)) {const seriesArr = []for (let i = 0; i < newData.dimensions.length - 1; i++) {seriesArr.push(cloneDeep(seriesItem))}//replaceMergeArr.value = ['series']// props.chartConfig.option.series = seriesArr// nextTick(() => {// replaceMergeArr.value = []// })}} catch (error) {console.log(error)}},{deep: false}
)const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => {props.chartConfig.option.dataset = newData
})
</script>
8 编辑\src\packages\components\Charts目录下的index.ts文件如下:

9 先运行C#后端程序(参考文章最前面给的链接),接着利用npm run dev运行go-view程序,最终效果如下:

完整代码可以如下链接获取:
张祥裕/分享的资源名称 - Gitee.com
下面讲解一下PieExt2目录下这5个文件config.ts、config.vue、data.json、index.ts、index.vue的功能:
config.ts文件
option和series是比较重要的,决定了控件的外观,如下图:

上面的option我是从这里抄来的,我对vue也是半吊子:
Examples - Apache ECharts

这里的资源Examples - Apache ECharts确实是多,option几乎都不用自己写,拿过来改改就能用了

拿过来后,要把带data部分删除:

换成 dataset: { ...dataJson },

然后根据需要修改series的内容
config.vue
要与config.ts结合来看,主要是能让控件在被拖拽出来后,能给人修改控件样式,如下图:

配置关系如下图:

data.json
配置控件的最初数据,后面可以通过界面上传json文件导入覆盖或者通过后端接口api动态获取覆盖:

index.ts
配置控件的名称,框架加载控件的路径,控件样式图片等配置


index.vue
控件样式布局及javascript逻辑控制:


这个watch函数是获取到接口数据或者导入json文件后,会自动执行该函数,我这里就没有动它(但在做堆叠柱状图的时候就修改了它),你看一下go-view自带的控件,index.vue的内容几乎一样,主要的功能是根据数据更新series的值,从而达到控制控件的目的
好了,本文到此结束,如果本文对你有帮助,资助2毛钱作为鼓励呗,穷逼一个,就当筹个网费吧

相关文章:
大屏开源项目go-view二次开发2----半环形控件(C#)
环境搭建参考: 大屏开源项目go-view二次开发1----环境搭建(C#)-CSDN博客 要做的半环形控件最终效果如下图: 步骤如下: 1 在go-view前端项目的\src\packages\components\Charts目录下新增Others目录,并在Others目录下新增PieExt…...
web:pc端企业微信登录-vue版
官方文档:developer.work.weixin.qq.com/document/pa… 不需要调用ww.register,直接调用ww.createWWLoginPanel即可创建企业微信登录面板 - 文档 - 企业微信开发者中心 (qq.com) 引入 //通过 npm 引入 npm install wecom/jssdk import * as ww from we…...
OpenGL ES 01 渲染一个四边形
项目架构 着色器封装 vertex #version 300 es // 接收顶点数据 layout (location 0) in vec3 aPos; // 位置变量的属性位置值为0 layout (location 1) in vec4 aColors; // 位置变量的属性位置值为1 out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl…...
【ETCD】【源码阅读】深入解析 EtcdServer.applyEntries方法
applyEntries方法的主要作用是接收待应用的 Raft 日志条目,并按顺序将其应用到系统中;确保条目的索引连续,避免丢失或重复应用条目。 一、函数完整代码 func (s *EtcdServer) applyEntries(ep *etcdProgress, apply *apply) {if len(apply.…...
概率论得学习和整理28:用EXCEL画折线图,X轴数据也被当成曲线的解决办法
目录 1 折线图和散点图,对数据的处理差别 1.1 EXCEL画图的一些默认设置 1.2 多于2列的数据,也是如此 2 如果我们非要以第1列数据为X轴,做一个折线图呢?也能 2.1 首先,把第1列,想当成X轴的数据…...
tryhackme-Pre Security-Defensive Security Intro(防御安全简介)
任务一:Introduction to Defensive Security防御安全简介 此room的两个要点: Preventing intrusions from occurring 防止入侵发生Detecting intrusions when they occur and responding properly 检测发生的入侵并正确响应 防御安全还有更多内容。 除上…...
27. 元类
一、什么是元类 在 Python 中,一切皆为对象,即类也是一个对象。type 是内置的元类。我们用 class 关键字定义的所有的类以及内置的类都是由元类 type(内置的元类) 实例化产生的。 class Person:def __init__(self, name, age):se…...
PHP木马编写
一、最简单的一句话木马 <?php eval($_REQUEST[cmd]); ?> 1. <?php 和 ?> <?php 和 ?> 是 PHP 代码的开始和结束标记,表示 PHP 代码块的范围。 2. eval() eval() 是 PHP 中的一个内建函数,用来执行字符串类型的 PHP 代码。…...
游戏AI实现-寻路算法(Dijkstra)
戴克斯特拉算法(英语:Dijkstras algorithm),又称迪杰斯特拉算法、Dijkstra算法,是由荷兰计算机科学家艾兹赫尔戴克斯特拉在1956年发现的算法。 算法过程: 1.首先设置开始节点的成本值为0,并将…...
Android OpenGLES2.0开发(九):图片滤镜
“当你改变想法的时候,记得也要改变你的世界。”——诺曼文森特皮尔 Android OpenGLES开发:EGL环境搭建Android OpenGLES2.0开发(一):艰难的开始Android OpenGLES2.0开发(二):环境搭…...
SQLite Update 语句
SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句,您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句,包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…...
Metaploit-永恒之蓝漏洞利用
1:Metaploit介绍 本次测试主要是利用永恒之蓝漏洞对windows7进行控制利用,掌握Metaploit工具的使用,知道永恒之蓝的漏洞利用原理。永恒之蓝是在Windows的SMB服务处理SMB v1请求时发生的漏洞,这个漏洞导致攻击者在目标系统上可…...
机器学习预处理-表格数据的空值处理
机器学习预处理-表格数据的空值处理 机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化,可视化能够帮助我们了解数据的构成和分布,是我们进行机器学习的必备步骤。上文中也提及,原始的数据存在部分的缺失࿰…...
数据结构_平衡二叉树
结点类 构造函数分为有参和无参,相同点都是初始化树高为1 class Node { public:int data; // 用于输出int val; // 数据域,用于排序int height; // 树高Node* left;Node* right;Node();Node(int v, int d);static int max(int a, int b); };Node::N…...
C++对象的赋值与复制复制构造函数(指针数据成员)
一、对象的赋值 同类对象之间可以相互赋值,对象赋值的一般形式:对象名2 对象名1; 原理是,赋值运算符的重载。仅赋值,因此赋值前,需要先定义并初始化对象2。 对象的赋值针对指对象中所有数据成员的值; 对…...
Coding Caprice - monotonic stack2
42. 接雨水 class Solution { public:int trap(vector<int>& height) {stack<int> sh;int out 0;for(int i0; i<height.size(); i){while(!sh.empty() && height[sh.top()]<height[i]){int bo height[sh.top()];sh.pop();if(sh.empty()){brea…...
Spring Mvc面试题(常见)
1 Spring MVC的执行流程 用户发起请求,请求先被Servlet拦截以后,转发给SpringMVC框架SpringMVC 里面的DispatcherServlet(核心控制器) 接收到请求,并转发给HandlerMappingHandlerMapping负责解析请求,根据请求信息和配置信息找到匹配的Controller类(当这里有配置拦截器,会…...
opencv # Sobel算子、Laplacian算子、Canny边缘检测、findContours、drawContours绘制轮廓、外接矩形
一、Sobel算子 案例图片 cv2.Sobel(src, ddepth, dx, dy, ksize3, scale1, delta0, borderTypeNone) 功能:用于计算图像梯度(gradient)的函数 参数: src: 输入图像,它应该是灰度图像。 ddepth: 输出图像的所需深度&am…...
Neo4j插入数据逐级提升速度4倍又4倍
语雀版:https://www.yuque.com/xw76/back/dtukgqfkfwg1d6yo 目录 背景介绍初始方案Node()创建事务批量提交记录Node是否存在生成Cypher语句执行数据库参数优化切换成85k个三元组测试建索引(很显著!!!)MATCH…...
C++特殊类设计(单例模式等)
目录 引言 1.请设计一个类,不能被拷贝 2. 请设计一个类,只能在堆上创建对象 为什么设置实例的方法为静态成员呢 3. 请设计一个类,只能在栈上创建对象 4. 请设计一个类,不能被继承 5. 请设计一个类,只能创建一个对…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
