Echarts-知识图谱
Echarts-知识图谱
demo地址
打开CodePen
效果
思路
1. 生成根节点
2. 根据子节点距离与根节点的角度关系,生成子节点坐标,进而生成子节点
3. 从子节点上按角度生成对应的子节点
4. 递归将根节点与每一层级子节点连线
核心代码
- 定义节点配置
function getNodeConfig() {return {/** 节点间距 */nodeLine: 120,/** 节点大小 */nodeSize: 100,/** 子节点间距 */subNodeLine: 40,/** 子节点大小 */subNodeSize: 60};
}
- 创建节点位置
function createNodePos({ index: i, len: iLen }) {const { nodeLine } = getNodeConfig();const radioDeg = (Math.PI * 2) / iLen;const deg = i * radioDeg + Math.PI / 4;const x = nodeLine * Math.cos(deg);const y = nodeLine * Math.sin(deg);const pos = { x, y };return pos;
}
- 创建子节点位置
function createSubNodePos({ index: i, len: iLen }, { index: j, len: jLen }) {const { nodeLine, subNodeLine } = getNodeConfig();const radioDeg = (Math.PI * 2) / iLen;const deg = i * radioDeg + Math.PI / 4;const parentX = nodeLine * Math.cos(deg);const parentY = nodeLine * Math.sin(deg);const subRadioDeg = (Math.PI * 2) / (jLen + 1);const subDeg = j * subRadioDeg + (Math.PI / 2) * 3 + deg;const x = parentX + subNodeLine * Math.cos(subDeg);const y = parentY + subNodeLine * Math.sin(subDeg);const pos = { x, y };return pos;
}
- 创建节点和链接
function initOption(root) {root.categoryItem = categories?.[root?.category] || {};const list = chartList || [];const graph = {...createNodesLinks(list, root),categories};const chartOption = {color: categories?.map((item) => item?.color),legend: [{orient: 'vertical',left: 0,data: graph.categories.map(function (a) {return a.name;})}],tooltip: {formatter: (params) => {return params?.data?.name;}},animationDuration: 1500,animationEasingUpdate: 'quinticInOut',series: [{type: 'graph',layout: 'none',force: {repulsion: 100},data: graph.nodes,links: graph.links,categories: graph.categories,roam: true,label: {show: true,width: 36,height: 36,overflow: 'breakAll',color: '#f2f2f2',formatter: (params) => {const { name = '', id } = params?.data || {};const len = id === rootId ? 20 : 10;return name?.length > len ? name?.slice(0, len) + '...' : name;}},lineStyle: {color: 'source',curveness: 0.3},emphasis: {focus: 'adjacency',disabled: true,lineStyle: {width: 10}}}]};option = chartOption;
}function createNodesLinks(list = [], root = {}) {const nodes = [];const links = [];const { nodeSize, subNodeSize } = getNodeConfig();nodes.push({id: rootId,category: 0,name: '根节点',...root,symbolSize: nodeSize,x: 0,y: 0});for (let i = 0; i < list.length; i++) {const iIndex = String(i);const categoryItem = categories?.[i];nodes.push({id: iIndex,category: i,symbolSize: 1,label: {show: false},name: categoryItem?.name,...createNodePos({ index: i, len: list.length })});links.push({source: rootId,target: iIndex});for (let j = 0; j < list[i].length; j++) {const jIndex = `${i}.${j}`;const jItem = _.get(list, jIndex, {});nodes.push({id: jIndex,category: i,symbolSize: subNodeSize,...jItem,...createSubNodePos({ index: i, len: list.length }, { index: j, len: list[i].length })});links.push({source: iIndex,target: jIndex});}}return { nodes, links };
};
- 初始化
function init() {const { id, name, key } = { id: '1', name: '青霉素', key: 'drug-research' }const category = categories?.findIndex((item) => item?.key === key);const categoryItem = categories?.[category];initOption({category,dataId: id,name,id: rootId})
}
完整代码
var dom = document.getElementById('chart-container');
var myChart = echarts.init(dom, null, {renderer: 'canvas',useDirtyRect: false
});
var app = {};var option;const categories = [{name: '药物',color: 'rgba(0, 136, 184, 1)',key: 'drug-research',enumKey: 'Drug',fieldKey: 'drug',idKey: 'drug_uid',nameKey: 'drug_name_cn',nameEnKey: 'drug_name_en'},{name: '靶点',color: 'rgba(7, 214, 205, 1)',key: 'target-spot',enumKey: 'Target',fieldKey: 'target',idKey: 'target_uid',nameKey: 'target_name'},{name: '适应症',color: 'rgba(236, 153, 41, 1)',key: 'indications',enumKey: 'Indication',fieldKey: 'indication',idKey: 'indication_uid',nameKey: 'indication_name'},{name: '企业',color: 'rgba(210, 142, 200, 1)',key: 'company',enumKey: 'Entity',fieldKey: 'entity',idKey: 'entity_uid',nameKey: 'entity_name'},{name: '药物设计技术',color: 'rgba(255, 192, 185, 1)',key: 'drug-tech',enumKey: 'Tech',fieldKey: 'tech',idKey: 'tech_name',nameKey: 'tech_name'}];const rootId = 'root';const serverMapData = {"drug": [{"drug_uid": "1","drug_name_cn": "药物1","drug_name_en": "药物en"},{"drug_uid": "2","drug_name_cn": "药物2","drug_name_en": "药物en"},{"drug_uid": "3","drug_name_cn": "药物3","drug_name_en": "药物en"},{"drug_uid": "4","drug_name_cn": "药物4","drug_name_en": "药物en"},{"drug_uid": "5","drug_name_cn": "药物5","drug_name_en": "药物en"},],"target": [{"target_uid": "1","target_name": "靶点1","target_code": ["string"]},{"target_uid": "2","target_name": "靶点2","target_code": ["string"]},{"target_uid": "3","target_name": "靶点3","target_code": ["string"]},{"target_uid": "4","target_name": "靶点4","target_code": ["string"]},{"target_uid": "5","target_name": "靶点5","target_code": ["string"]},],"indication": [{"indication_uid": "1","indication_name": "适应症1","indication_code": ["string"]},{"indication_uid": "2","indication_name": "适应症2","indication_code": ["string"]},{"indication_uid": "3","indication_name": "适应症3","indication_code": ["string"]},{"indication_uid": "4","indication_name": "适应症4","indication_code": ["string"]},{"indication_uid": "5","indication_name": "适应症5","indication_code": ["string"]},],"entity": [{"entity_uid": "1","entity_name": "企业1","entity_code": ["string"]},{"entity_uid": "2","entity_name": "企业2","entity_code": ["string"]},{"entity_uid": "3","entity_name": "企业3","entity_code": ["string"]},{"entity_uid": "4","entity_name": "企业4","entity_code": ["string"]},{"entity_uid": "5","entity_name": "企业5","entity_code": ["string"]},],"tech": [{"tech_name": "技术1"},{"tech_name": "技术2"},{"tech_name": "技术3"},{"tech_name": "技术4"},{"tech_name": "技术5"},]
}const chartList = categories?.map((categoryItem) => {const dataList = serverMapData?.[categoryItem?.fieldKey] || [];return dataList?.map((item) => {return {...item,categoryItem,dataId: item?.[categoryItem?.idKey],name: item?.[categoryItem?.nameKey] || item?.[categoryItem?.nameEnKey]};});
});init();function init() {const { id, name, key } = { id: '1', name: '青霉素', key: 'drug-research' }const category = categories?.findIndex((item) => item?.key === key);const categoryItem = categories?.[category];initOption({category,dataId: id,name,id: rootId})
}function initOption(root) {root.categoryItem = categories?.[root?.category] || {};const list = chartList || [];const graph = {...createNodesLinks(list, root),categories};const chartOption = {color: categories?.map((item) => item?.color),legend: [{orient: 'vertical',left: 0,data: graph.categories.map(function (a) {return a.name;})}],tooltip: {formatter: (params) => {return params?.data?.name;}},animationDuration: 1500,animationEasingUpdate: 'quinticInOut',series: [{type: 'graph',layout: 'none',force: {repulsion: 100},data: graph.nodes,links: graph.links,categories: graph.categories,roam: true,label: {show: true,width: 36,height: 36,overflow: 'breakAll',color: '#f2f2f2',formatter: (params) => {const { name = '', id } = params?.data || {};const len = id === rootId ? 20 : 10;return name?.length > len ? name?.slice(0, len) + '...' : name;}},lineStyle: {color: 'source',curveness: 0.3},emphasis: {focus: 'adjacency',disabled: true,lineStyle: {width: 10}}}]};console.log('chartOption', chartOption)option = chartOption;}function createNodesLinks(list = [], root = {}) {const nodes = [];const links = [];const { nodeSize, subNodeSize } = getNodeConfig();nodes.push({id: rootId,category: 0,name: '根节点',...root,symbolSize: nodeSize,x: 0,y: 0});for (let i = 0; i < list.length; i++) {const iIndex = String(i);const categoryItem = categories?.[i];nodes.push({id: iIndex,category: i,symbolSize: 1,label: {show: false},name: categoryItem?.name,...createNodePos({ index: i, len: list.length })});links.push({source: rootId,target: iIndex});for (let j = 0; j < list[i].length; j++) {const jIndex = `${i}.${j}`;const jItem = _.get(list, jIndex, {});nodes.push({id: jIndex,category: i,symbolSize: subNodeSize,...jItem,...createSubNodePos({ index: i, len: list.length }, { index: j, len: list[i].length })});links.push({source: iIndex,target: jIndex});}}return { nodes, links };};function getNodeConfig() {return {nodeLine: 120,nodeSize: 100,subNodeLine: 40,subNodeSize: 60};}function createNodePos({ index: i, len: iLen }) {const { nodeLine } = getNodeConfig();const radioDeg = (Math.PI * 2) / iLen;const deg = i * radioDeg + Math.PI / 4;const x = nodeLine * Math.cos(deg);const y = nodeLine * Math.sin(deg);const pos = { x, y };return pos;}function createSubNodePos({ index: i, len: iLen }, { index: j, len: jLen }) {const { nodeLine, subNodeLine } = getNodeConfig();const radioDeg = (Math.PI * 2) / iLen;const deg = i * radioDeg + Math.PI / 4;const parentX = nodeLine * Math.cos(deg);const parentY = nodeLine * Math.sin(deg);const subRadioDeg = (Math.PI * 2) / (jLen + 1);const subDeg = j * subRadioDeg + (Math.PI / 2) * 3 + deg;const x = parentX + subNodeLine * Math.cos(subDeg);const y = parentY + subNodeLine * Math.sin(subDeg);const pos = { x, y };return pos;}if (option && typeof option === 'object') {myChart.setOption(option);
}window.addEventListener('resize', myChart.resize);
相关文章:
Echarts-知识图谱
Echarts-知识图谱 demo地址 打开CodePen 效果 思路 1. 生成根节点 2. 根据子节点距离与根节点的角度关系,生成子节点坐标,进而生成子节点 3. 从子节点上按角度生成对应的子节点 4. 递归将根节点与每一层级子节点连线核心代码 定义节点配置 functio…...
Scala 05 —— 函数式编程底层逻辑
Scala 05 —— 函数式编程底层逻辑 该文章来自2023/1/14的清华大学交叉信息学院助理教授——袁洋演讲。 文章目录 Scala 05 —— 函数式编程底层逻辑函数式编程假如...副作用是必须的?函数的定义函数是数据的函数,不是数字的函数如何把业务逻辑做成纯函…...
在 Node.js 中配置代理 IP 采集文章
不说废话,直接上代码: const http require(http); const https require(https);// 之后可以使用 http 或 https 模块发起请求,它们将自动使用配置的代理 // 代理ip:https://www.kuaidaili.com/?refrg3jlsko0ymg const proxy …...
ESLlint重大更新后,使用旧版ESLint搭配Prettier的配置方式
概要 就在前几天,ESLint迎来了一次重大更新,9.0.0版本,根据官方文档介绍,使用新版的先决条件是Node.js版本必须是18.18.0、20.9.0,或者是>21.1.0的版本,新版ESLint将不再直接支持以下旧版配置(非扁平化…...
springcloud Ribbon的详解
1、Ribbon是什么 Ribbon是Netflix发布的开源项目,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的框架。 2、Ribbon能干什么 LB负载均衡(Load Balance)是什么?简单的说就是将用户的请求平摊的分配到多个服务上,从而达…...
超级好用的C++实用库之Des加解密
概述 DES(Data Encryption Standard,数据加密标准)是一种历史悠久的对称密钥加密算法,由IBM公司在1970年代设计,并于1977年被美国国家标准局选作联邦资料处理标准。DES使用56位密钥对64位的数据块进行操作,…...
关于MCU核心板的一些常见问题
BGA植球与焊接(多涂焊油): 【BGA芯片是真麻烦,主要是植锡珠太麻烦了,拆一次就得重新植】https://www.bilibili.com/video/BV1vW4y1w7oNvd_source3cc3c07b09206097d0d8b0aefdf07958 / NC电容一般有两种含义࿱…...
【C++杂货铺】多态
目录 🌈前言🌈 📁多态的概念 📁 多态的定义及实现 📂 多态的构成条件 📂 虚函数 📂 虚函数重写 📂 C11 override 和 final 📂 重载,覆盖(重写…...
(学习日记)2024.04.20:UCOSIII第四十八节:各文件功能概览
写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…...
数据结构-二叉树-堆(二)
一、建堆的时间复杂度问题 1、除了向上调整建堆,我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走,可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数…...
身份证二要素核验介绍及使用方法
一、身份证二要素核验简介及重要性 身份证二要素核验是一种重要的身份验证技术,它在现代社会中发挥着至关重要的作用,特别是在涉及个人信息安全和隐私保护的领域。通过身份证二要素核验,我们可以有效地确认个人身份的真实性,从而…...
探索 去中心化的Web3.0
随着区块链技术的日益成熟和普及,Web3(Web 3.0)已经成为一个无法忽视的趋势。Web3不仅仅是一个技术概念,更是一个去中心化、透明、用户数据拥有权归还给用户的互联网新时代。在这篇文章中,我们将深入探讨Web3技术的核心…...
递归的层序遍历
最近遇到一个业务需求:一颗依赖树,其实就是一颗递归树,如何一层一层的数据放在一起,可以近似理解为二叉树的层序遍历。 业务理解为递归树的层序遍历 代码示例: public class RecursionErgodic {public static void…...
pytest使用 pytest-rerunfailures 插件实现失败用例重跑功能
使用 pytest 进行测试时,你可以通过安装并配置 pytest-rerunfailures 插件来实现失败用例重跑功能。以下是一个示例说明: 假设你有一个测试文件 test_example.py 包含如下测试用例: import pytestpytest.mark.parametrize("num",…...
2024/4/23 C++day1
有以下定义,说明哪些量可以改变哪些不可以改变? const char *p; 指针可以改变 值不可以改变 const (char *) p; 语法错误 char *const p; 指针不可以改变 值可以改变 const char* const p; 指针和值…...
OpenHarmony鸿蒙南向开发案例:【智能窗户通风设备】
样例简介 本文档介绍了安全厨房案例中的相关智能窗户通风设备,本安全厨房案例利用轻量级软总线能力,将两块欧智通V200Z-R/BES2600开发板模拟的智能窗户通风设备和燃气告警设备组合成。当燃气数值告警时,无需其它操作,直接通知软总…...
解析‘找不到vcruntime140.dll,无法继续执行代码’的异常修复方法
找不到vcruntime140.dll,无法继续执行代码?这是小事情,这个情况主要是vcruntime140.dll文件丢失了,导致一些程序没办法正常的运行,我们只要修复好这个vcruntime140.dll,文件就可以了。下面一起来了解一下。 一.找不到vcruntime140…...
Golang对接Ldap(保姆级教程:概念搭建实战)
Golang对接Ldap(保姆级教程:概念&搭建&实战) 最近项目需要对接客户的LDAP服务,于是趁机好好了解了一下。LDAP实际是一个协议,对应的实现,大家可以理解为一个轻量级数据库。用户查询。比如ÿ…...
Java23种设计模式-创建型模式之工厂方法模式
工厂方法模式(Factory Method Pattern) 一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定将哪一个类实例化,从而将产品的实例化推迟到子类中。这种模式的主要角色包括: 角色1:抽…...
Oracle故障处理:ORA-00600错误处理思路
提前说明: 该故障,我只是旁观者。 但处理该故障的DBA工程师,思路很清晰,我非常受教!在此也将经验分享。 目录 项目场景 问题分析 优化建议 项目场景 在某项目数据库运维群,有现场同事发了张报错截图如下…...
微信小程序使用 Vant Weapp 中 Collapse 折叠面板 的问题!
需求:结合Tab 标签页 和 Collapse 折叠面板 组合成显示课本和章节内容,并且用户体验要好点! 如下图展示: 问题:如何使用Collapse 折叠面板 将内容循环展示出来? js中的数据是这样的 代码实现࿱…...
论文写作神器:用ChatGPT写论文的5大高效技巧
在人工智能日渐成熟的今天,ChatGPT已经成为学术界、业界乃至日常生活中不可或缺的工具之一。尤其是对于学生和研究人员而言,ChatGPT能大幅度提高论文写作的效率和质量。然而,许多人尚未掌握如何高效利用这一工具,很多人用chatgpt写…...
微信小程序展示倒计时
html <view class"countdown"> <text>倒计时:</text> <text wx:for"{{countdown}}" wx:key"index">{{item}}</text> </view> ts data: {countdown: [], // 存放倒计时数组 targetTime:…...
什么是用户体验(UX)文案,为什么它很重要?
网上购物如今比以往任何时候都更加相关。所以我们将以此为例说明什么是用户体验(UX)文案,以及为什么它很重要。 假设你去了一个在线商店。你需要执行一系列操作: 找到合适的部分选择你感兴趣的产品弄清楚它们是什么,…...
算法06链表
算法06链表 一、链表概述1.1概述1.2链表的组成部分:1.3链表的优缺点: 二、链表典例力扣707.设计链表难点分析:(1)MyLinkedList成员变量的确定:(2)初始化自定义链表:&…...
第十七章 数据管理和组织变革管理
17.2 变革法则 1)组织不变革,人就变。 2)人们不会抗拒变革,但抵制被改变。 3)事情之所以存在是惯性所致。 4)除非有人推动变革,否则很可能止步不前。 5)如果不考虑人的因素…...
基于harris角点和RANSAC算法的图像拼接matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ....................................................................... I1_harris fu…...
C++感受6-Hello World 交互版
变量、常量输入、输出、流getline() 函数读入整行输入Hello() 函数复习新定义函数 Input() 实现友好的人机交互还有 “痘痘” 为什么挤不到的分析…… 1. DRY 原则简介 上一节课,我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多,每一次问…...
02_c/c++开源库ZeroMQ
1.安装 C库 libzmq sudo apt install libzmq3-dev 实例: https://zeromq.org/get-started/?languagec&librarylibzmq# 编译依赖: pkg-config --cflags --libs libzmq or cat /usr/lib/x86_64-linux-gnu/pkgconfig/libzmq.pc -isystem /usr/include/mit-krb5 -I/usr/in…...
计算机视觉 CV 八股分享 [自用](更新中......)
目录 一、深度学习中解决过拟合方法 二、深度学习中解决欠拟合方法 三、梯度消失和梯度爆炸 解决梯度消失的方法 解决梯度爆炸的方法 四、神经网络权重初始化方法 五、梯度下降法 六、BatchNorm 七、归一化方法 八、卷积 九、池化 十、激活函数 十一、预训练 十二…...
【MHA】MySQL高可用MHA源码1-主库故障监控
1 阅读之前的准备工作 1 一个IDE工具 ,博主自己尝试了vscode安装perl的插件,但是函数 、变量 、模块等都不能跳转,阅读起来不是很方便。后来尝试使用了pycharm安装perl插件,阅读支持跳转,自己也能写一些简单的测试样例…...
如何一键清除文件目录下所有的node_modules
如何一键清除文件目录下所有的node_modules 快速删除目录下的node_modules,下面附上windows和mac的脚本指令 windows脚本 FOR /d /r . %d in (node_modules) DO IF EXIST "%d" rm -rf "%d"mac脚本 find . -name "node_modules" -…...
【产品经理修炼之道】- 导航架构设计
目录 一、导航是什么 二、导航的作用 三、导航的分类 四、导航菜单的广度与深度 五、导航的颜色 六、导航的形态 七、导航的研究 八、导航的设计 九、导航改版案例分享 总结 每个网页的设计都需要包括导航,那么导航架构该如何设计?作者结合之前…...
本地部署和运行大型语言模型(Large Language Models, LLMs)的工具Ollama
文章目录 本地部署和运行大型语言模型(Large Language Models, LLMs)的工具Ollama背景什么是Ollama主要功能优势 使用场景Ollama LangChain 实现本地运行Llama 3 本地部署和运行大型语言模型(Large Language Models, LLMs)的工具…...
Python-100-Days: Day01
Day01 Python简介 1.1989年Guido von Rossum在圣诞节之夜开始着手python语言编译器的编写。 2.1991年2月 Python v1 编译器诞生,使用C实现的,此时可以调用C的库函数。 3.1994年1月,Python v1.0 正式版发布。 4.2000年10月16日࿰…...
g 对象:Flask 应用中的“临时口袋”
文章目录 g对象的理解Flask 中的 g 对象g 对象的特点:使用 g 对象: 示例 g对象的理解 想象一下,你在逛超市。你需要一个购物篮来装你挑选的商品。这个购物篮就像 Flask 应用中的 g 对象,它是一个临时存放东西的地方,方便你在购物过程中随时取…...
JavaEE初阶——多线程(七)——定时器
T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程的第七篇文章——关于定时器 如果有不足的或者错误的请您指出! 目录 4.定时器4.1标准库提供的定时器4.2自己实现一个定时器4.2.1任务类4.2.2Timer类4.2.3 有一个线程来负…...
嵌入式4-24
作业: 整理思维导图 定义一个矩形类Rec,包含私有属性length,width,有以下成员函数: void set_length(int l); //设置长度 void set_width(int w); //设置宽度 int get_length(); //获取长度 int get_width(); //获取宽…...
跟我学C++中级篇——临时对象
一、临时对象 Temporary object,临时对象。一听名字就明白,这个对象的意义不大,只是临时中转一下或者存在一下,有的可能连个存在感都刷不到就消失了。但不要小看这种临时对象,对C/C这种以效率严苛为前提的编程环境下&…...
【S32K3 MCAL配置】-7.1-GPT Driver:定时器中断-创建一个周期执行的任务
"><--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景:常用于周期点亮/关闭一个LED灯;或者精度一般的占空比为50% PWM方波;或者周期调用一个函数,在该函数中我们可以执行一些软件策略(简易的OS)。 目录(共15页精讲,基于评估板: NXP S32K312EVB-Q172,…...
java可盈保险合同管理系统的设计与实现(springboot+mysql源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的可盈保险合同管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于Spring Boot的…...
【智能算法】囊状虫群算法(TSA)原理及实现
目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年,S Kaur等人受到囊状虫群自然行为启发,提出了囊状虫群算法(Tunicate Swarm Algorithm, TSA)。 2.算法原理 2.1算法思想 TSA模拟了囊状虫群在导…...
python基础——正则表达式
📝前言: 这篇文章主要想讲解一下python中的正则表达式: 1,什么是正则表达式 2,re模块三匹配 3,元字符匹配 4,具体示例 🎬个人简介:努力学习ing 📋个人专栏&am…...
T1级,生产环境事故—Shell脚本一键备份K8s的YAML文件
大家好,我叫秋意零。 最近对公司进行日常运维工作时,出现了一个 T1 级别事故。导致公司的“酒云网”APP的无法使用。我和我领导一起搞了一个多小时,业务也停了一个多小时。 起因是:我的部门直系领导,叫我**删除一个 …...
C语言程序设计:预处理命令
预处理命令 基础知识 预处理命令简介 C语言的预处理命令是指编译之前由预处理器执行的指令,用于在源代码中进行一些预处理操作。 常见预处理命令 (1) #define 定义一个宏,用于替换源代码中的标识符为指定的文本。 #define MAX_NUM 100 int arr[MAX_NU…...
C++ 中的 struct 和 Class
通常struct用于表示一组相关的数据,而Class用于表示一个封装了数据和操作的对象。如果只是用于来组织一些数据,而不涉及复杂的封装和继承关系,则struct更为直观;如果需要封装、继承等面向对象编程的特性,可以选择使用C…...
基于Qt的二维码生成与识别
基于Qt的二维码生成与识别 一、获取QZxing开源库 1.通过封装的QZxing开源库生成和识别二维码,下载地址:GitCode - 开发者的代码家园https://gitcode.com/mirrors/ftylitak/qzxing/tree/master。 2.下载解压后,使用Qt Creator xx࿰…...
docker 基本命令
目录 一、docker 镜像操作命令 1.1.查询软件镜像 1.2.docker pull:下载镜像 1.3.docker push:上传镜像 1.4.docker images:查看本地镜像 1.5.docker inspect :获取镜像详细信息 1.6.docker tag:添加镜像标签 …...
h5键盘弹出收起时引起的页面变化
h5键盘弹出收起时引起的页面变化 键盘弹出时会导致窗口发生变化,置于底部的操作项会被顶上来,所以在键盘弹出的时候处理一下页面节点 通过监听页面窗口大小变化判断键盘状态键盘弹出时隐藏底部操作项在页面加载完成时执行即可 export function keyboa…...
Redis入门到实战教程(基础篇)笔记
教学来源: Redis课程介绍导学_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1cr4y1671t?p1一、Redis 入门 1.认识NoSQL 2.Redis在虚拟机中的安装和开机自启 Redis在虚拟机中安装和配置开机自启-CSDN博客https://blog.csdn.net/qq_69183322/article/deta…...
邮件API接口的优势有哪些?如何有效整合?
邮件API怎么选?SendCloud与AokSend的性能对比分析? 邮件API接口作为企业与用户沟通的重要桥梁,其重要性不言而喻。Aok将深入探讨邮件API接口的优势、有效整合的方法、选择标准以及SendCloud与AokSend两款邮件发送服务的性能对比分析。 邮件…...
ES6之数值的扩展
1. 数值的扩展 1.1. 二进制和八进制字面量表示:1.2. 数值判断方法: 1.2.1. Number.isFinite() 检查一个值是否为有限的数值。1.2.2. Number.isNaN() 更准确地检测NaN值。1.2.3. 传统的全局方法 isFinite() 和 isNaN() 的区别 1.3. 数值转换方法:1.4. 整数检查与精度: 1.4.1. Nu…...
Java练习题(二)
6、在异常处理中,如释放资源,关闭数据库、关闭文件应由(C )语 句来完成。 A.try子句 B.catch子句 C.finally子句 D.throw子句 finally子句一般是用来清理这些资源的 7、以下代码段执行后的输出结果为…...
Flutter 中的 VerticalDivider 小部件:全面指南
Flutter 中的 VerticalDivider 小部件:全面指南 在 Flutter 的世界中,VerticalDivider 是一种用于在垂直布局中提供视觉分隔的小部件。它可以在列表、卡片、行或其他布局元素之间添加一条垂直的分隔线。本文将详细介绍 VerticalDivider 的用途、属性、使…...
最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin
先看链接:原文链接 参照原文链接生成的文件(下面是我放的位置) mvn指令 mvn install:install-file -DfileD:\mavenrepository/maven-shade.jar -DgroupIdcom.wj -DartifactIdmaven-shade -Dversion1.1 -Dpackagingjar如果配置了maven_home 和java_home可以任意打开cmd执行(…...
前端面试题日常练-day04 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末。 1. 下列哪个 CSS 单位可以根据用户的首选字体大小进行调整? A) pxB) emC) remD) vw2. HTML5 中的<video>元素用于什么? A) 播放音频文件B) 嵌入外部网页内容C) 显示图…...
js积累一(ipv4正则校验+弹窗方式)
1. ipv4地址,点分十进制的校验 var regexIP /^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$/; if(strRegex.test(ip)) //true: 通过 2. 三种弹窗方式: alert();confirm(); prompt() 1&a…...
Linux(七) 动静态库
目录 一、动静态库的概念 二、静态库的打包与使用 2.1 静态库的打包 2.2 静态库的使用 三、动态库的打包与使用 3.1 动态库的打包 3.2 动态库的使用 3.3 运行动态库的四种方法 四、总makefile 一、动静态库的概念 静态库: Linux下,以.a为后缀的…...
如何对接 CommBank 的 EMV 3D Secure (3DS) 流程
如何对接 CommBank 的 EMV 3D Secure (3DS) 流程 在现代电子商务中,确保支付过程的安全性和合规性至关重要。本文将详细介绍如何对接 CommBank 的 EMV 3D Secure (3DS) 流程,以提升交易的安全性并确保符合 PCI 标准。 步骤 1:创建支付表单 …...
Pikachu 靶场敏感信息泄露通关解析
前言 Pikachu靶场是一种常见的网络安全训练平台,用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境,供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术,…...
Java | Leetcode Java题解之第91题解码方法
题目: 题解: class Solution {public int numDecodings(String s) {int n s.length();// a f[i-2], b f[i-1], cf[i]int a 0, b 1, c 0;for (int i 1; i < n; i) {c 0;if (s.charAt(i - 1) ! 0) {c b;}if (i > 1 && s.charAt(i …...
【JavaEE】Servlet
文章目录 一、Servlet 是什么二、如何创建Servlet程序1、创建项目2、引入依赖3、创建目录4、编写代码5、打包程序6、部署程序7、验证程序 一、Servlet 是什么 二、如何创建Servlet程序 1、创建项目 2、引入依赖 Maven 项目创建完后,会自动生成一个 pom.xml 的文…...