当前位置: 首页 > news >正文

压缩包网页预览(zip-html-preview)

zip-html-preview

项目介绍

这是一个基于 Spring Boot 开发的在线 ZIP 文件预览工具,主要用于预览 ZIP 压缩包中的 HTML 文件及其相关资源。

主要功能

  • 支持拖拽上传或点击选择多个 ZIP 文件
  • 自动解压并提取 ZIP 文件中的 HTML 文件
  • 在线预览 HTML 文件及其相关的 CSS、JavaScript 和图片等资源
  • 支持多文件批量处理

技术栈

  • 后端:Spring Boot 2.3.4
  • 前端:HTML5 + JavaScript
  • 构建工具:Maven

快速开始

环境要求

  • JDK 8+
  • Maven 3.x

配置说明

application.properties 中配置解压文件存储路径:

zip.extract.path=D:/unzip

运行步骤

  1. 克隆项目
git clone https://gitee.com/anxwefndu/zip-html-preview.git
  1. 进入项目目录
cd zip-html-preview/SpringBoot
  1. 编译打包
mvn clean package
  1. 运行项目
java -jar target/SpringBoot-1.0-SNAPSHOT-execute.jar
  1. 访问应用
    打开浏览器访问: http://localhost:8080

使用说明

  1. 打开网页后,可以通过拖拽或点击选择按钮上传 ZIP 文件
  2. 支持同时选择多个 ZIP 文件
  3. 上传完成后会自动显示可预览的 HTML 文件列表
  4. 点击文件名即可在新标签页中预览对应的 HTML 文件

源码下载

zip-html-preview

演示截图

1.系统首页
在这里插入图片描述

2.预览压缩包
在这里插入图片描述

3.预览页面1
在这里插入图片描述

4.预览页面2
在这里插入图片描述

核心源码

