【能源节约管理系统行业树组件优化总结】
能源节约管理系统行业树组件优化总结
问题背景
在能源节约管理系统中,我们需要一个行业选择组件,以树形结构展示国民经济行业分类数据。由于行业数据量大且层级多,我们采用了懒加载的方式实现。然而,在编辑和详情模式下,需要根据已保存的行业代码(如B0913)正确回显选中的行业。这带来了几个挑战:
- 数据回显问题:如何基于单一行业代码(如B0913)预加载并展示完整的层级路径
- 代码冗余:相关逻辑都写在单个组件中,导致代码臃肿
- 可维护性:逻辑与UI耦合度高,不利于后期维护
解决方案
我们将行业树相关的方法从业务组件(add-modal.vue)中抽取出来,放入工具类(utils.ts)中,实现了逻辑与视图的分离。
关键方法设计与实现
1. 初始化行业树 (initIndustryTree)
该方法负责初始化行业树的第一级数据,并根据当前状态决定是否需要预加载节点。
// 工具类中的实现
export const initIndustryTree = async (selectedIndustryCode?: string,isPreloading = false,viewTypeStr = ''
) => {try {// 如果有选中的行业code,优先尝试预加载节点if (selectedIndustryCode &&typeof selectedIndustryCode === 'string' &&(viewTypeStr === 'EDIT' || viewTypeStr === 'DETAIL')) {if (!isPreloading) {console.log('通过预加载方式初始化行业树');// 预加载节点并返回结果return await loadIndustryNodesByCode(selectedIndustryCode);}}// 如果没有选中的行业或预加载失败,则加载第一级节点const firstLevelNodes = await loadIndustryData();return firstLevelNodes;} catch (error) {console.error('初始化行业树失败', error);return [];}
};// 组件中的调用
const initIndustryTree = async () => {try {const selectedIndustryCode = formData.value.industry; // 获取当前选中的行业codeconst result = await initIndustryTreeUtil(selectedIndustryCode,isPreloadingIndustry.value,props.type.toString() // 将枚举转换为字符串);// 如果返回的是数组,说明是初始化第一级节点的结果if (Array.isArray(result)) {industryTreeData.value = result;} else if (result && typeof result === 'object') {// 如果返回的是对象,说明是预加载节点的结果const { industryTreeData: treeData, expandedKeys: keys, industryValue } = result;if (treeData && treeData.length > 0) {industryTreeData.value = treeData;}if (keys && keys.length > 0) {expandedKeys.value = keys;}if (industryValue) {formData.value.industry = industryValue;}}} catch (error) {console.error('初始化行业树失败', error);industryTreeData.value = [];}
};
2. 加载行业树节点 (loadIndustryNode)
该方法是树组件懒加载的核心,根据当前节点层级加载子节点。
// 工具类中的实现
export const handleLoadIndustryNode = async (node: any,resolve: (data: any[]) => void,selectedIndustryCode?: string
) => {if (node.level === 0) {// 加载根节点的子节点(第一级)const data = await loadIndustryData();resolve(data);} else {// 根据节点层级加载不同级别的子节点const params: any = {category: node.data.category || node.data.code};if (node.level >= 1) {// 二级及以上添加二级分类参数params.secondCategory = node.data.secondCategory;}if (node.level >= 2) {// 三级及以上添加三级分类参数params.thirdCategory = node.data.thirdCategory;}try {const res = await Api.industryGbList(params);// 处理返回的数据,添加必要的属性const childNodes = res.map((item: any) => ({...item,name: item.name || item.fieldName || item.categoryName || '未命名',code: item.code || item.id || item.categoryCode || '',isLeaf: node.level >= 3 // 四级节点是叶子节点}));resolve(childNodes);} catch (error) {console.error('加载行业节点失败', error);resolve([]);}}
};// 组件中的调用
const loadIndustryNode = (node: any, resolve: (data: any[]) => void) => {loadIndustryNodeUtil(node, resolve, formData.value.industry);
};
3. 根据行业代码预加载节点路径 (loadIndustryNodesByCode)
这是解决回显问题的核心方法,通过解析行业代码,逐层加载节点并构建完整路径。
// 工具类中的实现
export const loadIndustryNodesByCode = async (industryCode: string) => {if (!industryCode) {return { industryTreeData: [], expandedKeys: [], industryValue: '' };}try {console.log('开始预加载行业节点,行业代码:', industryCode);// 提取行业代码的各部分,例如:B0913 => 一级: B, 二级: 09, 三级: 091, 四级: 0913const firstLevel = industryCode.charAt(0); // 第一个字符,如 Blet secondLevel = '';let thirdLevel = '';let fourthLevel = '';if (industryCode.length >= 3) {secondLevel = industryCode.substring(1, 3); // 第2-3个字符,如 09}if (industryCode.length >= 4) {thirdLevel = industryCode.substring(1, 4); // 第2-4个字符,如 091}if (industryCode.length >= 5) {fourthLevel = industryCode.substring(1); // 第2个字符到末尾,如 0913}console.log('分解的行业代码:', {一级: firstLevel,二级: secondLevel,三级: thirdLevel,四级: fourthLevel});// 记录需要展开的节点keysconst expandedKeys: string[] = [];let selectedNode = null;let finalIndustryValue = industryCode;// 加载一级节点const firstLevelNodes = await loadIndustryData();// 查找一级节点const firstLevelNode = firstLevelNodes.find((node) => node.code === firstLevel || node.category === firstLevel);if (!firstLevelNode) {console.error('找不到一级节点:', firstLevel);return { industryTreeData: firstLevelNodes, expandedKeys, industryValue: industryCode };}expandedKeys.push(firstLevelNode.code);selectedNode = firstLevelNode;// 如果没有二级代码,一级节点就是目标if (!secondLevel) {return {industryTreeData: firstLevelNodes,expandedKeys,industryValue: firstLevelNode.code};}// 加载二级节点const params1 = { category: firstLevelNode.category || firstLevelNode.code };const secondLevelRes = await Api.industryGbList(params1);const secondLevelNodes = secondLevelRes.map((item: any) => ({...item,name: item.name || item.fieldName || item.categoryName || '未命名',code: item.code || item.id || item.categoryCode || '',isLeaf: false}));// 将二级节点添加到一级节点下firstLevelNode.children = secondLevelNodes;// 查找二级节点const targetSecondLevelNode = secondLevelNodes.find((node) =>node.secondCategory === secondLevel || (node.code && node.code.endsWith(secondLevel)));if (!targetSecondLevelNode) {console.error('找不到二级节点:', secondLevel);return {industryTreeData: firstLevelNodes,expandedKeys,industryValue: selectedNode.code};}expandedKeys.push(targetSecondLevelNode.code);selectedNode = targetSecondLevelNode;// 如果没有三级代码,二级节点就是目标if (!thirdLevel) {return {industryTreeData: firstLevelNodes,expandedKeys,industryValue: targetSecondLevelNode.code};}// 加载三级节点const params2 = {category: targetSecondLevelNode.category,secondCategory: targetSecondLevelNode.secondCategory};const thirdLevelRes = await Api.industryGbList(params2);const thirdLevelNodes = thirdLevelRes.map((item: any) => ({...item,name: item.name || item.fieldName || item.categoryName || '未命名',code: item.code || item.id || item.categoryCode || '',isLeaf: false}));// 将三级节点添加到二级节点下targetSecondLevelNode.children = thirdLevelNodes;// 查找三级节点const targetThirdLevelNode = thirdLevelNodes.find((node) => node.thirdCategory === thirdLevel || (node.code && node.code.endsWith(thirdLevel)));if (!targetThirdLevelNode) {console.error('找不到三级节点:', thirdLevel);return {industryTreeData: firstLevelNodes,expandedKeys,industryValue: selectedNode.code};}expandedKeys.push(targetThirdLevelNode.code);selectedNode = targetThirdLevelNode;// 如果没有四级代码,三级节点就是目标if (!fourthLevel) {return {industryTreeData: firstLevelNodes,expandedKeys,industryValue: targetThirdLevelNode.code};}// 加载四级节点const params3 = {category: targetThirdLevelNode.category,secondCategory: targetThirdLevelNode.secondCategory,thirdCategory: targetThirdLevelNode.thirdCategory};const fourthLevelRes = await Api.industryGbList(params3);const fourthLevelNodes = fourthLevelRes.map((item: any) => ({...item,name: item.name || item.fieldName || item.categoryName || '未命名',code: item.code || item.id || item.categoryCode || '',isLeaf: true}));// 将四级节点添加到三级节点下targetThirdLevelNode.children = fourthLevelNodes;// 查找四级节点const targetFourthLevelNode = fourthLevelNodes.find((node) =>node.fourthCategory === fourthLevel ||(node.code && node.code.endsWith(fourthLevel)) ||node.code === industryCode);if (!targetFourthLevelNode) {console.error('找不到四级节点:', fourthLevel);return {industryTreeData: firstLevelNodes,expandedKeys,industryValue: selectedNode.code};}expandedKeys.push(targetFourthLevelNode.code);selectedNode = targetFourthLevelNode;finalIndustryValue = targetFourthLevelNode.code;return {industryTreeData: firstLevelNodes,expandedKeys,industryValue: finalIndustryValue};} catch (error) {console.error('预加载行业节点失败:', error);// 发生错误时返回空结果return { industryTreeData: [], expandedKeys: [], industryValue: industryCode };}
};// 组件中的调用
const loadIndustryNodesByCode = async (industryCode: string) => {if (!industryCode || isPreloadingIndustry.value) return;try {isPreloadingIndustry.value = true;console.log('开始预加载行业节点,行业代码:', industryCode);// 清空树数据,确保重新加载industryTreeData.value = [];// 清空已展开的节点列表expandedKeys.value = [];// 调用工具方法预加载节点const result = await loadIndustryNodesByCodeUtil(industryCode);// 更新树数据if (result.industryTreeData && result.industryTreeData.length > 0) {industryTreeData.value = result.industryTreeData;}// 更新展开的节点if (result.expandedKeys && result.expandedKeys.length > 0) {expandedKeys.value = result.expandedKeys;}// 更新选中的行业值if (result.industryValue) {formData.value.industry = result.industryValue;}} catch (error) {console.error('预加载行业节点失败:', error);// 确保即使失败,也设置行业代码formData.value.industry = industryCode;} finally {isPreloadingIndustry.value = false;}
};
4. 处理树选择器可见性变化 (handleTreeVisibleChange)
控制树选择器显示/隐藏时的行为,确保数据正确加载。
// 工具类中的实现
export const handleTreeVisibleChange = (visible: boolean,industryTreeData: any[]
): boolean => {return visible && (!industryTreeData || industryTreeData.length === 0);
};// 组件中的调用
const handleTreeVisibleChange = (visible: boolean) => {if (visible && (!industryTreeData.value || industryTreeData.value.length === 0)) {// 初始化树数据initIndustryTree();}
};
组件的应用
在业务组件中,我们这样使用行业树:
<template><!-- 行业树形选择器 --><el-tree-selectv-if="item.type === 'tree-select' && item.prop === 'industry'":placeholder="item.rules[0].message"v-model="formData[item.prop]":data="industryTreeData":props="industryTreeProps":load="loadIndustryNode"lazynode-key="code"check-strictlyvalue-key="code"filterableclearable:default-expanded-keys="expandedKeys":render-after-expand="false"@visible-change="handleTreeVisibleChange"@change="handleIndustryChange"@node-click="handleIndustryNodeClick"></el-tree-select>
</template><script setup>
// 业务组件中引入工具方法
import {industryTreeProps,handleLoadIndustryNode,loadIndustryData,formatSubmitData,mapOptionValue,initIndustryTree as initIndustryTreeUtil,loadIndustryNode as loadIndustryNodeUtil,loadIndustryNodesByCode as loadIndustryNodesByCodeUtil,handleTreeVisibleChange as handleTreeVisibleChangeUtil
} from './utils';// 声明必要的响应式数据
const industryTreeData = ref<any[]>([]);
const industrySelectedNode = ref<any>(null);
const isPreloadingIndustry = ref(false);
const expandedKeys = ref<string[]>([]);// 核心方法实现
const initIndustryTree = async () => {try {const selectedIndustryCode = formData.value.industry;const result = await initIndustryTreeUtil(selectedIndustryCode,isPreloadingIndustry.value,props.type.toString());// 处理返回结果,更新UI状态if (Array.isArray(result)) {industryTreeData.value = result;} else if (result && typeof result === 'object') {const { industryTreeData: treeData, expandedKeys: keys, industryValue } = result;if (treeData && treeData.length > 0) {industryTreeData.value = treeData;}if (keys && keys.length > 0) {expandedKeys.value = keys;}if (industryValue) {formData.value.industry = industryValue;}}} catch (error) {console.error('初始化行业树失败', error);industryTreeData.value = [];}
};// 其他方法实现...// 组件挂载时初始化
onMounted(() => {initIndustryTree();getDetail(); // 获取详情数据
});
</script>
解决的痛点
- 代码模块化:将行业树相关逻辑抽离为独立方法,提高代码可读性
- 功能解耦:UI层与业务逻辑分离,降低了维护成本
- 数据回显问题:通过行业代码解析和预加载机制,解决了树选择器的回显问题
- 代码复用:工具方法可在其他需要行业选择的组件中复用
- 错误处理优化:统一处理各种异常情况,提高了组件的稳定性
业务流程优化
优化后的行业树组件处理流程更加清晰:
总结
通过这次优化,我们不仅解决了行业树组件的回显问题,还提高了代码的可维护性和复用性。将业务逻辑与UI展示分离的设计思路值得在系统其他部分推广应用。未来,我们可以进一步考虑将行业树封装为完全独立的通用组件,以满足系统内多处对行业选择的需求。
相关文章:
【能源节约管理系统行业树组件优化总结】
能源节约管理系统行业树组件优化总结 问题背景 在能源节约管理系统中,我们需要一个行业选择组件,以树形结构展示国民经济行业分类数据。由于行业数据量大且层级多,我们采用了懒加载的方式实现。然而,在编辑和详情模式下…...
青少年编程考试 CCF GESP图形化编程 二级认证真题 2025年3月
图形化编程 二级 2025 年 03 月 一、单选题(共 10 题,每题 3 分,共 30 分) 1、2025 年春节有两件轰动全球的事件,一个是 DeepSeek 横空出世,另一个是贺岁片《哪吒 2》票房惊人,入了全球票房榜…...
【Hadoop入门】Hadoop生态之Flume简介
1 什么是Flume? Flume是Hadoop生态系统中的一个高可靠、高性能的日志收集、聚合和传输系统。它支持在系统中定制各类数据发送方(Source)、接收方(Sink)和数据收集器(Channel),从而能…...
十六、Linus网络编程基础
1、Linux 网络的历史发展 早期阶段(1991–1995) 1991年:Linus Torvalds 发布 Linux 内核的初始版本(0.01),此时内核不支持网络功能,仅是一个单机操作系统。1992年:受 BSD …...
【激活函数:神经网络的“调味料】
1. 激活函数:神经网络的“调味料” 想象你在做菜: 没有激活函数:就像只用水煮食材,味道单调(只能拟合线性关系)。加入激活函数:像加了盐、糖、辣椒,让菜有酸甜苦辣(非线…...
006.Gitlab CICD流水线触发
文章目录 触发方式介绍触发方式类型 触发方式实践分支名触发MR触发tag触发手动人为触发定时任务触发指定文件变更触发结合分支及文件变更触发正则语法触发 触发方式介绍 触发方式类型 Gitlab CICD流水线的触发方式非常灵活,常见的有如下几类触发方式: …...
服务器远程端口详解
服务器远程端口详解 一、服务器远程端口的概念与作用 1. 端口的基本定义 服务器远程端口是计算机网络中用于标识不同应用程序或服务的逻辑接口。通过TCP/IP协议栈的"Socket"机制,计算机可以通过软件方式与其他设备建立通信通道。每个端口对应一个16位无…...
如何在 Vue 3 中实现百度地图位置选择器组件
如何在 Vue 3 中实现百度地图位置选择器组件 前言 在开发前端应用时,地图选择器是一个非常常见的需求。尤其是在一些需要用户选择地址的场景,如电商平台、旅游网站、酒店预定等,百度地图组件能提供准确的地理位置服务。在本文中,…...
es6学习02-let命令和const命令
一、let命令 1.let块级作用域: let关键字 VS var关键字 2.for循环计数器很适合let命令 var:整个for循环中一直都是同一个i在做1,最后输出的就是10; let:每循环一次都是多一个i的赋值,最后输出是可以调出…...
电路方案分析(二十)TPS63xxx系列DC/DC电源EMI PCB设计方案
tips:资料来自网络,仅供学习使用。[TOC](TPS63xxx系列DC/DC电源EMI PCB设计方案) 1.概述 通过TPS63xxx系列DC/DC电源模块来分析降低直流/直流降压/升压转换器辐射 EMI 的来源以及相关PCB设计。 下面都以最常用的TPS63070为例说明: 典型应用…...
DeepSeek大语言模型部署指南:从基础认知到本地实现
目录 一、DeepSeek简介:开源领域的新兴力量 1.1 公司背景与发展历程 1.2 核心产品DeepSeek-R1的技术特点 1.3 行业影响与伦理挑战 二、官方资源获取:全面掌握DeepSeek生态 2.1 官方网站与API服务 2.2 开源代码库资源 2.3 模型部署工具Ollama简介…...
09-设计模式 企业场景 面试题-mk
你之前项目中用过设计模式吗? 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。具体类图设计如下: 上面的对象都是ne…...
达梦数据库-学习-18-ODBC数据源配置(Linux)
一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存4G逻辑核数2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…...
解决VS2022中scanf报错C4996
这个的原因是因为新版的VS认为scanf不安全,要去使用scanf_s,但在C语言中就需要scanf,所以我们只要以以下步骤解决就可以了。 只要加入宏定义即可 #define _CRT_SECURE_NO_WARNINGS 因为本人已经很少写小案例了,所以就用这个办法…...
Python(11)Python判断语句全面解析:从基础到高级模式匹配
目录 一、条件逻辑的工程价值1.1 真实项目中的逻辑判断1.2 判断语句类型矩阵 二、基础判断深度解析2.1 多条件联合判断2.2 类型安全判断 三、模式匹配进阶应用3.1 结构化数据匹配3.2 对象模式匹配 四、判断语句优化策略4.1 逻辑表达式优化4.2 性能对比测试 五、典型应用场景实战…...
Quartus II的IP核调用及仿真测试
目录 第一章 什么是IP核?第二章 什么是LPM?第一节 设置LPM_COUNTER模块参数第二节 仿真 第三章 什么是PLL?第一节 设置ALTPLL(嵌入式锁相环)模块参数第二节 仿真 第四章 什么是RAM?第一节 RAM_1PORT的调用第…...
如何修改服务器TTL值
Windows默认返回的TTL值为128,Linux为64,我们怎么修改这个值呢? 目录 一. Windows 二. Linux 临时更改 永久更改 一. Windows WinR输入regedit,打开注册表 路径:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro…...
大模型LLM表格报表分析:markitdown文件转markdown,大模型markdown统计分析
整体流程:用markitdown工具文件转markdown,然后大模型markdown统计分析 markitdown https://github.com/microsoft/markitdown 在线体验:https://huggingface.co/spaces/AlirezaF138/Markitdown 安装: pip install markitdown…...
劫持SUID程序提权彻底理解Dirty_Pipe:从源码解析到内核调试
DirtyPipe(CVE-2022-0847)漏洞内核调试全流程指南 本文主要面向对内核漏洞挖掘与调试没有经验的初学者,结合 CVE-2022-0847——著名的 Dirty Pipe 漏洞,带你从零开始学习 Linux 内核调试、漏洞复现、原理分析与漏洞利用。该漏洞危害极大,并且概念简单明了,无需复杂前置知…...
React 组件样式
在这里插入图片描述 分为行内和css文件控制 行内 通过CSS中类名文件控制...
嵌入式人工智能应用-第三章 opencv操作3 图像平滑操作 下
5 高斯噪声(Gaussian Noise) 高斯噪声(Gaussian Noise)是一种符合正态(高斯)分布的随机噪声,广泛存在于传感器采集、信号传输等场景中。以下是关于高斯噪声的详细说明、添加方法及滤波方案。 …...
OSPF的接口网络类型【复习篇】
OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型(工作方式)计时器BMA(以太网)broadcast ,需要DR/BDR的选举hello:10s…...
maven编译jar踩坑[sqlite.db]
背景: 最近在项目中搞多数据源切换的job,在src/resource下有初始化的sqlite默认文件供后续拷贝使用,在测试阶段没有什么问题,但是一部署到服务器上运行就有问题。 报错现象: 找不到这个sqlite.db文件或者文件格式有问题&#x…...
【软考系统架构设计师】软件工程
1、 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体分为问题定义、可行性研究、需求分析等 软件开发时期:软件的设计与实现,分为概要设计、详细设计、…...
蓝桥杯单片机刷题——ADC测量电位器的电压
设计要求 通过PCF8591的ADC通道测量电位器RB2的输出电压,并使用套件上提供的USB转串口功能,完成下列程序设计要求。 串口每次接收包含5个字符的字符串, 1)若接收的5个字符中有字符’a’或’A’,则数码管显示一位小数…...
零基础上手Python数据分析 (12):DataFrame 数据清洗与预处理 (下) - 类型转换、格式化、文本与日期处理
写在前面 上一篇博客,我们学习了如何使用 Pandas 处理数据分析中最常见的 “脏数据”:缺失值、重复值和异常值。 这为我们处理数据质量问题打下了坚实的基础。 然而,数据清洗的挑战远不止于此。 在实际数据中,我们还会经常遇到 数据类型不一致、数据格式不规范、文本数据混…...
免费下载 | 2025清华五道口:“十五五”金融规划研究白皮书
《2025清华五道口:“十五五”金融规划研究白皮书》的核心内容主要包括以下几个方面: 一、五年金融规划的重要功能与作用 凝聚共识:五年金融规划是国家金融发展的前瞻性谋划和战略性安排,通过广泛听取社会各界意见,凝…...
制造一只电子喵 (qwen2.5:0.5b 微调 LoRA 使用 llama-factory)
AI (神经网络模型) 可以认为是计算机的一种新的 “编程” 方式. 为了充分利用计算机, 只学习传统的编程 (编程语言/代码) 是不够的, 我们还要掌握 AI. 本文以 qwen2.5 和 llama-factory 举栗, 介绍语言模型 (LLM) 的微调 (LoRA SFT). 为了方便上手, 此处选择使用小模型 (qwen2…...
Java中parallelStream并行流使用指南
Java中parallelStream并行流使用指南 在 Java 中,parallelStream() 是 Java 8 引入的一个用于并行处理集合数据的工具,它基于 Fork/Join框架 实现,能够自动将任务拆分成子任务并利用多核处理器并行执行。以下是对 parallelStream的详细说明和…...
Python及C++中的列表
一、Python中的列表(List) Python的列表是动态数组,内置于语言中,功能强大且易用,非常适合算法竞赛。 1. 基本概念 定义:列表是一个有序、可变的序列,可以存储任意类型的元素(整数…...
mybatis plus 分页查询出来数据后对他二次 修改数据 封装返回
mybatis plus 分页查询出来数据后对他二次 修改数据 封装返回 /*** 搜索问卷** param keyword* param pageNo* param pageSize* return*/AutoLog(value "v_survey-搜索")ApiOperation(value"v_survey-搜索", notes"v_survey-搜索")GetMapping(v…...
海洋大地测量基准与水下导航系列之八我国海洋水下定位装备发展现状
中国国家综合PNT体系建设重点可概括为“51N”,“5”指5大基础设施,包括重点推进下一代北斗卫星导航系统、积极发展低轨导航增强系统、按需发展水下导航系统、大力发展惯性导航系统、积极探索脉冲星导航系统;“1”是实现1个融合发展࿰…...
基于单片机的电梯智能识别电动车阻车系统设计与实现
标题:基于单片机的电梯智能识别电动车阻车系统设计与实现 内容:1.摘要 随着电动车在日常生活中的普及,将电动车带入电梯带来的安全隐患日益凸显,如引发火灾等。本研究的目的是设计并实现一种基于单片机的电梯智能识别电动车阻车系统。方法上,…...
什么是柜台债
柜台债(柜台债券业务)是指通过银行等金融机构的营业网点或电子渠道,为投资者提供债券买卖、托管、结算等服务的业务模式。它允许个人、企业及机构投资者直接参与银行间债券市场的交易,打破了以往仅限机构参与的壁垒。以下是综合多…...
.py文件和.ipynb文件的区别:完整教程
一、概述 Python开发者常用的两种文件格式.py和.ipynb各有特点,本教程将通过对比分析、代码示例和场景说明,帮助开发者全面理解二者的区别与联系。 二、核心区别对比 1. 文件格式本质 特性.ipynb文件.py文件文件类型JSON结构化文档纯文本文件存储内容…...
Python中NumPy的逻辑和比较
在数据科学和科学计算领域,NumPy是一个不可或缺的Python库。它提供了高效的多维数组对象以及丰富的数组操作函数,其中逻辑和比较操作是NumPy的核心功能之一。通过灵活运用这些操作,我们可以轻松实现数据筛选、条件判断和复杂的数据处理任务。…...
tt_Docker
快速上手 查看 Docker 服务运行状态;查看本地镜像;从 Docker Hub 拉取基础镜像, 我们此处选择 ubuntu:18.04 镜像;再次查看本地镜像;使用 ubuntu:18.04 镜像构建容器,并交互式运行容器;在容器内部执行 LS 命令;退出容器;查看本地容器实例;再次启动停止的…...
虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?
虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解? code review! 文章目录 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?理解这句话的关键点1.类(…...
compose map 源码解析
目录 TileCanvas ZoomPanRotateState ZoomPanRotate 布局,手势处理完了,就开始要计算tile了 MapState TileCanvasState telephoto的源码已经分析过了.它的封装好,扩展好,适用于各种view. 最近又看到一个用compose写的map,用不同的方式,有点意思.分析一下它的实现流程与原…...
IDEA202403 常用设置【持续更新】
文章目录 1、设置maven2、设置JDK3、菜单栏固定展示4、连接Gitee第一步、安装插件第二步、Gitee账号配置 IDEA 是程序员的编程利器,需要具备其的各种配置,提高工作效率。Java项目启动,两个关键设置:Maven 和 JDK设置。 1、设置mav…...
从零开始开发纯血鸿蒙应用之语音输入
从零开始开发纯血鸿蒙应用 〇、前言一、认识 speechRecognizer1、使用方式2、依赖权限3、结果回写 二、实现语音识别功能1、创建语音识别引擎2、设置事件监听3、启动识别4、写入音频数据5、操作控制 三、总结 〇、前言 除了从图片中识别文本外,语音输入也是一种现代…...
c++ STL常用工具的整理和思考
蓝桥杯后,我整理了这些常用的C STL工具 作为一个算法竞赛的中等生,以前总觉得STL“花里胡哨”,不如自己写数组和循环踏实。但这次蓝桥杯发现,合理用STL能省很多时间,甚至避免低级错误。下面是我总结的常用知识点和踩过…...
Go:复合数据结构
数组 定义:数组是固定长度、元素数据类型相同的序列 。元素通过索引访问,索引从 0 到数组长度减 1 。可用len函数获取元素个数 。 初始化:默认元素初始值为类型零值(数字为 0 ) 。可使用数组字面量初始化,…...
SQL 语句基础(增删改查)
文章目录 一、SQL 基础概念1. SQL 简介2. 数据库系统的层次结构 二、SQL 语句分类1. DDL(Data Definition Language 数据定义语言)1.1 CREATE1.1.1 创建数据库1.1.2 创建数据表1.1.3 创建用户 1.2 ALTER1.2.1 AlTER 添加字段名1.2.2 ALTER 修改字段名1.2…...
【蓝桥杯 CA 好串的数目】题解
题目链接 考虑令 p r e [ i ] pre[i] pre[i] 表示 [ p r e [ i ] , i ] [pre[i], i] [pre[i],i] 是连续非递减子串,这可以类似双指针 O ( n ) O(n) O(n) 预处理: std::vector<int> pre(n); for (int r 1, l 0; r < n; r) {if (s[r] ! s[…...
Oracle for Linux安装和配置(11)——Linux命令
11.1. Linux命令 Linux是目前比较常用和流行的操作系统,现在很多生产环境就会用到它。随着其功能、性能、稳定性和可靠性等方面的日渐增强和完善,加之其成本上的优势,其市场占有率逐日攀升,也得到越来越多广大用户的关注和青睐。但作为一种操作系统,其安装、配置、管理和…...
Linux基础7
一、逻辑卷管理 查看所有物理卷:pvs 查看当前系统卷组:vgs 查看所有逻辑卷:lvs 新创建系统卷组:vgcreate [参数] [volume name] url/sdb[1-2] eg:vgcreate vg_Test /dev/sdb{1,2} >…...
C#打开文件及目录脚本
如果每天开始工作前都要做一些准备工作,比如打开文件或文件夹,我们可以使用代码一键完成。 using System.Diagnostics; using System.IO;namespace OpenFile {internal class Program{static void Main(string[] args){Console.WriteLine("Hello, …...
Docker 镜像 的常用命令介绍
拉取镜像 $ docker pull imageName[:tag][:tag] tag 不写时,拉取的 是 latest 的镜像查看镜像 查看所有本地镜像 docker images or docker images -a查看完整的镜像的数字签名 docker images --digests查看完整的镜像ID docker images --no-trunc只查看所有的…...
Python数组学习之旅:数据结构的奇妙冒险
Python数组学习之旅:数据结构的奇妙冒险 第一天:初识数组的惊喜 阳光透过窗帘缝隙洒进李明的房间,照亮了他桌上摊开的笔记本和笔记本电脑。作为一名刚刚转行的金融分析师,李明已经坚持学习Python编程一个月了。他的眼睛因为昨晚熬夜编程而微微发红,但脸上却挂着期待的微…...