vue3+element-plus 组件功能实现 上传功能
一、整体功能概述
这段代码实现了一个基于 Vue 3 和 Element Plus 组件库的文件导入及预览功能模块。主要包含了一个主导入对话框(用于上传文件、展示文件相关信息、进行导入操作等)以及一个用于预览文件内容的预览对话框。支持导入特定格式(.xlsx、.csv)且大小不超过 10M 的文件,能展示导入数据的统计情况并提供预览功能,方便用户在正式导入前查看文件内容。
二、模板结构分析
部分
主导入对话框(el-dialog):
标题为 “导入”,通过v-model绑定dialogVisible控制显示隐藏,设置了固定宽度且禁止点击模态框关闭。
内部包含文件上传区域(el-upload组件),可拖放文件,限制了文件类型、自动上传行为等,在文件改变时触发handleFileChange方法。
展示了文件类型提示、下载模板提示及链接(点击调用handleDownloadTemplate方法)。
根据是否有上传文件以及上传进度等情况,动态展示文件预览相关信息、导入数据统计情况等内容。
对话框底部定义了 “取消” 和 “确定” 按钮,“确定” 按钮根据上传进度和文件列表情况控制是否可用,点击分别调用handleClose和handleSubmit方法。
预览对话框(el-dialog):
通过v-model绑定previewVisible控制显示隐藏,设置了标题、宽度、自定义模态框类等属性。
根据importResult.fileText的值(如’attr’或’alarm’),使用不同的el-table结构来展示预览数据,数据来源于previewData。
对话框底部有 “返回” 按钮,点击调用handlePreviewClose方法关闭预览对话框。
父页面
importVisible:一个ref类型的响应式变量,用于控制导入弹窗的显示与隐藏,初始值为false,当用户点击 “导入” 按钮时,会将其设置为true以显示导入弹窗。
file:同样是ref类型变量,用于存储用户选择要上传的文件对象,在后续的文件上传等操作中会使用到该文件。
importDialogRef:ref类型,用于获取导入对话框组件的引用,方便后续调用组件内的方法来更新导入结果等相关操作。
pre_import:ref类型,作为一个标志位,在文件预览等操作流程中起到控制作用,初始值为false,在特定逻辑中会被修改其值。
三、主要函数分析
handleImport函数
javascript
const handleImport = async () => {
try {
importVisible.value = true;
} catch (error) {
console.error(‘导入组件加载失败:’, error);
ElMessage.error(‘导入功能加载失败,请刷新页面重试’);
}
};
这个函数是用户点击 “导入” 按钮时触发的操作。它的主要目的是尝试显示导入弹窗,即将importVisible的值设为true。如果在这个过程中出现错误(比如导入组件加载异常),会在控制台打印错误信息,并通过ElMessage组件向用户提示导入功能加载失败,让用户刷新页面重试。
handleDownloadTemplate函数
javascript
const handleDownloadTemplate = async () => {
const res = await DeviceModelApi.downloadAlarmTemplate();
const blob = new Blob([res.data], {
type: ‘application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’
});
const filename = 告警知识库导入模板_${new Date().getTime()}.xlsx
;
const url = window.URL.createObjectURL(blob);
downloadFile(url, filename);
ElMessage.success(‘下载成功’);
};
此函数用于处理下载导入模板的操作。它首先调用后端DeviceModelApi的downloadAlarmTemplate方法获取模板数据,将返回的数据包装成Blob对象,设置好对应的文件类型(适用于 Excel 文件格式)。接着生成一个唯一的文件名(包含当前时间戳),创建一个临时的 URL 对象,然后通过downloadFile函数实现文件下载,最后向用户提示下载成功的消息。
handleFileUpload函数
javascript
const handleFileUpload = async (uploadFile) => {
file.value = uploadFile;
try {
const formData = new FormData();
formData.append(‘file’, uploadFile);
formData.append(‘clear_existing’, ‘true’);
formData.append(‘thing_model_id’, props.detailId);
formData.append(‘pre_import’, pre_import.value);
const res = await DeviceModelApi.importAlarms(formData);let str = res.data.msg || '';
const successCount = Number(str.match(/成功导入(\d+)条/)?.[1] || 0);
const failCount = Number(str.match(/失败(\d+)条/)?.[1] || 0);
const totalCount = successCount + failCount;let errorList = [];
if (failCount > 0) {errorList = res.data.data.error;
}// 更新导入对话框的数据
importDialogRef.value?.updateImportResult({totalCount,successCount: Number(successCount),failCount: Number(failCount),errorList,fileText: 'alarm'
});
} catch (error) {
ElMessage.error(error.response?.data?.msg || error.message || ‘上传失败’);
}
};
该函数负责实际的文件上传操作,接收用户选择的文件对象作为参数。首先将传入的文件对象赋值给file.value以便后续使用。然后创建一个FormData对象,将文件以及其他相关参数(如是否清除现有数据、关联的模型 ID、预导入标志等)添加进去。接着调用后端DeviceModelApi的importAlarms方法进行文件上传,并处理返回结果:从返回消息中解析出成功导入和失败的记录数量,根据失败数量获取错误列表(如果有),最后通过导入对话框组件的引用调用updateImportResult方法更新导入对话框中显示的导入结果信息,包括总数、成功数、失败数、错误列表以及文件类型标识等内容。若上传过程出现错误,则向用户提示相应的错误消息。
handlePreview函数
javascript
const handlePreview = () => {
if (file.value) {
pre_import.value = true;
handleFileUpload(file.value)
.then(() => {
// 当handleFileUpload执行成功(Promise状态变为resolved)后,调用fetchList
return fetchList();
})
.catch((error) => {
ElMessage.error(error.response?.data?.msg || error.message || ‘文件上传或数据获取失败’);
});
}
};
这个函数用于文件预览功能。它首先判断是否已经选择了文件(即file.value是否有值),如果有文件,则将pre_import的值设为true,接着调用handleFileUpload函数进行文件上传操作。当handleFileUpload执行成功(Promise 状态变为resolved)后,会继续调用fetchList函数来获取相关数据(可能是用于展示预览内容的数据)。如果在整个过程中出现错误(文件上传或者获取数据失败),会通过ElMessage向用户提示相应的错误信息。
<ImportDialogref="importDialogRef"v-model:visible="importVisible"@success="handleSearch"@download-template="handleDownloadTemplate"@submit="handleFileUpload"@preview="handlePreview"
/>
<template><el-dialogtitle="导入"v-model="dialogVisible"width="600px":close-on-click-modal="false"@close="handleClose"><div class="upload-area"><el-uploadclass="upload-dragger"dragaction="#":auto-upload="false":show-file-list="false"accept=".xlsx,.csv":on-change="handleFileChange"><div class="upload-content"><el-icon class="upload-icon" :size="80"><upload-filled /></el-icon><div class="upload-text"><p>把文件拖放到此处或 <span class="upload-link">重新上传</span></p></div></div></el-upload></div><p class="file-type-tip text-left">支持扩展名:.xlsx、.csv,文件大小不超过10M</p><div class="download-tip text-left">下载导入模板,根据模板提示完善内容<el-link type="primary" @click="handleDownloadTemplate">下载模板</el-link></div><div v-if="fileList.length" class="file-preview"><div class="file-item"><div class="file-info"><div class="file-icon-wrapper"><span class="file-type-text">csv</span></div><span class="file-name">{{ fileList[0].name }}</span><div class="file-actions"><el-icon v-if="uploadProgress === 100" class="success-icon" :size="24" color="#67C23A"><circle-check/></el-icon><el-linkclass="preview-link"type="primary"v-if="uploadProgress === 100"@click="handlePreview">文件预览</el-link></div></div><el-progress :percentage="uploadProgress" :show-text="false" class="upload-progress" /><div class="import-info" v-if="uploadProgress === 100"><p>共导入数据{{ importResult.totalCount }}条数据...</p><p v-if="importResult.failCount > 0" class="error-text">错误数据{{ importResult.failCount }}条...错误数据将无法导入!</p><p v-if="importResult.successCount > 0">是否将本次 {{ importResult.successCount }} 条有效数据导入?</p><p v-if="importResult.successCount == 0">本次0条有效数据,无有效数据无法导入,请重新上传文件!</p></div></div></div><template #footer><div class="dialog-footer"><el-button @click="handleClose">取消</el-button><el-buttontype="primary"@click="handleSubmit":disabled="uploadProgress === 100 && fileList.length ? false : true">确定</el-button></div></template></el-dialog><!-- 预览弹窗 --><el-dialogv-model="previewVisible"title="文件预览"width="80%":modal-class="'preview-dialog'":close-on-click-modal="false":before-close="handlePreviewClose"append-to-body><div class="preview-content"><template v-if="importResult.fileText == 'attr'"><el-table:header-cell-style="{backgroundColor: '#F2F3F5',fontSize: '14px'}":data="previewData"height="calc(100vh - 200px)"style="width: 100%"><el-table-column prop="identifier" label="属性标识" width="180"></el-table-column><el-table-column prop="name" label="属性名称" width="180"></el-table-column><el-table-column prop="data_type" label="数据类型" width="180"><template #default="{ row }"><span>{{{int: '整数',float: '浮点数',string: '字符串',bool: '布尔值',enum: '枚举'}[row.data_type]}}</span></template></el-table-column><el-table-column prop="unit" label="单位" width="180"><template #default="{ row }"><span>{{ ['int', 'float'].includes(row.data_type) ? row.unit || '' : '-' }}</span></template></el-table-column><el-table-column prop="precision" label="精度" width="180"><template #default="{ row }"><span>{{row.data_type === 'float'? row.precision? `小数点后${row.precision}位`: '': '-'}}</span></template></el-table-column><el-table-column prop="data_source" label="数据来源" width="180"><template #default="{ row }"><span>{{{gateway: '数采网关',rule_engine: '规则引擎'}[row.data_source]}}</span></template></el-table-column><el-table-column prop="rw_permission" label="读写权限" width="180"><template #default="{ row }"><span>{{{r: '只读',w: '只写',rw: '读写'}[row.rw_permission]}}</span></template></el-table-column><el-table-column prop="description" label="属性描述" width="180"></el-table-column><el-table-column label="错误类型" width="180"><template #default="scope"><span v-if="scope.row.error && scope.row.error.length > 0">{{scope.row.error[0].error}}</span><span v-else>无错误</span></template></el-table-column></el-table></template><template v-if="importResult.fileText == 'alarm'"><el-table:header-cell-style="{backgroundColor: '#F2F3F5',fontSize: '14px'}":data="previewData"height="calc(100vh - 200px)"style="width: 100%"><el-table-column prop="identifier" label="告警编码" ></el-table-column><el-table-column prop="name" label="告警信息" ></el-table-column><el-table-column prop="physical_name" label="关联部位" ></el-table-column><el-table-column label="错误类型"><template #default="scope"><span v-if="scope.row.error && scope.row.error.length > 0">{{scope.row.error[0].error}}</span><span v-else>无错误</span></template></el-table-column></el-table></template></div><template #footer><div class="preview-footer"><el-button @click="handlePreviewClose">返回</el-button></div></template></el-dialog>
</template><script setup>
import { ref, watch } from 'vue'
import { Upload, CircleCheck } from '@element-plus/icons-vue'const props = defineProps({visible: {type: Boolean,default: false}
})const importResult = ref({totalCount: 0,successCount: 0,failCount: 0,errorList: [],fileText: ''
})
// 更新导入结果
const updateImportResult = (result) => {importResult.value = result// 当获取到导入结果时,将进度条设置为 100%uploadProgress.value = 100
}
// 暴露方法给父组件
defineExpose({updateImportResult
})const emit = defineEmits(['update:visible', 'success', 'download-template', 'submit', 'preview'])const dialogVisible = ref(false)
const fileList = ref([])// 监听弹窗显示状态
watch(() => props.visible,(val) => {dialogVisible.value = val},{ immediate: true } // 添加 immediate 选项确保首次渲染时同步状态
)const uploadProgress = ref(0)// 文件变化
const handleFileChange = (file) => {// 检查文件大小const isLt10M = file.size / 1024 / 1024 < 10if (!isLt10M) {ElMessage.error('文件大小不能超过 10MB!')return}fileList.value = [file]uploadProgress.value = 0// 模拟上传进度到 90%const timer = setInterval(() => {if (uploadProgress.value < 90) {uploadProgress.value += 10} else {clearInterval(timer)// 触发父组件的事件,传递原始文件对象emit('submit', file.raw)}}, 500)
}// 移除文件
const handleRemoveFile = (index) => {fileList.value.splice(index, 1)
}// 下载模板
const handleDownloadTemplate = () => {emit('download-template')
}// 关闭弹窗
const handleClose = () => {emit('update:visible', false)fileList.value = []uploadProgress.value = 0importResult.value = {totalCount: 0,successCount: 0,failCount: 0,errorList: [],fileText: ''}// emit('')
}// 提交
const handleSubmit = () => {emit('preview')handleClose()
}// 预览相关
const previewVisible = ref(false)
const previewData = ref([])// 预览方法
const handlePreview = async () => {if (importResult.value.failCount == 0) returntry {let data = importResult.value.errorListlet tableData = data.map((item) => ({...item.row,error: item.error}))previewData.value = tableDatapreviewVisible.value = true} catch (error) {ElMessage.error('文件预览失败')}
}
// 关闭预览弹窗
const handlePreviewClose = () => {previewVisible.value = false
}
</script><style scoped lang="scss">
.upload-area {border: 1px dashed #dcdfe6;border-radius: 6px;text-align: center;.upload-dragger {:deep(.el-upload) {width: 100%;}:deep(.el-upload-dragger) {width: 100%;height: auto;border: none;}}.upload-content {display: flex;flex-direction: column;align-items: center;:deep(.upload-icon) {color: #c0c4cc;margin-bottom: 24px;svg {width: 80px;height: 80px;}}.upload-text {color: #606266;font-size: 14px;.upload-link {color: #409eff;cursor: pointer;}.upload-tip {font-size: 12px;color: #909399;margin-top: 12px;}}}
}.text-left {text-align: left;
}.file-type-tip {margin-top: 12px;font-size: 14px;color: #909399;
}.download-tip {margin-top: 16px;font-size: 14px;color: #606266;
}.file-preview {margin-top: 20px;padding: 16px;.file-item {.upload-progress {:deep(.el-progress-bar__outer) {background-color: #e9ecef;height: 4px !important;border-radius: 2px;}:deep(.el-progress-bar__inner) {transition: width 0.3s ease;border-radius: 2px;background-color: #409eff;}:deep(.el-progress__text) {font-size: 13px;color: #606266;}}.file-info {display: flex;align-items: center;gap: 12px;background: #f5f7fa;padding: 12px;border-radius: 4px;.file-icon-wrapper {display: flex;align-items: center;gap: 4px;background: #409eff;padding: 4px 8px;border-radius: 4px;color: white;.file-type-icon {font-size: 16px;}.file-type-text {font-size: 12px;text-transform: uppercase;}}.file-name {flex: 1;font-size: 14px;color: #606266;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}.file-actions {display: flex;align-items: center;gap: 12px;.success-icon {color: #67c23a;}.preview-link {font-size: 14px;color: #409eff;text-decoration: none;&:hover {opacity: 0.8;}}}}.import-info {margin-top: 10px;font-size: 14px;color: #606266;line-height: 1.8;.error-text {color: #f56c6c;}}}
}.dialog-footer {display: flex;justify-content: flex-end;gap: 12px;
}.preview-dialog-container {:deep(.el-dialog) {position: fixed;top: 50% !important;left: 50% !important;transform: translate(-50%, -50%);margin: 0 !important;height: 100vh;max-height: 100vh;display: flex;flex-direction: column;}:deep(.el-dialog__body) {flex: 1;overflow: hidden;padding: 10px;}:deep(.el-dialog__footer) {padding: 10px 20px;border-width: 1px 0px 0px 0px;border-style: solid;border-color: #e5e6eb;}
}.preview-content {height: 100%;
}.preview-footer {text-align: right;
}
</style>
相关文章:
vue3+element-plus 组件功能实现 上传功能
一、整体功能概述 这段代码实现了一个基于 Vue 3 和 Element Plus 组件库的文件导入及预览功能模块。主要包含了一个主导入对话框(用于上传文件、展示文件相关信息、进行导入操作等)以及一个用于预览文件内容的预览对话框。支持导入特定格式(…...
多相机人脸扫描设备如何助力高效打造数字教育孪生体?
在教育数字化转型浪潮中,数字孪生体作为现实教育场景的虚拟映射,正成为智慧教育发展的关键技术支点。传统教育模式面临师资资源分布不均、个性化教学难以覆盖、跨时空教学场景受限等痛点,而数字孪生体通过构建高仿真虚拟教育主体(…...
高中成绩可视化平台开发笔记
高中成绩可视化平台(1) 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台,旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换,并提供多个维度的图…...
圆周期性显示和消失——瞬态实现(CAD c#二次开发、插件定制)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; [assembly: CommandClass(typeof(IfoxDemo.Commands))] namespace IfoxDemo {// 新增的圆形闪烁命令实…...
Spark SQL to_json 函数介绍
目录 前言函数介绍参数说明示例 前言 在Apache Hive中,并没有内置的to_json函数。在Apache Spark SQL中确实有to_json函数,它可以用来将结构化数据(如结构化类型或MAP类型)转换为JSON字符串。这个功能对于需要将表格数据输出为JSON格式的场景…...
5个免费的硬盘分区工具,操作简单功能全
电脑用久了,系统盘空间告急、数据盘混乱无序,很多人想重新分区,却又担心太复杂或怕搞坏硬盘。其实,只要用对工具,分区操作其实一点都不难。更重要的是,有很多免费的分区软件,不仅好用࿰…...
uniapp事件onLoad区分大小写
区分大小写。不然会不起作用。onLoad方法中的功能均不会被执行。 除了功能逻辑要检查外。大小写是要认真检查的一部分...
Flutter Riverpod 使用详细解析
📚 Flutter 状态管理系列文章目录 Flutter 状态管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用详解:原理及注意事项 InheritedWidget 组件使用及原理 Flutter 中 Provider 的使用、注…...
算法打卡 day4
4 . 高精度算法 性质:数组或者容器从低位往高位依次存储大整数,方便进位。 4.1 高精度加法 给定两个正整数(不含前导 0),计算它们的和。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,…...
权威认证!华宇TAS应用中间件荣获CCRC“中间件产品安全认证”
近日,华宇TAS应用中间件顺利通过了中国网络安全审查认证和市场监管大数据中心(CCRC)的信息安全认证,获得了IT产品信息安全认证证书。此次获证,标志着华宇TAS应用中间件在安全性、可靠性及合规性等方面达到行业领先水平,可以为政企…...
【Linux网络编程】多路转接IO(二)epoll
目录 epoll初识 epoll的相关系统调用 epoll的工作原理 epoll的优点 epoll的工作方式 水平触发 Level Triggered 工作模式 边缘触发 Edge Triggered 工作模式 对比LT和ET 理解 ET 模式和非阻塞文件描述符 epoll的惊群问题 基于LT模式的epoll代码样例 epoll初识 按照man…...
flutter的包管理#资源管理#调试Flutter应用#Flutter异常捕获
2.5 包管理 2.5.1 简介 在软件开发中,很多时候有一些公共的库或 SDK 可能会被很多项目用到,因此,将这些代码单独抽到一个独立模块,然后哪个项目需要使用时再直接集成这个模块,便可大大提高开发效率。很多编程语言或开…...
Unity Netcode自定义数据传输——结构体及其序列化
在 Unity Netcode 中,要实现自定义数据的网络传输,确实需要两个关键部分: ✅ 两个必需组件: 数据结构定义 public struct PlayerState : INetworkSerializable {public int id; // 字段1:玩家IDpublic bool …...
Vue 3 高级编程技巧
Vue 3 高级编程技巧 1. 计算属性 (Computed Properties) 含义:计算属性在依赖变化时会自动更新。以下是一个示例,展示当 firstName 或 lastName 变化时,fullName 也会更新。 实例: <script setup> import { ref, comput…...
GraphQL注入 -- GPN CTF 2025 Real Christmas
part 1 服务器会每段时间禁用已注册的账号,此处存在漏洞 def deactivate_user_graphql(email):graphql_endpoint current_app.config["GRAPHQL_ENDPOINT"]query f"""mutation {{deactivateUser (user: {{email: "{email}"}}){{ success…...
python打卡day43
疏锦行 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms# 数据预处理 tra…...
ethers.js express vue2 定时任务每天凌晨2点监听合约地址数据同步到Mysql整理
下面是一个完整的 Ethers.js Express Vue2 MySQL 实现方案,用于: 💡每天凌晨 2 点监听某合约地址的 Transfer 事件,写入 MySQL 数据库,并展示每日 NFT 交易量图表(Vue2 ECharts) ✅ 后端部分…...
内网穿透和端口映射的区别在哪?局域网提供互联网访问方案对比选择详解
内网穿透和端口映射是两个经常被提及的概念,它们对于实现网络中的内外网通信起着关键作用。内网穿透和端口映射都能够有效地将本地局域网地址提供给互联网上外网访问,但二者之间存在着显著的区别。 内网穿透与端口映射的核心区别在于实现方式和依赖条件…...
机器学习---正则化、过拟合抑制与特征筛选
专栏:机器学习 个人主页:云端筑梦狮 注:上一篇机器学习还差一小节,日后坑必会填上 一.正则化 什么是正则化 / 如何进行正则化 其实机器学习中正则化(regularization)的外在形式非常简单,就是在模型的损失函数中加…...
优化 ArcPy 脚本性能
合理设置环境变量 优化环境变量配置 ArcPy 提供了许多环境变量,用于控制地理处理工具的行为。合理设置环境变量可以优化脚本的性能。例如,设置“workspace”环境变量可以指定默认的工作空间,避免在脚本中重复指定工作空间路径。 Python 复制…...
Robyn高性能Web框架系列06:使用WebSocket实现产品智能助理
使用WebSocket实现产品智能助理 WebSocket原理与应用场景Robyn的WebSocket基本使用1、创建WebSocket服务2、侦听WebSocket事件3、向客户端发送消息4、向客户端广播消息5、使用查询参数6、主动关闭连接 示例:简易的产品智能助理1、产品数据部分2、产品信息部分3、智能…...
UDP 缓冲区
UDP 有接收缓冲区,没有发送缓冲区 引申问题 1、为什么没有发送缓冲区? 直接引用原文 “因为 UDP 是不可靠的,它不必保存应用进程的数据拷贝,因此无需一个真正的发送缓冲区” 2、没有发送缓冲区的情况下,sendto 的数…...
物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践
在数字化浪潮席卷全球的今天,物联网(IoT)已从概念走向现实,成为连接物理世界与数字世界的关键桥梁。它通过将日常物品、工业设备等“物”嵌入传感器、软件及其他技术,使其能够通过网络相互连接并交换数据,从…...
【甲方安全视角】开源的安全悖论
文章目录 安全的充分必要条件:从「符号化信任」到「验证驱动安全」构建与分发的不可信链条迭代与审计的节奏错位代码透明与攻击面的对等暴露对普通用户的建议选择可信项目与品牌始终通过官方渠道获取软件注意权限与环境安全对“签名请求”、“连接钱包”等敏感操作保…...
GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径
在人工智能技术浪潮的推动下,GEO生成式引擎优化已跃升为行业技术演进与产业发展相融合的核心赛道。通过系统性梳理其发展脉络,我们可清晰勾勒出技术突破与产业变革交织的演进轨迹,其发展进程包含以下重要节点。 2023年4月,GPT-4发…...
【unity游戏开发——网络】计算机网络中的三种数据管理模型(分散式、集中式、分布式)和三大通信模型(C/S、B/S、P2P)
注意:考虑到热更新的内容比较多,我将热更新的内容分开,并全部整合放在【unity游戏开发——网络】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、数据管理模型1、分散式 (Decentralized - 各管各的)2、集中式 (Centra…...
MR30分布式 IO在物流堆垛机的应用
在现代物流行业蓬勃发展的浪潮中,物流堆垛机作为自动化仓储系统的核心设备,承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势,极大地提升了仓储空间利用率和货物周转效率。然而,随着物流行业的高速发展&#…...
香港维尔利健康科技集团推出AI辅助医学影像训练平台,助力医护人才数字化转型
香港维尔利健康科技集团近日正式发布其自主研发的“AI辅助医学影像训练平台(V-MedTrain)”,这一创新平台的上线,标志着医学影像教育迈入智能化辅助教学新时代。依托人工智能与大数据分析技术,香港维尔利健康科技集团在…...
2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五)
2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五) 第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应(可以培训有答案)任务 2:通信数据分析取…...
基于 Python 的批量文件重命名软件设计与实现
在工作过程中,经常有很多文件,想要对文件名进行批量改名,特此写了一个程序,以实现此功能。 一、批量文件重命名软件设计原理 (一)核心原理阐述 批量文件重命名软件的核心原理在于运用操作系统提供的文件管理功能,借助编程手段达成对文件名称的批量修改。在这个软件里,…...
【深度学习新浪潮】什么是上下文工程?
什么是上下文工程? 上下文工程(Context Engineering) 是指通过设计、优化与大语言模型(LLM)交互时的输入内容(即“上下文”),引导模型生成更符合预期、更精准回答的系统性方法。这里的“上下文”通常包括 提示词(Prompt)、示例(Few-Shot Examples)、历史对话记录、…...
逆向入门(8)汇编篇-rol指令的学习
还是那个题,这回又碰到个循环左移,有挺多操作方法之前都没有系统的学,用到的时候再看看感觉还挺好,不耽误事 0x00 基本介绍 ROL(Rotate Left): 循环左移,它有两个操作数: 第一个操作数是目标操作数&#…...
Fisco Bcos学习 - 开发第一个区块链应用
文章目录 一、前言二、业务场景分析:简易资产管理系统三、智能合约设计与实现3.1 存储结构设计3.2 接口设计3.3 完整合约代码 四、合约编译与Java接口生成五、SDK配置与项目搭建5.1 获取Java工程项目5.2 项目目录结构5.3 引入Web3SDK5.4 证书与配置文件 六、业务开发…...
黑马python(十六)
目录: 1.JSON数据格式的转换 2.pyecharts模块简介 3.pyecharts入门使用 4.数据准备 5.生成折线图 1.JSON数据格式的转换 2.pyecharts模块简介 官方网站: 画廊网站:有更多的图标形式 测试是否安装 3.pyecharts入门使用 运行会生成一个html的文件&a…...
完成国产化替代!昆明卷烟厂用时序数据库 TDengine 重塑工业时序数据平台
小T导读:昆明卷烟厂作为红云红河烟草(集团)有限责任公司的重要组成部分,是集团卷烟生产的核心工厂。早期在建设制造执行系统(MES)时,其采用了 Wonderware 平台的时序数据存储功能模块࿰…...
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | BackgroundSlider(背景滑块)
📅 我们继续 50 个小项目挑战!—— BackgroundSlider组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> …...
Wpf的Binding
前言 wpf的Binding就像一个桥梁,它的作用就是连接逻辑层与界面层,既能够把逻辑层的数据搬到界面层展示,又能将界面层的数据更改后传递到逻辑层,Binding的数据来源就是Binding的源,数据展示的地方就是Binding的目标。 …...
Redis—持久化
持久化 在mysql当中,有4个比较关心的特性,分别是原子性、一致性、隔离性和持久性。这里的持久性和持久化是一回事。我们该如何判断是否具有持久性呢?答案就是看重启进程或者主机之后,数据是否存在。当我们把数据存储在硬盘上是就…...
Spring Boot中日志管理与异常处理
以下是Spring Boot中日志管理与异常处理的系统化实践指南,结合最佳实践与核心配置,确保应用健壮性与可维护性。 📊 一、日志管理核心配置 默认框架与级别控制 Logback 是Spring Boot默认日志框架,通过application.yml快速配置&…...
基于MATLAB的BP神经网络的心电图分类方法应用
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 心电图(ECG)是临床诊断心血管疾病的重要工具,能够反映心脏电活动的周期性变化。…...
【笔记】Docker 配置阿里云镜像加速(公共地址即开即用,无需手动创建实例)
2025年06月25日记 【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记(附 异常处理)-CSDN博客 【笔记】解决 WSL 迁移后 Docker 出现 “starting services: initializing Docker API Proxy: setting up docker ap” 问题…...
Java 中LinkedList 总结
406.根据身高重建队列 力扣题目链接(opens new window) 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高…...
微信小程序 / UNIAPP --- 阻止小程序返回(顶部导航栏返回、左 / 右滑手势、安卓物理返回键和调用 navigateBack 接口)
目录 理解page-container的原理 设置禁止点击遮盖层关闭? 阻止左滑返回 理解page-container的原理 page-container组件的所有属性,最重要的是show值。在页面上引入这个组件后,若show值为true,页面上所有各种方式触发的返回操作…...
Linux基本指令篇 —— mv指令
在Windows中我们经常使用CtrlX和CtrlV将一个地方的文件或目录移动到另一个地方,我们若是要在Linux当中完成此操作,则需要使用mv指令。mv 是 Linux 系统中用于移动或重命名文件和目录的基本命令之一,是 "move" 的缩写。下面将详细介…...
基于STM32的智能节能风扇的设计
基于STM32的智能节能风扇的设计 内容:1.摘要 本设计旨在解决传统风扇能耗高、功能单一的问题,提出一种基于STM32的智能节能风扇。通过结合温度传感器、人体红外传感器等多种传感器,利用STM32微控制器实现对风扇的智能控制。经过实际测试,该智…...
HCIA-IP路由基础
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 本篇笔记是根据B站上的视频教程整理而成,感谢UP主的精彩讲解!如果需要了解更多细节,可以参考以下视频…...
Linux 内存管理之page cache
文章目录 一、page cache1.1 File-backed pages和Anonymous pages1.2 page cache/slab cache1.3 读/写路径1.4 脏页回写1.5 drop_caches1.6 时间局部性与空间局部性1.7 Page Cache 的两种类型1.8 关键数据结构 二、Page Cache 的产生2.1 Buffered I/O(标准 I/O&…...
uniApp实战四:网络请求封装
文章目录 1.最终效果预览2.请求封装3.创建config配置文件4.创建api请求5.页面调用 说明:当前笔记基于Vue3开发,HbuilderX版本4.66 1.最终效果预览 2.请求封装 在util/request.js下创建js文件,代码如下 import config from /configconst tim…...
sentinel 自定义 dashboard 用户名密码
默认情况下,sentinel dashboard 用户名密码为 sentinel / sentinel ,这里我使用重写 镜像的方式: // 定义 Dockerfile $ cat Dockerfile # 基于现有 Sentinel Dashboard 镜像 FROM bladex/sentinel-dashboard:1.8.4# 重新定义 ENTRYPOINT&…...
Fisco Bcos学习 - 搭建星形拓扑组网
文章目录 一、前言二、环境准备与依赖安装2.1 系统要求2.2 依赖安装 三、星形拓扑设计与节点规划四、使用build_chain.sh构建星形拓扑4.1 创建操作目录并获取脚本4.2 生成星形拓扑配置文件4.3 执行构建命令4.4 查看生成的节点文件 五、启动节点与共识验证5.1 启动所有节点5.2 查…...