SpringBoot/src/main/resources/static/index.html

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>zip-html-preview</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Pacifico&display=swap" rel="stylesheet"><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet"><script src="https://cdn.tailwindcss.com"></script><script>tailwind.config = {theme: {extend: {colors: {primary: '#4F46E5',secondary: '#6366F1'},borderRadius: {'none': '0px','sm': '2px',DEFAULT: '4px','md': '8px','lg': '12px','xl': '16px','2xl': '20px','3xl': '24px','full': '9999px','button': '4px'}}}}</script><style>body::-webkit-scrollbar {width: 0.5rem;}body::-webkit-scrollbar-track {background: #f1f1f1;border-radius: 0.5rem;}body::-webkit-scrollbar-thumb {background: #3498db;border-radius: 0.5rem;}body::-webkit-scrollbar-thumb:hover {background: #2980b9;}.drag-area {border: 2px dashed #E5E7EB;transition: all 0.3s ease;}.drag-area:hover {border-color: #4F46E5;}.file-input {display: none;}.button-hover {transition: transform 0.2s ease;}.button-hover:active {transform: translateY(2px);}</style></head><body class="bg-gray-50"><div class="w-[1200px] mx-auto"><nav class="h-16 bg-white shadow-sm flex items-center justify-between px-8"><div class="flex items-center space-x-2"><span class="text-2xl font-['Pacifico'] text-primary">logo</span><span class="text-lg font-medium">zip-html-preview</span></div><button class="w-10 h-10 rounded-button flex items-center justify-center hover:bg-gray-100 transition-colors"><i class="fas fa-sun text-gray-600"></i></button></nav><main class="px-8 py-12"><div class="max-w-3xl mx-auto"><div class="bg-white rounded-lg shadow-sm p-8"><div id="dropArea" class="drag-area rounded-lg p-12 text-center"><input type="file" id="fileInput" class="file-input" multiple accept=".zip"><div class="space-y-4"><div class="w-20 h-20 mx-auto bg-gray-50 rounded-full flex items-center justify-center"><i class="fas fa-cloud-upload-alt text-4xl text-gray-400"></i></div><div><h3 class="text-lg font-medium">拖拽文件到这里,或</h3><button class="mt-2 px-6 py-2 bg-primary text-white rounded-button hover:bg-primary/90 button-hover whitespace-nowrap">点击选择文件</button></div><p class="text-sm text-gray-500">支持的文件格式:ZIP</p></div></div><div id="fileList" class="hidden mt-8 space-y-4"><div class="text-lg font-medium mb-4">已选择的文件</div><div class="space-y-3"></div><div class="flex justify-end space-x-3 mt-6"><button id="clearButton" class="px-6 py-2 text-gray-600 bg-gray-100 rounded-button hover:bg-gray-200 button-hover whitespace-nowrap">清空列表</button><button id="previewButton" class="px-6 py-2 text-white bg-primary rounded-button hover:bg-primary/90 button-hover whitespace-nowrap">预览</button></div></div><div id="previewLinks" class="hidden mt-8 space-y-4"><div class="text-lg font-medium mb-4">可预览的文件</div><ul class="space-y-2" id="htmlFilesList"></ul></div></div><div class="mt-12 bg-white rounded-lg shadow-sm p-8"><h2 class="text-xl font-medium mb-6">使用说明</h2><div class="space-y-4 text-gray-600"><div class="flex items-start space-x-3"><div class="w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5"><i class="fas fa-check text-sm text-primary"></i></div><p>支持拖拽上传或点击选择文件,可以一次选择多个ZIP文件</p></div><div class="flex items-start space-x-3"><div class="w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5"><i class="fas fa-check text-sm text-primary"></i></div><p>系统会自动解析ZIP文件中的HTML文件,并提供在线预览功能</p></div><div class="flex items-start space-x-3"><div class="w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5"><i class="fas fa-check text-sm text-primary"></i></div><p>支持预览ZIP包中的HTML文件及其相关的CSS、JavaScript和图片等资源</p></div><div class="flex items-start space-x-3"><div class="w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5"><i class="fas fa-check text-sm text-primary"></i></div><p>提供文件树视图,方便浏览ZIP包中的文件结构和快速切换不同的HTML文件</p></div></div></div></div></main></div><script>const dropArea = document.getElementById('dropArea');const fileInput = document.getElementById('fileInput');const fileList = document.getElementById('fileList');const previewButton = document.getElementById('previewButton');const clearButton = document.getElementById('clearButton');const previewLinks = document.getElementById('previewLinks');const htmlFilesList = document.getElementById('htmlFilesList');// 存储所有文件的数组let selectedFiles = [];// 点击拖拽区域触发文件选择dropArea.addEventListener('click', () => {fileInput.click();});// 拖拽进入时改变样式dropArea.addEventListener('dragover', (e) => {e.preventDefault();dropArea.classList.add('border-primary');});// 拖拽离开时恢复样式dropArea.addEventListener('dragleave', () => {dropArea.classList.remove('border-primary');});// 拖拽放下时处理文件dropArea.addEventListener('drop', (e) => {e.preventDefault();dropArea.classList.remove('border-primary');const files = e.dataTransfer.files;handleFiles(files);});// 文件输入框变化时处理文件fileInput.addEventListener('change', () => {const files = fileInput.files;handleFiles(files);fileInput.value = null;});// 处理文件并更新文件列表function handleFiles(files) {for (let i = 0; i < files.length; i++) {const file = files[i];if (!selectedFiles.some(f => f.name === file.name)) {selectedFiles.push(file);}}updateFileList();}// 更新文件列表 DOMfunction updateFileList() {if (selectedFiles.length > 0) {fileList.classList.remove('hidden');} else {fileList.classList.add('hidden');}const listContainer = fileList.querySelector('.space-y-3');listContainer.innerHTML = ''; // 清空旧的文件列表selectedFiles.forEach((file, index) => {const fileType = file.type || 'text/plain';const fileSize = formatFileSize(file.size);const listItem = document.createElement('div');listItem.className = 'flex items-center justify-between p-4 bg-gray-50 rounded-lg';// 左侧:文件图标和信息const leftSide = document.createElement('div');leftSide.className = 'flex items-center space-x-3';const icon = document.createElement('i');icon.className = getIconClass(fileType);icon.style.color = '#4F46E5'; // 设置颜色const fileInfo = document.createElement('div');fileInfo.innerHTML = `<div class="font-medium">${escapeHTML(file.name)}</div><div class="text-sm text-gray-500">${fileSize}</div>`;leftSide.appendChild(icon);leftSide.appendChild(fileInfo);// 右侧:操作按钮const rightSide = document.createElement('div');rightSide.className = 'flex items-center space-x-2';// 删除按钮const deleteButton = document.createElement('button');deleteButton.className = 'p-2 text-gray-400 hover:text-gray-600 rounded-button button-hover';deleteButton.innerHTML = '<i class="fas fa-times"></i>';deleteButton.addEventListener('click', () => removeFile(index));rightSide.appendChild(deleteButton);listItem.appendChild(leftSide);listItem.appendChild(rightSide);listContainer.appendChild(listItem);});}// 格式化文件大小function formatFileSize(size) {const units = ['B', 'KB', 'MB', 'GB'];let unitIndex = 0;while (size >= 1024 && unitIndex < units.length - 1) {size /= 1024;unitIndex++;}return `${size.toFixed(2)} ${units[unitIndex]}`;}// 获取文件类型的图标类名function getIconClass(type) {if (type.startsWith('image/')) {return 'fas fa-file-image text-primary w-8 h-8 flex items-center justify-center';} else if (type === 'text/plain' || type.endsWith('.md')) {return 'fas fa-file-alt text-primary w-8 h-8 flex items-center justify-center';} else {return 'fas fa-file text-primary w-8 h-8 flex items-center justify-center';}}// 移除指定索引的文件function removeFile(index) {selectedFiles.splice(index, 1);updateFileList();}// 清空所有文件document.querySelector('#fileList .px-6.py-2.text-gray-600').addEventListener('click', () => {selectedFiles = [];updateFileList();});// 转义 HTML 特殊字符function escapeHTML(str) {return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');}// 清空所有文件clearButton.addEventListener('click', () => {selectedFiles = [];updateFileList();previewLinks.classList.add('hidden');htmlFilesList.innerHTML = '';});// 预览按钮点击事件previewButton.addEventListener('click', () => {if (selectedFiles.length === 0) return;const formData = new FormData();selectedFiles.forEach(file => formData.append('file', file));fetch('/api/upload', {method: 'POST',body: formData}).then(response => response.json()).then(data => {previewLinks.classList.remove('hidden');htmlFilesList.innerHTML = '';data.forEach(htmlFile => {const listItem = document.createElement('li');listItem.className = 'flex items-center justify-between p-4 bg-gray-50 rounded-lg';const fileName = document.createElement('a');fileName.href = htmlFile.filePath;fileName.target = '_blank';fileName.className = 'text-blue-500 hover:underline';fileName.textContent = htmlFile.fileName;listItem.appendChild(fileName);htmlFilesList.appendChild(listItem);});}).catch(error => {alert('上传失败,请稍后再试。');console.error('Error:', error);});});</script></body></html>

SpringBoot/src/main/java/com/boot/service/ZipService.java

package com.boot.service;import com.boot.config.ZipConfig;
import com.boot.model.HtmlFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;@Service
public class ZipService {@Autowiredprivate ZipConfig zipConfig;public List<HtmlFile> processZipFile(MultipartFile file) throws IOException {String extractDir = zipConfig.getExtract().getPath();File dir = new File(extractDir);if (!dir.exists()) {dir.mkdirs();}// 解压文件try (ZipInputStream zis = new ZipInputStream(file.getInputStream(), Charset.forName("GBK"))) {ZipEntry zipEntry;byte[] buffer = new byte[1024];while ((zipEntry = zis.getNextEntry()) != null) {File newFile = new File(extractDir + File.separator + zipEntry.getName());if (zipEntry.isDirectory()) {newFile.mkdirs();continue;}// 创建父目录new File(newFile.getParent()).mkdirs();// 写入文件try (FileOutputStream fos = new FileOutputStream(newFile)) {int len;while ((len = zis.read(buffer)) > 0) {fos.write(buffer, 0, len);}}}}// 查找第一层的HTML文件List<HtmlFile> htmlFiles = new ArrayList<>();// 提取文件夹名称(去掉扩展名)String folderName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.'));extractDir = extractDir + File.separator + folderName;try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(extractDir))) {for (Path path : stream) {if (Files.isRegularFile(path) && path.toString().toLowerCase().endsWith(".html")) {htmlFiles.add(new HtmlFile(path.getFileName().toString(), "/preview" + path.toString().substring(zipConfig.getExtract().getPath().length())));}}}return htmlFiles;}
}

相关文章:

压缩包网页预览(zip-html-preview)

zip-html-preview 项目介绍 这是一个基于 Spring Boot 开发的在线 ZIP 文件预览工具,主要用于预览 ZIP 压缩包中的 HTML 文件及其相关资源。 主要功能 支持拖拽上传或点击选择多个 ZIP 文件自动解压并提取 ZIP 文件中的 HTML 文件在线预览 HTML 文件及其相关的 CSS、JavaSc…...

OpenCV 图形API(41)颜色空间转换----- BGR 图像转换为灰度图像函数BGR2Gray()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为灰度。 B、G和R通道值的传统范围是0到255。结果的灰度颜色值计算为&#xff1a; dst ( I ) 0.114 ∗ src ( I ) . B…...

影视产业链中的律师角色以及合规风控要点

影视产业链中的律师角色以及合规风控要点 在影视娱乐业务中&#xff0c;律师服务贯穿项目全生命周期&#xff0c;涵盖创意开发、投z制作、发行传播、艺人管理及争议等多个领域 一、影视项目全流程合同法律事务 ✔️项目开发阶段 剧本合作&#xff1a;剧本委托创作、改编、版权…...

Java工具类——实体类列表写入excel

Java工具类——实体类列表写入excel /*** 将实体类 List 数据写入 Excel 文件* param dataList 实体类对象列表* param filePath Excel 文件路径* param sheetName Sheet 名称* param <T> 泛型类型* throws IOException 文件操作异常* throws IllegalAccessException 反…...

C++23 新预处理器指令详解:#elifdef、#elifndef 和 #warning

文章目录 1. #elifdef 和 #elifndef&#xff1a;更灵活的条件编译1.1 背景与动机1.2 语法与示例示例代码&#xff1a; 1.3 编译器支持 2. #warning&#xff1a;发出编译警告2.1 背景与动机2.2 语法与示例示例代码&#xff1a; 2.3 编译器支持 3. 总结 C23 标准引入了多项改进&a…...

书写API文档的最佳实践[特殊字符]

API文档对于API的可用性和成功至关重要。完善的API文档能显著提高开发者体验&#xff0c;加速采用&#xff0c;并培养强大的开发者社区。反之&#xff0c;糟糕的文档可能导致困惑、挫败感和错误&#xff0c;从而降低采用率。本文将探讨编写清晰、全面、开发者友好的API文档的高…...

【Maven】手动安装依赖到本地仓库

【Maven】手动安装依赖到本地仓库 【一】下载依赖【二】安装 JAR 文件到本地仓库【三】验证安装【四】在项目中使用该依赖【1】注意事项【2】额外提示 【一】下载依赖 登录到中央仓库下载依赖&#xff0c;中央仓库地址&#xff1a;https://mvnrepository.com/ 搜搜你的依赖的a…...

kali下maven 的安装与配置

1、下载 maven 安装包 wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz 2、解压 apache-maven-3.9.4-bin.tar.gz tar -zxvf apache-maven-3.9.4-bin.tar.gz 找到文件解压到的位置&#xff0c;由于解压时我们没有指定路径&#x…...

list的模拟实现和反向迭代器的底层

1&#xff1a;list的模拟实现 1&#xff1a;链表的节点 对于list的模拟实现&#xff0c;我们需要先定义一个节点的类可以使用&#xff08;class也可以使用struct&#xff09; // List的节点类 template<class T> struct ListNode {ListNode(const T& val T()){_p…...

OpenHarmony - 小型系统内核(LiteOS-A)(七)

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;七&#xff09; 八、文件系统 适配新的文件系统 基本概念 所谓对接VFS层&#xff0c;其实就是指实现VFS层定义的若干接口函数&#xff0c;可根据文件系统的特点和需要适配其中部分接口。一般情况下&…...

四层板的时钟线设计:关键要点与实用策略

在电子电路设计领域&#xff0c;四层板凭借其出色的电气性能和合理的空间布局&#xff0c;广泛应用于各类电子产品中。而时钟线作为系统的 “心跳”&#xff0c;为整个电路提供同步信号&#xff0c;其设计质量直接关系到系统的稳定性、可靠性和性能表现。因此&#xff0c;深入探…...

【TypeScript类型系统解析:一次真实的类型检查修复经历】

TypeScript类型系统解析&#xff1a;一次真实的类型检查修复经历 在最近的管理系统开发过程中&#xff0c;我遇到了一个值得深入探讨的TypeScript类型问题。通过解决这个问题&#xff0c;我更深入地理解了TypeScript的类型系统工作原理&#xff0c;以及如何在Vue项目中正确处理…...

全视通无感护理巡视系统方案及产品,助力医院护士巡视病房到位

传统的护理工作中&#xff0c;护理巡视是一项重要且繁琐的任务。护士们需要根据不同的护理级别&#xff0c;定时对患者进行巡视&#xff0c;并手工填写巡视记录表&#xff0c;登记巡视时间、人员等信息。月末时&#xff0c;还需进行人工数据统计&#xff0c;这一过程不仅效率低…...

初识Redis · 命令、数据结构补充、协议

目录 前言&#xff1a; 数据结构补充 stream geospaital Hyperloglog bitmap bitfield 渐进式遍历命令等 认识Redis客户端及协议 前言&#xff1a; 在前文&#xff0c;我们总览一下&#xff0c;我们已经介绍了什么是Redis&#xff0c;Redis的应用场景是什么&#xff…...

DBA工作常见问题整理

MVCC机制: PostgreSQL的多版本并发控制(MVCC)是其核心特性之一&#xff0c;它允许数据库在高并发环境下保持高性能的同时提供事务隔离。 MVCC通过维护数据的多个版本实现&#xff1a; 读操作不阻塞写操作写操作不阻塞读操作避免使用锁实现并发控制 PostgreSQL的MVCC特点 写时…...

云转型(cloud transformation)——不仅仅是简单的基础设施迁移

李升伟 编译 云转型不仅仅是迁移基础设施&#xff0c;更是重塑企业运营、创新及价值交付的方式。它具有战略性、持续性&#xff0c;并影响着人员、流程和平台。 ☁️ 云转型涉及以下内容&#xff1a; &#x1f504; 应用现代化——从单体架构转向微服务架构。 ⚙️ 运营自动…...

SpringBoot 定时任务

启用定时任务‌ 首先确定需要启用定时任务的SpringBoot类&#xff0c;然后添加注解&#xff08;EnableScheduling&#xff09;以启用定时任务 package com.mt.visitorauth.anjian.service;import org.springframework.scheduling.annotation.EnableScheduling;EnableScheduli…...

常见的低代码策略整理

低代码策略通过简化开发流程、降低技术门槛、提升效率&#xff0c;帮助用户快速构建灵活可靠的应用。这些策略的核心优势体现在以下方面&#xff1a; 快速交付与降本增效 减少编码需求&#xff1a;通过可视化配置&#xff08;如变量替换、表达式函数&#xff09;替代传统编码…...

HFSS(李明洋)学习记录1

Hfss操作记录 HFSS—solution type&#xff1a;选择求解类型Modeler—units&#xff1a;设置hfss内部的基本单位可选mm或者in&#xff08;英寸&#xff09;设置端口激励—波端口&#xff1a;右键selection model/face 选中对应的表面之后&#xff1b;右键assign excitation/po…...

泛目录站群技术架构演进观察:2025年PHP+Java混合方案实战笔记​

https://www.zhanqun.xin/ 在参与某跨国电商平台SEO优化项目时&#xff0c;我们团队对市面上主流站群系统进行了为期半年的技术评估。最终选择部署的2025版无极多功能泛目录站群程序&#xff0c;其技术实现路径与工程化设计思路颇具参考价值&#xff0c;现整理关键发现如下。 …...

sentinel安装部署及测试--实践

一、什么是 Sentinel&#xff1f; Sentinel 是阿里巴巴开源的一款用于微服务流量控制和系统防护的中间件。它的主要功能包括&#xff1a; **流量控制&#xff08;Flow Control&#xff09;&#xff1a;**限制系统的 QPS 或线程数&#xff0c;防止因流量过大导致系统崩溃。 **…...

Yocto项目实战教程 · 第4章:4.1小节元数据

&#x1f50d; B站相应的视频教程&#xff1a; &#x1f4cc; Yocto项目实战教程-第4章-4.1小节-元数据 记得三连&#xff0c;标为原始粉丝。 在嵌入式Linux系统构建中&#xff0c;Yocto项目凭借其高度模块化、可配置的特性成为主流工具。而其背后的关键支撑之一&#xff0c;便…...

应用镜像是什么?轻量应用服务器的镜像大全

应用镜像是轻量应用服务器专属的&#xff0c;镜像就是轻量应用服务器的装机盘&#xff0c;应用镜像在原有的纯净版操作系统上集成了应用程序&#xff0c;例如WordPress应用镜像、宝塔面板应用镜像、WooCommerce等应用&#xff0c;阿里云服务器网aliyunfuwuqi.com整理什么是轻量…...

关于Java集合中对象字段的不同排序实现方式

&#x1f4ca; 关于Java集合中对象字段的不同排序实现方式 #Java集合 #排序算法 #Comparator #性能优化 一、排序基础&#xff1a;两种核心方式对比 方式Comparable接口Comparator接口实现位置目标类内部实现独立类或匿名内部类排序逻辑自然排序&#xff08;固定规则&#xf…...

2000-2017年各省发电量数据

2000-2017年各省发电量数据 1、时间&#xff1a;2000-2017年 2、来源&#xff1a;能源年鉴、国家统计局 3、指标&#xff1a;行政区划代码、城市、年份、发电量 4、范围&#xff1a;31省 5、指标说明&#xff1a;发电量是指在特定时间内&#xff0c;发电设备&#xff08;如…...

第二十二天 - 安全加固实践 - 漏洞扫描工具开发 - 练习:SSH暴力破解防护

前言 随着网络安全威胁日益严峻&#xff0c;掌握基础防护技能成为开发者必备能力。本文将从零开始&#xff0c;通过安全加固实践、漏洞扫描工具开发、SSH暴力破解防护三个维度&#xff0c;带您快速构建安全防御体系。所有示例均附带完整代码&#xff0c;建议边阅读边实践。 一…...

【AI】React Native中使用Zustand框架及自动生成选择器

引言 随着React Native在移动应用开发领域的广泛应用&#xff0c;高效的状态管理变得尤为重要。Zustand作为一个轻量级的状态管理库&#xff0c;提供了简洁而强大的API&#xff0c;特别适合于React Native应用开发。本报告将详细介绍如何在React Native项目中使用Zustand框架&…...

MySQL GTID集合运算函数总结

MySQL GTID 有一些运算函数可以帮助我们在运维工作中提高运维效率。 1 GTID内置函数 MySQL 包含GTID_SUBSET、GTID_SUBTRACT、WAIT_FOR_EXECUTED_GTID_SET、WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS 4个内置函数&#xff0c;用于GTID集合的基本运算。 1.1 GTID_SUBSET(set1,set2) …...

4.1.2 Redis协议与异步方式

文章目录 4.1.2 Redis协议与异步方式1. redis pipeline2. redis事务1. MULTI2. EXEC3. DISCARD4. WATCH 3. lua脚本1. lua基础语法2. Lua 脚本中访问 Redis 的方式3. Lua 脚本中的 KEYS 和 ARGV4、返回值5、错误处理EVALSHA 来代替 EVAL 4. ACID特性分析5. redis发布订阅1. 工作…...

ecovadis审核有什么原则?什么是ecovadis审核,有什么意义

EcoVadis审核概述 EcoVadis是一家全球知名的企业可持续发展评级机构&#xff0c;成立于2007年&#xff0c;旨在通过评估企业的环境&#xff08;E&#xff09;、社会&#xff08;S&#xff09;和治理&#xff08;G&#xff09;表现&#xff0c;帮助跨国公司管理供应链的可持续性…...

bitnet-b1.58-2B-4T和三进制

最近有个模型挺火啊现在都排进了HF排行榜的第四了 模型叫做microsoft/bitnet-b1.58-2B-4T 其实非常小的一个模型&#xff0c;只有2B&#xff0c;那这东西有多大意义呢&#xff1f; 它主要探索一个打法 也就是这篇论文 The era of 1-bit llms: All large language models ar…...

k8s报错kubelet.go:2461] “Error getting node“ err=“node \“k8s-master\“ not found“

问题 首先最初问题&#xff1a; [rootk8s-master ~]# kubectl get pods -owide --all-namespaces The connection to the server 192.168.2.129:6443 was refused - did you specify the right host or port?检查kubelet状态 查看kubelet status报找不到master节点 [rootk8…...

计算serise数据的唯一值数量

1. Series.unique() 功能&#xff1a;返回 Series 中所有唯一值的 数组&#xff08;顺序按首次出现排列&#xff09;。 返回值类型&#xff1a;numpy.ndarray&#xff08;用户可能误认为是列表&#xff0c;但实际是 NumPy 数组&#xff09;。 对 NaN 的处理&#xff1a;包含 …...

数组理论基础

什么是数组 在Java中&#xff0c;数组是一种数据结构&#xff0c;用来存储同一类型的多个元素。这些元素可以按照索引访问&#xff0c;方便对数据进行操作和管理。数组在编程中应用广泛&#xff0c;是一种基本且重要的数据结构。 数组的基本概念 1. 元素&#xff1a;数组中的…...

Linux操作系统--静态库和动态库的生成and四种解决加载找不到动态库的四种方法

目录 必要的知识储备&#xff1a; 生成静态库&#xff1a; 生成动态库&#xff1a; 解决加载找不到动态库的四种方法&#xff1a; 第一种&#xff1a;拷贝到系统默认的库路径 /usr/lib64/ 第二种&#xff1a;在系统默认的库路径/usr/lib64/下建立软链接 第三种&#xff1…...

安科瑞能源管理系统如何解决工业园区能源管理难,运维成本高的问题?

一、行业痛点&#xff1a;高能耗背后的“隐形炸弹 1. 能源管理粗放&#xff1a;水、电、气、冷热等多类型能源分散管理&#xff0c;人工抄表效率低&#xff0c;跑冒滴漏难追踪。 2. 电能质量隐患&#xff1a;变频设备引发谐波干扰&#xff0c;导致设备停机、电容器烧毁&#…...

大模型赋能工业制造革新:10个显效可落地的应用场景

在工业4.0的汹涌浪潮中&#xff0c;制造业正面临着前所未有的转型挑战。传统制造模式在效率、成本、质量等方面逐渐难以满足市场需求&#xff0c;企业急需借助新技术实现数字化转型&#xff0c;以提升自身竞争力。在此背景下&#xff0c;基于先进的数据分析技术、大模型、知识图…...

【android bluetooth 框架分析 02】【Module详解 4】【Btaa 模块介绍】

1. 背景 我们在上一篇文章中介绍 HciHal 模块时&#xff0c;有如下代码 // system/gd/hal/hci_hal_android_hidl.ccvoid ListDependencies(ModuleList* list) const {list->add<SnoopLogger>();if (common::init_flags::btaa_hci_is_enabled()) {list->add<ac…...

gitee新的仓库,Vscode创建新的分支详细步骤

第一步点击创建分支输入新分支的名字 第二步 第三步 第四步...

OpenHarmony - 小型系统内核(LiteOS-A)(五)

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;五&#xff09; 六、文件系统 虚拟文件系统 基本概念 VFS&#xff08;Virtual File System&#xff09;是文件系统的虚拟层&#xff0c;它不是一个实际的文件系统&#xff0c;而是一个异构文件系统之…...

Unity动态合批(Dynamic Batching)解析

什么是动态合批&#xff1f; 动态合批是Unity引擎的一项核心优化技术&#xff0c;用于减少绘制调用&#xff08;Draw Calls&#xff09;数量&#xff0c;提高游戏性能。它通过将多个使用相同材质的小型可移动物体的渲染操作合并为单个绘制调用&#xff0c;减轻CPU向GPU发送命令…...

【Python】迭代器(Iterator)vs 生成器(Generator)

迭代器&#xff08;Iterator&#xff09; vs 生成器&#xff08;Generator&#xff09; 1.迭代器&#xff08;Iterator&#xff09;1.1 是什么&#xff1f;1.2 示例1.3 适用场景 2.生成器&#xff08;Generator&#xff09;2.1 是什么&#xff1f;2.2 示例2.3 适用场景 3.迭代器…...

el-input 限制只能输入负数、正数或2位小数的数值

需求 el-input需要指定输入格式&#xff0c;当键盘事件触发时限制只能输入负数、正数或2位小数的数值。 解决方案 自定义校验数字输入的键盘事件方法函数。 具体实现步骤 1、创建验数字输入的键盘事件方法 /*** 校验数字输入的键盘事件* param {Event} event - 键盘事件对…...

对话框类别组件编写

形如如图所示的对话框的编写 一、基本组件的定义 <template><div><el-dialogclass"cust-dialog":title"title":model-value"show":show-close"showClose":top"toppx":width"widthpx":close-on-…...

ICMAN防水触摸芯片 - 复杂环境下精准交互,提升触控体验

▍核心优势 ◆ 超强抗干扰能力 ◆ 工业级设计&#xff0c;一致性和稳定性好 ▍提供场景化解决方案 【智能厨电矩阵】抽油烟机档位调节 | 电磁炉火力触控 | 洗碗机模式切换 【卫浴设备方案】淋浴房雾化玻璃控制 | 智能马桶触控面板 | 浴缸水位感应 【工业控制应用】仪器仪…...

深度剖析:生成式人工智能备案和登记的关键差异

在人工智能技术日新月异的当下&#xff0c;生成式人工智能以前所未有的态势广泛渗透至各个领域&#xff0c;从内容创作到智能客服&#xff0c;从图像生成到数据分析&#xff0c;其应用场景正呈指数级拓展。2024 年&#xff0c;网信部门协同相关部门&#xff0c;依据《生成式人工…...

kotlin + spirngboot3 + spring security6 配置登录与JWT

1. 导包 implementation("com.auth0:java-jwt:3.14.0") implementation("org.springframework.boot:spring-boot-starter-security")配置用户实体类 Entity Table(name "users") data class User(IdGeneratedValue(strategy GenerationType.I…...

d3.js绘制组合PCA边缘分布图

用d3.js研发了个组合PCA边缘分布图&#xff1b; 组合PCA边缘分布图中包括pca散点图、散点图可根据数据自动分为连续型和离散型、还有散点的各种配置、边缘有箱线边缘、密度边缘、柱状边缘一个各个边缘的配置等等&#xff0c;大部分你能想到的配置都是自行传参调整的&#xff0…...

开源语音合成模型SparkTTS使用

一、环境配置 git clone https://github.com/SparkAudio/Spark-TTS.git pip install -r requirements.txt 二、模型下载 从modelscope进行下载&#xff0c;pip install modelscope 创建一个download.py import torchfrom modelscope import snapshot_downloadsnapshot_dow…...

课程9. 数据降维

课程9. 数据降维 维度灾难奇异值分解SVD 变换SVD 的几何意义 SVD分解应用示例图像压缩文本分析推荐系统中的应用* 主成分分析PCA演示使用 PCA 降低多元数据的维数PCA 说明单词的语义相似性 t-SNE 维度灾难 机器学习和数据科学中的关键问题之一是数据高维性问题。我们已经遇到过…...