Excel导入校验
校验监听器
/*** Excel 校验监听器* @param <T>*/
public class AnalysisValidReadListener<T> extends AnalysisEventListener<T> {private static final Logger logger = LoggerFactory.getLogger(AnalysisValidReadListener.class);private static final int BATCH_COUNT = 1;private final List<T> dataList = new ArrayList<>(BATCH_COUNT);private final Class<T> type; // 记录当前解析的类private final int headRowNum; // 记录表头行号public AnalysisValidReadListener(Class<T> type, int headRowNum) {this.type = Objects.requireNonNull(type, "Type parameter cannot be null");this.headRowNum = headRowNum;}@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {int currentRow = context.readRowHolder().getRowIndex();if (currentRow == headRowNum - 1) { // 只处理第 headRowNum 行的表头logger.info("解析到表头数据: {}", JSON.toJSONString(headMap));validateHeader(headMap);}}@Overridepublic void invoke(T data, AnalysisContext context) {int rowNumber = context.readRowHolder().getRowIndex() + 1;// 进行 Excel 校验try {validateObject(data, rowNumber);dataList.add(data);} catch (RuntimeException e) {throw new RuntimeException("数据校验失败:" + e.getMessage());}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 可在此处执行数据持久化操作logger.info("所有数据解析完成,共 {} 行", dataList.size());}@Overridepublic void onException(Exception exception, AnalysisContext context) throws Exception {if (exception instanceof ExcelDataConvertException) {ExcelDataConvertException ex = (ExcelDataConvertException) exception;String columnLetter = columnIndexToLetter(ex.getColumnIndex());throw new RuntimeException(String.format("Excel解析错误:第 %d 行, 第 %s 列数据转换异常。", ex.getRowIndex() + 1, columnLetter));}throw exception;}/*** 校验表头* @param headMap*/private void validateHeader(Map<Integer, String> headMap) {Map<Integer, String> expectedIndexHeaderMap = new HashMap<>(); // 存储 index >= 0 的字段Set<String> expectedNameHeaders = new HashSet<>(); // 存储没有 index 的字段for (Field field : type.getDeclaredFields()) {ExcelProperty fieldAnnotation = field.getAnnotation(ExcelProperty.class);if (fieldAnnotation != null) {String expectedHead = fieldAnnotation.value()[0];int index = fieldAnnotation.index();if (index >= 0) {// 指定了 index 的字段expectedIndexHeaderMap.put(index, expectedHead);} else {// 没有指定 index,按名称匹配expectedNameHeaders.add(expectedHead);}}}// 校验表头列数if (headMap.size() < expectedIndexHeaderMap.size() + expectedNameHeaders.size()) {throw new RuntimeException("导入模板错误,表头列数不匹配");}// 校验 index 绑定的列for (Map.Entry<Integer, String> entry : expectedIndexHeaderMap.entrySet()) {int expectedIndex = entry.getKey();String expectedHead = entry.getValue();if (!Objects.equals(headMap.get(expectedIndex), expectedHead)) {throw new RuntimeException(String.format("表头错误,第 %d 列【%s】应为【%s】", expectedIndex + 1, headMap.get(expectedIndex), expectedHead));}}// 校验未指定 index 的列(按名称匹配)for (String expectedHead : expectedNameHeaders) {if (!headMap.containsValue(expectedHead)) {throw new RuntimeException(String.format("表头错误,缺少列名【%s】", expectedHead));}}}/*** 校验对象属性* @param obj* @param rowNumber* @param <T>*/public static <T> void validateObject(T obj, int rowNumber) {Class<?> clazz = obj.getClass();Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);Object fieldValue = null;try {fieldValue = field.get(obj);} catch (IllegalAccessException e) {throw new RuntimeException("无法访问字段: " + field.getName(), e);}// 获取 ExcelProperty 映射的列名ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);String fieldName = (excelProperty != null) ? String.join(", ", excelProperty.value()) : field.getName();// 获取自定义 ExcelValid 注解ExcelValid excelValid = field.getAnnotation(ExcelValid.class);if (excelValid == null) {continue; // 没有校验规则,跳过}// 必填校验if (excelValid.require() && Objects.isNull(fieldValue)) {throw new RuntimeException(String.format("第%d行,%s 数据不能为空!", rowNumber, fieldName));}// 数值范围校验if (fieldValue instanceof Number) {long numValue = ((Number) fieldValue).longValue();if (numValue < excelValid.min() || numValue > excelValid.max()) {throw new RuntimeException(String.format("第%d行,%s 数据必须在 %d 和 %d 之间!",rowNumber, fieldName, excelValid.min(), excelValid.max()));}}// 正则表达式校验(适用于字符串)if (!excelValid.pattern().isEmpty() && fieldValue instanceof String) {String regex = excelValid.pattern();String value = (String) fieldValue;// 正则校验if (!value.matches(regex)) {throw new RuntimeException(String.format("第%d行,%s 数据格式不正确!", rowNumber, fieldName));}}// 日期格式校验if (!excelValid.dateFormat().isEmpty()) {final String expectedFormat = excelValid.dateFormat();// 预编译日期格式final DateTimeFormatter formatter;try {formatter = DateTimeFormatter.ofPattern(expectedFormat);} catch (IllegalArgumentException e) {throw new RuntimeException("无效的日期格式配置: " + expectedFormat, e);}if (fieldValue instanceof String) {// 字符串类型:严格校验格式匹配String dateStr = (String) fieldValue;ParsePosition pos = new ParsePosition(0);formatter.parseUnresolved(dateStr, pos);if (pos.getErrorIndex() != -1 || pos.getIndex() != dateStr.length()) {throw new RuntimeException(String.format("第%d行,%s 数据格式不正确,应为 %s 格式!", rowNumber, fieldName, excelValid.dateFormat()));}} else {// 日期对象类型:校验能否用指定格式格式化TemporalAccessor temporal = convertToTemporalAccessor(fieldValue);try {formatter.format(temporal); // 尝试格式化} catch (DateTimeException e) {throw new RuntimeException(String.format("第%d行,%s 数据格式不正确,应为 %s 格式!", rowNumber, fieldName, excelValid.dateFormat()));}}}// 校验 "是/否" 选项if (excelValid.yesNo() && Objects.nonNull(fieldValue) &&!(Objects.equals(fieldValue, "是") || Objects.equals(fieldValue, "否"))) {throw new RuntimeException("第 " + rowNumber + " 行," + fieldName + " 数据只能为【是/否】!");}// 赋默认值if (Objects.isNull(fieldValue) && !excelValid.defaultValue().isEmpty()) {try {field.set(obj, excelValid.defaultValue());} catch (IllegalAccessException e) {throw new RuntimeException(String.format("第%d行,%s 赋默认值失败!", rowNumber, fieldName));}}// 替换值逻辑:遍历替换规则,动态替换值if (Objects.nonNull(fieldValue)) {for (String rule : excelValid.replaceValues()) {String[] parts = rule.split("="); // 分割成替换对,如 "/" = " "if (parts.length == 2) {String target = parts[0].trim(); // 要替换的值String replacement = parts[1].trim(); // 替换成的值// 如果字段值与目标值相等,则进行替换if (Objects.equals(fieldValue, target)) {try {field.set(obj, replacement); // 替换值} catch (IllegalAccessException e) {throw new RuntimeException(String.format("第%d行,%s 替换 '%s' 失败!", rowNumber, fieldName, target));}}}}}}}/*** 将列索引转换为列字母* @param columnIndex* @return*/public String columnIndexToLetter(int columnIndex) {StringBuilder columnName = new StringBuilder();while (columnIndex >= 0) {columnName.insert(0, (char) ('A' + columnIndex % 26)); // 计算当前位的字母columnIndex = columnIndex / 26 - 1; // 获取上一级的索引}return columnName.toString();}/*** 将对象转换为 TemporalAccessor 以便格式化校验*/private static TemporalAccessor convertToTemporalAccessor(Object value) {if (value instanceof LocalDateTime) {return (LocalDateTime) value;} else if (value instanceof LocalDate) {return (LocalDate) value;} else if (value instanceof Date) {return ((Date) value).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();}throw new IllegalArgumentException("不支持的日期类型: " + value.getClass());}}
校验注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
/*** Excel校验注解*/
public @interface ExcelValid {boolean require() default false; // 是否必填long min() default Long.MIN_VALUE; // 最小值(适用于数字)long max() default Long.MAX_VALUE; // 最大值(适用于数字)String pattern() default ""; // 正则表达式(适用于字符串)boolean yesNo() default false; // 是否校验 "是/否"String dateFormat() default ""; // 日期格式,如 "yyyy-MM-dd"String[] replaceValues() default {}; // 替换规则,格式如 {"/=-", "X=Y"}String defaultValue() default ""; // 默认值}
通用日期转换器
package com.cloud.sa.base.common.convert;import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;/*** 通用转换器*/
public class UniversalConverter implements Converter<Object> {// 支持多种日期格式列表private static final List<DateTimeFormatter> DATE_FORMATTERS = Arrays.asList(DateTimeFormatter.ofPattern("yyyy.MM"), // yyyy.MMDateTimeFormatter.ofPattern("yyyy-MM-dd"), // yyyy-MM-ddDateTimeFormatter.ofPattern("yyyy-MM"), // yyyy-MMDateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"), // yyyy-MM-dd HH:mm:ss(24小时制)DateTimeFormatter.ofPattern("yyyy/MM/dd"), // yyyy/MM/ddDateTimeFormatter.ofPattern("yyyyMMdd"), // yyyyMMddDateTimeFormatter.ofPattern("yyyy年MM月dd日"), // 中文格式DateTimeFormatter.ofPattern("MM/dd/yyyy"), // MM/dd/yyyyDateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.ENGLISH) // 处理类似 15-May-2023);@Overridepublic Class<?> supportJavaTypeKey() {return Object.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic Object convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {if (cellData == null) {return null;}switch (cellData.getType()) {case STRING:String value = cellData.getStringValue().trim();return parseStringToDateTime(value);case NUMBER:// 处理Excel数值日期(需转换为实际日期)return convertExcelNumberToDate(cellData.getNumberValue().doubleValue());default:throw new IllegalArgumentException("无法解析的Excel单元格类型: " + cellData.getType());}}/*** 将字符串解析为LocalDateTime(支持多种格式)*/private LocalDateTime parseStringToDateTime(String value) {for (DateTimeFormatter formatter : DATE_FORMATTERS) {try {TemporalAccessor temporal = formatter.parseBest(value, LocalDateTime::from, LocalDate::from, YearMonth::from);if (temporal instanceof LocalDateTime) {return (LocalDateTime) temporal;} else if (temporal instanceof LocalDate) {return ((LocalDate) temporal).atStartOfDay();} else if (temporal instanceof YearMonth) {return ((YearMonth) temporal).atDay(1).atStartOfDay();}} catch (DateTimeParseException ignored) {// 继续尝试下一个格式}}throw new IllegalArgumentException("无法识别的日期格式: " + value);}/*** 将Excel数值转换为LocalDateTime(基于1900-01-01的序列)*/private LocalDateTime convertExcelNumberToDate(double number) {// 调整Excel的日期偏移(1900-01-1为1,且包含错误的1900-02-29)int wholeDays = (int) Math.floor(number);int millisecondsInDay = (int) ((number - wholeDays) * 24 * 60 * 60 * 1000 + 0.5);// 基准日期为1899-12-31(因为Excel从1900-01-01开始计数)LocalDateTime base = LocalDateTime.of(1899, 12, 31, 0, 0);LocalDateTime dateTime = base.plusDays(wholeDays).plus(millisecondsInDay, ChronoUnit.MILLIS);// 修正Excel的闰年错误(数值>=60时减去1天)if (wholeDays > 59) {dateTime = dateTime.minusDays(1);}return dateTime;}
}
使用方法
// 设置表头行数
int headRowNum = 2;
// 设置监听器
AnalysisValidReadListener<ProjectFileEntrustedChildrenImportForm> listener = new AnalysisValidReadListener<>(ProjectFileEntrustedChildrenImportForm.class, headRowNum);
// 读取数据
List<ProjectFileEntrustedChildrenImportForm> dataList = EasyExcel.read(file.getInputStream(), ProjectFileEntrustedChildrenImportForm.class, listener)
.sheet()
.headRowNumber(headRowNum)
.doReadSync();
设置日期转换器
@Schema(description = "建设开始时间")
@ExcelProperty(value = "建设开始时间",converter = UniversalConverter.class)
@ExcelValid(require = true, dateFormat = "yyyy.MM")
private LocalDateTime buildStartDate;
相关文章:
Excel导入校验
校验监听器 /*** Excel 校验监听器* param <T>*/ public class AnalysisValidReadListener<T> extends AnalysisEventListener<T> {private static final Logger logger LoggerFactory.getLogger(AnalysisValidReadListener.class);private static final i…...
【批量图片查找】在电脑上如何根据文件名清单一次性查找多张图片并复制到指定文件夹,基于Python的解决方案
一、应用场景 这个工具适用于以下场景: 设计师需要从大量素材中筛选特定图片复制并保存摄影师需要根据文件名批量整理照片查找筛选复制电商运营人员需要从产品库中提取特定商品图片复制到指定文件夹数据分析师需要批量收集特定图片复制保存用于处理任何需要从大量图…...
湖北理元理律师事务所观察:债务服务中的“倾听者价值”
在债务纠纷解决过程中,法律专业能力与心理支持同样重要。调研显示,72%的债务人在咨询初期存在“隐瞒真实负债”“抗拒沟通”等行为,直接影响方案有效性。湖北理元理律师事务所通过服务模式创新,尝试破解这一难题。 建立信任的三大…...
GPT-4.1特点?如何使用GPT-4.1模型,GPT-4.1编码和图像理解能力实例展示
几天前,OpenAI在 API 中推出了三个新模型:GPT-4.1、GPT-4.1 mini 和 GPT-4.1 nano。这些模型的性能全面超越 GPT-4o 和 GPT-4o mini(感觉这个GPT-4.1就是GPT-4o的升级迭代版本),主要在编码和指令跟踪方面均有显著提升。还拥有更大的上下文窗口…...
网络工程师案例分析
✅ Huawei Super VLAN 通信规则总结 🌐 基本结构 Super VLAN:逻辑 VLAN,承载三层网关(VLANIF 接口)。 Sub VLAN:实际的用户 VLAN,不配置 IP,仅做二层转发。 🔒 通信规…...
tcp/ip协议
OSI参考模型 应用层:OSI最高层。确定进程之间通信性质 协议:http:80,https:443,ftp:21,telnet:23,ssh:22,smtp:25,pop3 表示层:处理流经结点的数据编码的表示方式问题,以保证一个系统应用层发出的消息可被另一系统的应用层读出,数据压缩和加…...
小红书的视频怎么保存没有水印(方法分享)
你是不是也经常在小红书上刷到超赞的旅行vlog、美妆教程或美食探店视频,想保存下来慢慢看,却发现下载后总有烦人的水印?别急!今天教你一招,3秒轻松保存无水印高清视频,简单又实用! 为什么需要无…...
RK3568解码1080P视频时遇到系统崩溃内核挂掉的解决方案
接上篇rk3568。 实际使用 rock_mpp库硬解码时,会遇到解码1080P视频整个系统卡死,内核崩溃的问题。 以下是内核崩溃的日志,下面这句是典型的内核某块驱动挂掉的信息。 [ 292.469580] Unable to handle kernel NULL pointer dereference at…...
C++ —— Lambda 表达式
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 L…...
Keepalived相关配置和高可用
目录 一. Keepalived的工作原理 二. 实现单独的心跳网卡 三. keepalive一些优化 3.1 主从之间加密验证 3.2 修改心跳线发送时间 四. 添加独立日志 五. 抢占模式,非抢占模式,延迟抢占模式 六. 单播地址和多播地址 1. 单播地址(Unicast…...
gtest 库的安装和使用
目录 介绍 安装 使用 介绍 官方文档:GoogleTest 入门 |GoogleTest 谷歌测试 gtest 库是谷歌开源的 C测试单元框架,方便我们测试程序的正确性。 安装 sudo apt-get install libgtest-dev 使用 GTest 中的断言的宏可以分为两类: • ASS…...
Python训练营打卡——DAY30(2025.5.19)
目录 模块和库的导入 一、导入官方库 1. 标准导入:导入整个库 2. 从库中导入特定项 3. 非标准导入:导入整个库 二、模块、包的定义 三、使用案例 场景1: main.py 和 circle.py 都在同一目录 场景2: main.py 和 circle.py 都在根目录的子目录 mo…...
Django框架的前端部分使用Ajax请求一
Ajax请求 目录 1.ajax请求使用 2.增加任务列表功能(只有查看和新增) 3.代码展示集合 这篇文章, 要开始讲关于ajax请求的内容了。这个和以前文章中写道的Vue框架里面的axios请求, 很相似。后端代码, 会有一些细节点, 跟前几节文章写的有些区别。 一、ajax请求使用 我们先…...
w~自动驾驶~合集3
我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦! 在自动驾驶系统当中,感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&…...
LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetCode 131.分割回文串
LeetCode 39. 组合总和 需要注意的是题目已经明确了数组内的元素不重复(重复的话需要执行去重操作),且元素都为正整数(如果存在0,则会出现死循环)。 思路1:暴力解法 对最后结果进行去重 每一…...
C++(2)关键字+数据类型 +数据类型输入
(1)如下关键字是 不能用于定义变量名和常量名的 !。 如int int 这样就会报错 所以注意即可 。 (2)标识符命名规则 (即变量和常量的命名规则) 最主要注意 第一个 字符必须是字母或是下划线 —…...
第二道re
题目来源:天狩CTF竞赛平台 Lihuas for 题目提示说是for循环,不管了干吧 先看加没加壳,没有,直接无脑IDAF5 代码功能概述 程序会要求用户输入一个 flag,然后将输入的每个字符与索引值进行异或运算,并将结…...
【C语言内存函数】--memcpy和memmove的使用和模拟实现,memset函数的使用,memcmp函数的使用
目录 一.memcpy的使用和模拟实现 1.1--memcpy的使用演示 1.2--memcpy的模拟实现 二.memmove的使用和模拟实现 2.1--memmove的使用演示 2.2--memmove的模拟实现 三.memset函数的使用 3.1--memset的使用演示 3.2--总结 四.memcmp函数的使用 4.1--memcmp的使用演示 4.2…...
java集合详细讲解
Java 8 集合框架详解 Java集合框架是Java中最重要、最常用的API之一,Java 8对其进行了多项增强。下面我将全面讲解Java 8中的集合框架。 一、集合框架概述 Java集合框架主要分为两大类: Collection - 单列集合 List:有序可重复Set…...
UniApp 实现的文件预览与查看功能#三方框架 #Uniapp
UniApp 实现的文件预览与查看功能 前言 在开发移动应用时,文件预览功能是一个非常常见的需求。无论是查看PDF文档、图片还是Office文件,都需要一个稳定且易用的预览解决方案。本文将详细介绍如何在UniApp中实现各类文件的预览功能,并分享一…...
用户行为日志分析的常用架构
## 1. 经典Lambda架构 Lambda架构是一种流行的大数据处理架构,特别适合用户行为日志分析场景。 ### 1.1 架构组成 Lambda架构包含三层: - **批处理层(Batch Layer)**: 存储全量数据并进行离线批处理 - **实时处理层(Speed Layer)**: 处理最新数据&…...
【VBA/word】批量替换字体大小
将5号或6号字体改为10.5号字体(循环10次) AI复制的文案问题调整 Sub Change5or6ptTo16pt_10Loops()Dim rng As RangeDim doc As DocumentDim found As BooleanDim i As IntegerDim totalChanges As LongDim targetSizes As VariantDim size As VariantSe…...
C++类与对象--3 C++对象模型和this指针
3.1 类成员分开存储 成员变量和成员函数在内存中是分开存储的只有非静态成员变量是存储在对象上的 C为空对象分配1字节的空间非空对象的大小为其内部非成员变量大小总和 静态成员不占对象空间不同对象的成员函数共享一个函数实例,不占对象空间(通过th…...
DV SSL证书管理主要有哪些功能?
在互联网信息传输高速发展的今天,用户对网站安全性的要求越来越高。SSL证书已成为网站“身份认证数据加密”的标配。其中,DV SSL证书由于其签发快速、价格低廉、使用广泛,成为大量中小型网站、个人博客、电商平台的首选。然而,选择…...
el-tree结合el-tree-transfer实现穿梭框里展示树形数据
参考文章:我把他的弹框单拉出来一个独立文件作为组件方便使用,遇到一些问题记录一下。 testComponet.vue <template><div class"per_container"><div class"per_con_left"><div class"per_con_title&q…...
浅谈GC机制-三色标记和混合写屏障
标记清除法 stw(stop the world):暂停所有goroutine,扫描出可达与不可达对象,进行回收 三色标记法 不暂停,并发扫描,从根节点出发,扫描过对象的为黑,下一个可达对象为…...
Python训练营打卡 Day30
模块和库的导入 知识点回顾: 导入官方库的三种手段 直接导入整个库:使用 import library_name 语法。 导入库中的特定模块或函数:使用 from library_name import module_name 或 from library_name import function_name。 导入库并起别名&…...
深入探讨死区生成:原理、实现与应用
在电力电子、信号处理等众多领域中,“死区生成”是一个十分关键的概念,它能有效避免器件误动作、减少干扰,保障系统稳定运行。今天就通过问答的形式,和大家深入聊聊死区生成相关知识。 什么是死区生成? 死区生成是指…...
OpenCV 环境搭建与概述
// //OpenCV-4.11.0 C VS2019 // 一、OpenCV学习路线 1、入门: OpenCV图像读写、视频读写、基本像素处理、基本卷积处理、基本C开发知识。 2、初级: OpenCV自定义卷积操作、图像梯度、边缘提取、二值分析、视频分析、形态学处理、几何变换与透视变换。 3、中级: 角点查找、BL…...
c/c++的opencv均值函数
C/C 中的均值函数:从基础到应用 📊 在 C/C 编程中,计算一组数值的**均值(平均值)**是一项非常基础且常见的操作。无论是数据分析、信号处理、图像处理还是机器学习,均值函数都扮演着重要的角色。本文将详细…...
go 数据类型转换
graph TDA[整型<br>int, int8, int16, int32, int64] -->|类型转换| B[浮点型<br>float32, float64]B -->|类型转换| AA -->|类型转换| C[布尔型<br>bool]C -->|类型转换| AB -->|类型转换| D[复数型<br>complex64, complex128]D -->…...
Go内存管理
内存管理 文章目录 内存管理何为内存?内存为什么需要管理?内存管理的方式操作系统存储模型操作系统是怎么管理内存的?虚拟内存与物理内存认识虚拟内存分页管理 Golang 内存模型TCMalloc核心概念go内存管理核心概念GO内存分配GO 内存逃逸机制一…...
解决软件连接RabbitMQ突发System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接异常
一、问题描述 系统再运行时,突然出现 System.Exception: [RabbitMQ.Send Error] RabbitMQ.Client.Exceptions.AlreadyClosedException: Already closed: The AMQP operation was interrupted: AMQP close-reason, initiated by Library, code541, text“Unexpected…...
基于局部显著位置感知的异常掩码合成方法在CT图像肺部疾病异常检测与病变定位中的应用|文献速递-深度学习医疗AI最新文献
Title 题目 Local salient location-aware anomaly mask synthesis for pulmonary disease anomaly detection and lesion localization in CT images 基于局部显著位置感知的异常掩码合成方法在CT图像肺部疾病异常检测与病变定位中的应用 01 文献速递介绍 肺部疾病是全球发…...
【cursor疑惑】cursor续杯后使用agent对话时,提示“需要pro或商业订阅的用户才能使用“
背景 cursor的pro会员体验过期了,想再次体验deepseek、Claude等agent对话提示:“免费版本不可以使用agent对话功能(英文忘记截图了,大意是这样)”。 处理方法 Step-1:再次续杯cursor的pro会员14天体验 详情,见:【c…...
2022年下半年信息系统项目管理师——综合知识真题及答案(3)
2022年下半年信息系统项目管理师 ——综合知识真题及答案(3) 零、时光宝盒 (https://blog.csdn.net/weixin_69553582 逆境清醒) 此文是我2025-05-19回复头条上某作者文章时的评论记录,原作者的文章是写那些被有组织…...
华为云Flexus+DeepSeek征文|基于华为云Flexus云服务的云服务器单机部署Dify-LLM应用开发平台
目录 一、前言 二、华为云Flexus云服务优势 三、华为云Flexus一键部署Dify 3.1 选择模板 3.2 参数配置 3.3 资源栈设置 3.4 配置确认 3.5 创建执行计划 3.6 部署 四、Dify-LLM应用开发平台初体验 4.1 访问Dify-LLM应用开发平台 4.2 设置管理员账户 4.3 登录Dify-LLM应用开发平台…...
NC105NC106美光固态颗粒NC108NC109
NC105NC106美光固态颗粒NC108NC109 美光固态颗粒技术矩阵深度解析:NC105/NC106/NC108/NC109的性能博弈与市场卡位 一、技术基因图谱:解密NC系列颗粒的底层架构 1. TLC与QLC的技术路线分野 美光NC系列颗粒呈现出清晰的技术分层:NC105/NC10…...
洛谷U536262 井底之“鸡” 附视频讲解
题目截图 题目背景 2024年山东财经大学新生赛的时候,xz_chicken厌倦了在鸡舍的生活,于是决定把他的主人ZQH写成QH鸡,然而除了在第一题中已经出现了ZQH所在队伍征途再起的合影,同时xz_chicken还露出其他马脚,比如说答案…...
特征筛选方法总结(面试准备15)
非模型方法 一.FILTER过滤法: 1.缺失值比例(80%以上缺失则删除)/方差 注意: 连续变量只删方差为0的,因为变量取值范围会影响方差大小。 离散类的看各类取值占比,如果是三分类变量可以视作连续变量。 函数:V…...
深入解析分布式数据库TiDB:原理、优化与架构实践
前言 在云计算与大数据时代,传统单机数据库面临三大挑战:海量数据存储、高并发访问和实时分析需求。MySQL 分库分表方案复杂、NoSQL 缺乏 ACID 支持、MPP 数仓难以处理 OLTP… 在这样的背景下,TiDB 应运而生。作为一款开源的分布式 NewSQL 数…...
YouTube视频字幕转成文章算重复内容吗?
很多创作者误以为「自己说的话不算抄袭」,却不知道YouTube自动生成的字幕早已被搜索引擎存档。 去年就有案例:某美食博主将教程视频字幕转为图文,结果原创度检测仅42%,导致页面权重暴跌。 本文揭秘5个实操技巧:从删除…...
codeup添加流水线docker自动化部署
在项目根目录下增加Dockerfile文件 # 使用基础镜像 FROM maven:3.8.4-openjdk-17-slim AS build # 设置工作目录 WORKDIR /app # 复制项目源代码 COPY . . # 构建项目 RUN mvn clean package -DskipTests # 验证JAR包是否生成 RUN ls -l target/your-project.jar # 使用合适的…...
面试点补充
目录 1. 搭建lnmp Linux 系统基础命令 nginx相关命令 MySQL 相关命令 PHP 相关命令 验证命令 下载并部署 Discuz! X3.4 论坛 到 Nginx 网站 2. 脑裂 2.1 脑裂的定义 2.2 脑裂产生的原因 1. 主备节点之间的心跳线中断 2. 优先级冲突 3. 系统或服务负载过高 2.3 如何…...
深入解析 Oracle session_cached_cursors 参数及性能对比实验
在 Oracle 数据库管理中,session_cached_cursors参数扮演着至关重要的角色,它直接影响着数据库的性能和资源利用效率。本文将深入剖析该参数的原理、作用,并通过性能对比实验,直观展示不同参数设置下数据库的性能表现。 一、sessi…...
MyBatis:动态SQL
文章目录 动态SQLif标签trim标签where标签set标签foreach标签include标签和sql标签 Mybatis动态SQL的官方文档: https://mybatis.net.cn/dynamic-sql.html 动态SQL 动态SQL是 MyBatis的强大特性之一,如果是使用JDBC根据不同条件拼接sql很麻烦,例如拼接…...
数据库性能调优:索引设计、缓存配置与查询计划优化
在高并发、大数据量场景下,数据库性能直接影响系统稳定性与用户体验。 本文将从索引设计、缓存配置、查询计划优化三大核心维度出发,结合实战案例与代码示例,系统解析数据库性能调优的关键策略,并深入讲解 EXPLAIN ANALYZE 与 索引覆盖策略 的应用技巧。 一、索引设计:从…...
安全强化的Linux
SElinux简介 SELinux是security-Enhanced Linux的缩写,意思是安全强化的linux SELinux主要由美国国家安全局(NSA)开发,当初开发的目的是为了避免资源的误用。传统的访问控制在我们开启权限后,系统进程可以直接访问 当我们对权限设置不严谨时,这种访问方式就是系统的安全漏洞 在…...
计算机网络(2)——应用层(上)
1.应用层概述 应用层(Application Layer)属于计算机网络体系结构中的最顶层,直接面向用户,提供各种网络服务和应用程序的接口 本文主要的学习内容如下: (1)网络应用进程通信方式 客户端-服务器方式点对点方式混合方式 (2)网络应用的需求与传输…...
day017-磁盘管理-实战
文章目录 1. 硬盘命名规则2. 添加硬盘2.1 查看硬盘名称 3. 硬盘分区3.1 分区命名规则:mbr分区表格式3.2 创建分区:fdisk3.2.1 fdisk -l:查看硬盘及分区信息3.2.2 fdisk /dev/sdc :为该硬盘分区3.2.3 创建扩展分区和逻辑分区3.2.4 保存设置并退…...