java每日精进 5.19【Excel 导入导出】
基于 EasyExcel 实现 Excel 的读写操作,可用于实现最常见的 Excel 导入导出等功能。
Excel 导入导出功能涉及前后端协作,后端处理数据查询、文件生成和解析,前端提供用户交互和文件下载/上传界面。以下是全流程解析,分为导出流程和导入流程。
1.1 导出流程解析
1.1.1 后端导出(PostController.java)
代码:
@GetMapping("/export")
@Operation(summary = "岗位管理")
@PreAuthorize("@ss.hasPermission('system:post:export')")
@ApiAccessLog(operateType = EXPORT)
public void export(HttpServletResponse response, @Validated PostPageReqVO reqVO) throws IOException {// ① 查询数据reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);List<PostDO> list = postService.getPostPage(reqVO).getList();// ② 导出 ExcelExcelUtils.write(response, "岗位数据.xls", "岗位列表", PostRespVO.class,BeanUtils.toBean(list, PostRespVO.class));
}
解析:
- 功能:导出岗位数据为 Excel 文件,供前端下载。
- 步骤:
- 查询数据:
- reqVO.setPageSize(PageParam.PAGE_SIZE_NONE):禁用分页,获取所有符合条件的数据。
- postService.getPostPage(reqVO):调用服务层查询岗位数据,返回 PageResult<PostDO>。
- getList():提取数据列表(List<PostDO>)。
- 数据转换:
- BeanUtils.toBean(list, PostRespVO.class):将 PostDO 列表转换为 PostRespVO 列表,适配 Excel 导出格式。
- 导出 Excel:
- ExcelUtils.write:将数据写入 Excel 文件,设置文件名(岗位数据.xls)、Sheet 名(岗位列表)和响应头。
- 查询数据:
- 权限控制:
- @PreAuthorize("@ss.hasPermission('system:post:export')"):确保用户有导出权限。
- 日志记录:
- @ApiAccessLog(operateType = EXPORT):记录导出操作日志。
1.1.2 VO 类(PostRespVO.java)
代码:
@Schema(description = "管理后台 - 岗位信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PostRespVO {@Schema(description = "岗位序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")@ExcelProperty("岗位序号")private Long id;@Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")@ExcelProperty("岗位名称")private String name;@Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")@ExcelProperty("岗位编码")private String code;@Schema(description = "显示顺序不能为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")@ExcelProperty("岗位排序")private Integer sort;@Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")@ExcelProperty(value = "状态", converter = DictConvert.class)@DictFormat(DictTypeConstants.COMMON_STATUS)private Integer status;@Schema(description = "备注", example = "快乐的备注")private String remark;@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)private LocalDateTime createTime;
}
解析:
- 功能:定义 Excel 导出的数据结构和格式。
- 注解:
- @ExcelIgnoreUnannotated:忽略未标注 @ExcelProperty 的字段(如 remark、createTime),不导出到 Excel。
- @ExcelProperty:指定 Excel 列名(如 岗位序号、岗位名称)。
- @ExcelProperty(value = "状态", converter = DictConvert.class):使用 DictConvert 转换器,将 status(如 1)转换为文字(如 开启)。
- @DictFormat(DictTypeConstants.COMMON_STATUS):指定字典类型,映射 status 值(0=禁用, 1=开启)。
- 作用:确保导出的 Excel 列名和数据格式符合预期,字段值经过转换(如状态从数字转为文字)。
1.1.3 工具类(ExcelUtils.java - 导出部分)
代码:
public static <T> void write(HttpServletResponse response, String filename, String sheetName,Class<T> head, List<T> data) throws IOException {EasyExcel.write(response.getOutputStream(), head).autoCloseStream(false).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(new SelectSheetWriteHandler(head)).registerConverter(new LongStringConverter()).sheet(sheetName).doWrite(data);response.addHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8(filename));response.setContentType("application/vnd.ms-excel;charset=UTF-8");
}
解析:
- 功能:将数据列表写入 Excel 文件,返回给前端。
- 步骤:
- 初始化 EasyExcel:
- EasyExcel.write(response.getOutputStream(), head):使用 EasyExcel 写入响应流,指定 VO 类(如 PostRespVO)。
- 配置写入:
- autoCloseStream(false):不自动关闭流,由 Servlet 管理。
- LongestMatchColumnWidthStyleStrategy:自动调整列宽。
- SelectSheetWriteHandler:支持下拉框(基于 VO 注解)。
- LongStringConverter:防止 Long 类型精度丢失。
- 写入数据:
- sheet(sheetName).doWrite(data):写入数据到指定 Sheet(如 岗位列表)。
- 设置响应头:
- Content-Disposition:指定文件名(如 岗位数据.xls)。
- Content-Type:设置为 Excel 格式(application/vnd.ms-excel)。
- 初始化 EasyExcel:
- 作用:将 PostRespVO 列表转换为 Excel 文件,自动生成表头和数据行。
1.1.4 前端导出(post/index.vue)
代码:
handleExport() {const queryParams = this.queryParams;this.$modal.confirm('是否确认导出所有岗位数据项?').then(() => {this.exportLoading = true;return exportPost(queryParams);}).then(response => {this.$download.excel(response, '岗位数据.xls');}).finally(() => {this.exportLoading = false;});
}
解析:
- 功能:触发岗位数据导出,下载 Excel 文件。
- 步骤:
- 用户交互:
- 用户点击“导出”按钮,弹出确认框。
- 发送请求:
- exportPost(queryParams):调用后端 /admin-api/system/post/export,传递查询参数(如岗位名称、状态)。
- 处理响应:
- this.$download.excel(response, '岗位数据.xls'):将响应(Excel 文件流)保存为本地文件。
- 状态管理:
- exportLoading:控制加载状态,防止重复点击。
- 用户交互:
- 作用:提供用户界面,触发导出请求,处理下载。
1.2 导入流程解析
1.2.1 后端导入(UserController.java)
代码:
@PostMapping("/import")
@Operation(summary = "导入用户")
@Parameters({@Parameter(name = "file", description = "Excel 文件", required = true),@Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")
})
@PreAuthorize("@ss.hasPermission('system:user:import')")
public CommonResult<UserImportRespVO> importExcel(@RequestParam("file") MultipartFile file,@RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {List<UserImportExcelVO> list = ExcelUtils.read(file, UserImportExcelVO.class);return success(userService.importUserList(list, updateSupport));
}
解析:
- 功能:从 Excel 文件导入用户数据,保存到数据库。
- 步骤:
- 解析 Excel:
- ExcelUtils.read(file, UserImportExcelVO.class):读取 Excel 文件,转换为 List<UserImportExcelVO>。
- 处理数据:
- userService.importUserList(list, updateSupport):将解析的数据导入数据库,支持更新现有用户(updateSupport=true)。
- 返回结果:
- CommonResult<UserImportRespVO>:返回导入结果(如成功/失败记录数)。
- 解析 Excel:
- 参数:
- file:上传的 Excel 文件(MultipartFile)。
- updateSupport:是否更新已有用户(默认 false)。
- 权限控制:
- @PreAuthorize("@ss.hasPermission('system:user:import')"):确保用户有导入权限。
1.2.2 VO 类(UserImportExcelVO.java)
code:
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false)
public class UserImportExcelVO {@ExcelProperty("登录名称")private String username;@ExcelProperty("用户名称")private String nickname;@ExcelProperty("部门编号")private Long deptId;@ExcelProperty("用户邮箱")private String email;@ExcelProperty("手机号码")private String mobile;@ExcelProperty(value = "用户性别", converter = DictConvert.class)@DictFormat(DictTypeConstants.USER_SEX)private Integer sex;@ExcelProperty(value = "账号状态", converter = DictConvert.class)@DictFormat(DictTypeConstants.COMMON_STATUS)private Integer status;
}
解析:
- 功能:定义 Excel 导入的数据结构。
- 注解:
- @ExcelProperty:指定 Excel 列名(如 登录名称、用户名称)。
- @ExcelProperty(value = "用户性别", converter = DictConvert.class):将文字(如 男)转换为数字(如 1),基于 USER_SEX 字典。
- @DictFormat:指定字典类型(如 USER_SEX、COMMON_STATUS)。
- @Accessors(chain = false):禁用链式 setter,防止导入时序列化问题。
- 作用:映射 Excel 列到 Java 对象,确保导入数据正确解析。
1.2.3 工具类(ExcelUtils.java - 导入部分)
Code:
public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException {return EasyExcel.read(file.getInputStream(), head, null).autoCloseStream(false).doReadAllSync();
}
解析:
- 功能:从 Excel 文件读取数据,转换为 Java 对象列表。
- 步骤:
- 初始化 EasyExcel:
- EasyExcel.read(file.getInputStream(), head, null):读取 Excel 文件,指定 VO 类(如 UserImportExcelVO)。
- 读取数据:
- doReadAllSync():同步读取所有数据,返回 List<T>。
- 流管理:
- autoCloseStream(false):不自动关闭流,由 Servlet 管理。
- 初始化 EasyExcel:
- 作用:将 Excel 行转换为 UserImportExcelVO 对象,供后端处理。
1.2.4 前end导入(post/index.vue - 用户导入部分)
Code:
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body><el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers":action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading":on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip text-center" slot="tip"><div class="el-upload__tip" slot="tip"><el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据</div><span>仅允许导入xls、xlsx格式文件。</span><el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link></div></el-upload><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitFileForm">确 定</el-button><el-button @click="upload.open = false">取 消</el-button></div>
</el-dialog>
解析:
- 功能:提供用户界面,上传 Excel 文件,触发导入。
- 步骤:
- 用户交互:
- 用户点击“导入”按钮,打开对话框,选择 Excel 文件(.xls 或 .xlsx)。
- 勾选 updateSupport(是否更新现有用户)。
- 上传配置:
- accept=".xlsx, .xls":限制文件类型。
- action="upload.url + '?updateSupport=' + upload.updateSupport":动态拼接 URL(如 /admin-api/system/user/import?updateSupport=true)。
- headers:携带认证 token(Authorization: Bearer xxx)。
- on-progress:显示上传进度。
- on-success:处理导入结果,显示成功/失败信息。
- 触发上传:
- submitFileForm:调用 this.$refs.upload.submit(),发送 POST /admin-api/system/user/import 请求。
- 模板下载:
- importTemplate:下载 Excel 模板,引导用户按格式填写。
- 用户交互:
- 作用:提供用户友好的导入界面,支持文件选择和上传。
Excel 全流程总结
导出流程:
- 前端触发:用户在 post/index.vue 点击“导出”按钮,调用 handleExport,发送 GET /admin-api/system/post/export 请求。
- 后端查询:PostController 查询岗位数据(PostDO),转换为 PostRespVO。
- 后端生成 Excel:ExcelUtils.write 使用 EasyExcel 将 PostRespVO 列表写入 Excel,设置响应头。
- 前端下载:前端接收 Excel 文件流,调用 $download.excel 保存为 岗位数据.xls。
导入流程:
- 前端触发:用户在 post/index.vue 打开导入对话框,选择 Excel 文件,设置 updateSupport,点击“确定”触发上传。
- 前端上传:<el-upload> 发送 POST /admin-api/system/user/import 请求,携带 Excel 文件和参数。
- 后端解析:UserController 使用 ExcelUtils.read 解析 Excel 为 List<UserImportExcelVO>。
- 后一致性:userService.importUserList 处理数据,保存到数据库,返回导入结果(UserImportRespVO)。
- 前端反馈:前端显示导入结果(如成功/失败记录数)。
字段转换原理解析
EasyExcel Converter 接口:
- EasyExcel 的 Converter 接口用于在 Excel 和 Java 对象之间进行字段值转换,处理数据格式不一致的情况(如 Excel 中的文字与 Java 中的数字)。
- 核心方法:
- convertToJavaData:将 Excel 单元格值转换为 Java 对象字段值。
- 示例:Excel 的“开启”转换为 Java 的 status = 1。
- convertToExcelData:将 Java 对象字段值转换为 Excel 单元格值。
- 示例:Java 的 status = 1转换为 Excel 的“开启”。
- convertToJavaData:将 Excel 单元格值转换为 Java 对象字段值。
DictConvert 作用:
- DictConvert 是自定义转换器,基于字典框架(DictFrameworkUtils)实现字段值与字典标签的转换。
- 用途:将数字(如 1)与文字(如 开启)相互映射,常用于状态、性别等枚举字段。
2. DictConvert 代码解析
以下是 DictConvert 的代码和逐行解析:
@Slf4j
public class DictConvert implements Converter<Object> {@Overridepublic Class<?> supportJavaTypeKey() {throw new UnsupportedOperationException("暂不支持,也不需要");}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {throw new UnsupportedOperationException("暂不支持,也不需要");}@Overridepublic Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {// 使用字典解析String type = getType(contentProperty);String label = readCellData.getStringValue();String value = DictFrameworkUtils.parseDictDataValue(type, label);if (value == null) {log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label);return null;}// 将 String 的 value 转换成对应的属性Class<?> fieldClazz = contentProperty.getField().getType();return Convert.convert(fieldClazz, value);}@Overridepublic WriteCellData<String> convertToExcelData(Object object, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {// 空时,返回空if (object == null) {return new WriteCellData<>("");}// 使用字典格式化String type = getType(contentProperty);String value = String.valueOf(object);String label = DictFrameworkUtils.getDictDataLabel(type, value);if (label == null) {log.error("[convertToExcelData][type({}) 转换不了 label({})]", type, value);return new WriteCellData<>("");}// 生成 Excel 小表格return new WriteCellData<>(label);}private static String getType(ExcelContentProperty contentProperty) {return contentProperty.getField().getAnnotation(DictFormat.class).value();}
}
解析:
- 接口实现:
- 实现 Converter<Object>,支持任意类型的字段转换。
- supportJavaTypeKey 和 supportExcelTypeKey 未实现,表明 DictConvert 不限制字段类型,依靠注解动态处理。
- convertToJavaData(Excel -> Java):
- 获取字典类型:
- getType(contentProperty):从字段的 @DictFormat 注解获取字典类型(如 COMMON_STATUS)。
- 读取 Excel 值:
- readCellData.getStringValue():获取 Excel 单元格的字符串值(如 开启)。
- 字典解析:
- DictFrameworkUtils.parseDictDataValue(type, label):将文字(如 开启)转换为字典值(如 1)。
- 示例:COMMON_STATUS 字典可能定义 { "0": "禁用", "1": "开启" }。
- 类型转换:
- Convert.convert(fieldClazz, value):将字符串值(如 "1")转换为字段类型(如 Integer)。
- 错误处理:
- 如果 value 为 null(字典未找到对应值),记录错误日志,返回 null。
- 获取字典类型:
- convertToExcelData(Java -> Excel):
- 空值处理:
- 如果 object 为 null,返回空字符串。
- 获取字典类型:
- 同上,通过 @DictFormat 获取 type。
- 字典转换:
- DictFrameworkUtils.getDictDataLabel(type, value):将 Java 值(如 1)转换为字典标签(如 开启)。
- 返回结果:
- WriteCellData<String>(label):将标签写入 Excel 单元格。
- 错误处理:
- 如果 label 为 null,记录错误,返回空字符串。
- 空值处理:
- getType:
- 提取字段上的 @DictFormat 注解值(如 COMMON_STATUS),确定字典类型。
作用:
- 实现 Excel 和 Java 之间的双向转换,确保状态、性别等字段在导入导出时保持一致(如 1 <-> 开启)。
- 依赖 DictFrameworkUtils 提供的字典数据(如 COMMON_STATUS、USER_SEX)。
4. EasyExcel 注解解析
以下是文档中提到的 EasyExcel 注解,结合代码和上下文说明其作用,并提供实例。
4.1 @ExcelProperty
- 作用:指定 Excel 列名、序号或转换器。
- 参数:
- value:列名(如 "岗位名称")。
- index:列序号(与 value 二选一)。
- converter:转换器(如 DictConvert.class)。
- 示例:
@ExcelProperty("岗位名称") private String name;
- 输出:Excel 列名为 岗位名称,值来自 name 字段。
4.2 @ColumnWidth
- 作用:设置列宽(单位:字符)。
- 示例:
@ColumnWidth(18) @ExcelProperty("岗位编码") private String code;
- 输出:岗位编码 列宽为 18 个字符。
4.3 @ContentFontStyle
- 作用:设置单元格字体样式。
- 示例:
@ContentFontStyle(fontName = "Arial", fontHeightInPoints = 12, bold = true) @ExcelProperty("岗位名称") private String name;
- 输出:岗位名称 列使用 Arial 字体,12 磅,加粗。
4.4 @ContentLoopMerge
- 作用:合并单元格。
- 示例:
@ContentLoopMerge(eachRow = 2) @ExcelProperty("部门") private String dept;
- 输出:每 2 行合并 部门 列。
4.5 @ContentRowHeight
- 作用:设置行高。
- 示例:
@ContentRowHeight(20) @ExcelProperty("备注") private String remark;
- 输出:备注 行高为 20。
4.6 @ContentStyle
- 作用:设置单元格样式(如对齐、边框、背景色)。
- 示例:
@ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER, fillBackgroundColor = IndexedColors.YELLOW) @ExcelProperty("状态") private Integer status;
- 输出:状态 列居中,黄色背景。
4.7 @HeadFontStyle
- 作用:设置标题字体样式。
- 示例:
@HeadFontStyle(fontName = "Calibri", bold = true) @ExcelProperty("岗位名称") private String name;
- 输出:岗位名称 标题使用 Calibri 字体,加粗。
4.8 @HeadRowHeight
- 作用:设置标题行高。
- 示例:
@HeadRowHeight(25) @ExcelProperty("岗位编码") private String code;
- 输出:标题行高为 25。
4.9 @HeadStyle
- 作用:设置标题样式。
- 示例:
@HeadStyle(fillForegroundColor = IndexedColors.BLUE) @ExcelProperty("状态") private Integer status;
- 输出:状态 标题蓝色背景。
4.10 @ExcelIgnore
- 作用:忽略字段,不导出到 Excel。
- 示例:
@ExcelIgnore private String internalCode;
- 输出:internalCode 不出现在 Excel 中。
4.11 @ExcelIgnoreUnannotated
- 作用:忽略未标注 @ExcelProperty 的字段。
- 示例:
@ExcelIgnoreUnannotated public class PostRespVO { @ExcelProperty("岗位名称") private String name; private String remark; // 未标注 }
- 输出:remark 不导出。
相关文章:
java每日精进 5.19【Excel 导入导出】
基于 EasyExcel 实现 Excel 的读写操作,可用于实现最常见的 Excel 导入导出等功能。 Excel 导入导出功能涉及前后端协作,后端处理数据查询、文件生成和解析,前端提供用户交互和文件下载/上传界面。以下是全流程解析,分为导出流程…...
基于Elasticsearch的搜索引擎简介
## 一、Elasticsearch简介 Elasticsearch(简称ES)是一个开源的、分布式、RESTful风格的搜索和数据分析引擎,基于Apache Lucene开发。它能够实现对海量结构化和非结构化数据的实时存储、搜索和分析,广泛应用于全文检索、日志分析、…...
不同类型桥梁的无人机检测内容及技术难度
不同类型桥梁的无人机检测内容及技术难度 无人机桥梁检测的难度因桥梁类型、结构特点和所处环境的不同而存在显著差异。以下是针对梁桥、拱桥、斜拉桥、悬索桥等主要桥梁类型的无人机检测难度分析: 1. 梁桥(简支梁、连续梁) 检测难度&#x…...
数据结构实验10.1:内部排序的基本运算
文章目录 一,实验目的二,实验内容1. 数据生成与初始化2. 排序算法实现(1)直接插入排序(2)二分插入排序(3)希尔排序(4)冒泡排序(5)快速…...
java20
1.List集合 2.数据结构之栈,队列,数组,链表 3.ArrayList集合 4.LinkedList 5.泛型 注意:E...e是指若干个变量...
LLM笔记(九)KV缓存(2)
文章目录 1. 背景与动机2. 不使用 KV Cache 的情形2.1 矩阵形式展开2.2 计算复杂度 3. 使用 KV Cache 的优化3.1 核心思想3.2 矩阵形式展开3.3 计算复杂度对比 4. 总结5. GPT-2 中 KV 缓存的实现分析5.1 缓存的数据结构与类型5.2 在注意力机制 (GPT2Attention) 中使用缓存5.3 缓…...
将 Element UI 表格拖动功能提取为公共方法
为了在多个页面复用表格拖动功能,我们可以将其封装成以下两种形式的公共方法: 方案一:封装为 Vue 指令(推荐) 1. 创建指令文件 src/directives/tableDrag.js import interact from interactjs;export default {inse…...
项目中把webpack 打包改为vite 打包
项目痛点: 老vu e-cli1创建的项目,项目是ERP系统集成了很多很多管理,本地运行调试的时候,每次修改代码都需要等待3分钟左右的编译时间,严重影响开发效率. 解决方案: 采用vite构建项目工程 方案执行 第一步 使用vite脚手架构件一个项目,然后把build文件自定义的编译逻辑般到…...
Vue3 Element Plus 中el-table-column索引使用问题
在 Element Plus 的 el-table 组件中,使用 scope.index 是不准确的。正确的索引属性应该是 scope.$index。你的代码需要调整为: vue 复制 下载 <el-button type"primary" size"default" text click"onModifyClick(scope…...
盲盒一番赏小程序系统发展:创新玩法激发市场活力
盲盒一番赏小程序系统凭借其创新的玩法,在潮玩市场中脱颖而出,激发了市场的无限活力。它不仅保留了传统一番赏百分百中奖的特点,还结合线上平台的优势,开发出了更多新颖的玩法。 例如,小程序系统设置了赏品回收功能。…...
MySQL故障排查
目录 MySQL 单示例故障排查 故障现象一 故障现象二 故障现象三 故障现象四 故障现象五 故障现象六 故障现象七 故障现象八 MySQL主从复制排查 故障现象一 故障现象二 故障现象三 MySQL 优化 硬件方面 关于CPU 关于内存 关于磁盘 MySQL配置文件 核…...
微服务项目->在线oj系统(Java版 - 4)
相信自己,终会成功 目录 B端用户管理 C端用户代码 发送验证码: 验证验证码 退出登录 登录用户信息功能 用户详情与用户编辑 用户竞赛接口 用户报名竞赛 用户竞赛报名接口查询 用户信息列表 ThreadLocalUtil Hutool工具库 常用功能介绍 B端用户管理 进行列表显示与…...
DDoS与CC攻击:谁才是服务器的终极威胁?
在网络安全领域,DDoS(分布式拒绝服务)与CC(Challenge Collapsar)攻击是两种最常见的拒绝服务攻击方式。它们的目标都是通过消耗服务器资源,导致服务不可用,但攻击方式、威胁程度和防御策略存在显…...
旧物回收小程序,一键解决旧物处理难题
在快节奏的现代生活中,我们常常会面临旧物处理的困扰。扔掉觉得可惜,留着又占空间,而且处理起来还十分麻烦。别担心,我们的旧物回收小程序来啦,只需一键,就能轻松解决你的旧物处理难题! 这款小…...
uniapp小程序获取手机设备安全距离
utils.js let systemInfo null;export const getSystemInfo () > {if (!systemInfo) {systemInfo uni.getSystemInfoSync();// 补充安全区域默认值systemInfo.safeAreaInsets systemInfo.safeAreaInsets || {top: 0,bottom: 0,left: 0,right: 0};// 确保statusBarHei…...
小程序弹出层/抽屉封装 (抖音小程序)
最近忙于开发抖音小程序,最想吐槽的就是,既没有适配的UI框架,百度上还找不到关于抖音小程序的案列,我真的很裂开啊,于是我通过大模型封装了一套代码 效果如下 介绍 可以看到 这个弹出层是支持关闭和标题显示的…...
map与set封装
封装map和set一般分为6步: 1.封装map与set 2.普通迭代器 3.const 迭代器 4.insert返回值处理 5.map operator【】 6.key不能修改的问题 一.红黑树的改造 map与set的底层是通过红黑树来封装的,但是map与set的结点储存的值不一样,set只需要存…...
【C语言基础语法入门】通过简单实例快速掌握C语言核心概念
文章目录 1. Hello World:第一个C程序2. 变量与数据类型3. 运算符4. 控制结构4.1 if-else 条件判断4.2 for 循环4.3 while 循环 5. 函数6. 数组7. 指针8. 结构体总结 📣按照国际惯例,首先声明:本文只是我自己学习的理解࿰…...
Manus AI 突破多语言手写识别技术壁垒:创新架构、算法与应用解析
在人工智能领域,手写识别技术作为连接人类自然书写与数字世界的桥梁,一直备受关注。然而,多语言手写识别面临诸多技术挑战,如语言多样性、书写风格差异、数据稀缺性等。Manus AI 作为该领域的领军者,通过一系列创新技术…...
数字图像处理——图像压缩
背景 图像压缩是一种减少图像文件大小的技术,旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用,图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。 技术总览 当下图像压缩JPEG几乎一统天下ÿ…...
SGLang和vllm比有什么优势?
环境: SGLang vllm 问题描述: SGLang和vllm比有什么优势? 解决方案: SGLang和vLLM都是在大语言模型(LLM)推理和部署领域的开源项目或框架,它们各自有不同的设计目标和优势。下面我综合目前…...
BeanFactory和FactoryBean的区别
目录 1、Spring-core 2、控制反转(IoC) 2.1、定义 2.2、实现方式 1、BeanFactory 2、ApplicationContext 3、FactoryBean BeanFactory是容器,管理所有Bean(包括FactoryBean),FactoryBean是被管理的Bean,只是它有…...
仓颉开发语言入门教程:搭建开发环境
仓颉开发语言作为华为为鸿蒙系统自研的开发语言,虽然才发布不久,但是它承担着极其重要的历史使命。作为鸿蒙开发者,掌握仓颉开发语言将成为不可或缺的技能,今天我们从零开始,为大家分享仓颉语言的开发教程,…...
火花生态【算力通】公测,助力全球闲置算力训练AI模型
近日,在数字化浪潮迅猛推进的大背景下,人工智能模型训练对算力的需求呈井喷式增长,而全球范围内大量算力资源却处于闲置状态,如何高效整合这些闲置算力,成为推动行业发展的关键命题。在此关键时刻,火花生态旗下的核心产品【算力通】(ComputePower)于 2025 年 5 月 10 日正式开启…...
OpenMV IDE 的图像接收缓冲区原理
OpenMV IDE 的图像接收缓冲区原理与 嵌入式图像处理系统 的数据流控制密切相关。以下是其核心工作原理的分步解析: 一、图像缓冲区架构 OpenMV 的整个图像处理流程基于 双缓冲(Double Buffering)机制,主要分为以下层级࿱…...
如何在LVGL之外的线程更新UI内容
前言 作为一个刚开始学习LVGL和嵌入式开发的新手,学会绘制一个界面之后,遇到了一个问题:在LVGL线程之外的线程,更新UI内容时,会导致程序崩溃。 1、问题分析 首先,需要了解LVGL的基本工作原理。LVGL&#…...
实景VR展厅制作流程与众趣科技实景VR展厅应用
实景VR展厅制作是一种利用虚拟现实技术将现实世界中的展览空间数字化并在线上重现的技术。 这种技术通过三维重建和扫描等手段,将线下展馆的场景、展品和信息以三维形式搬到云端数字空间,从而实现更加直观、立体的展示效果。在制作过程中,首…...
Regmap子系统之六轴传感器驱动-编写icm20607.c驱动
(一)在驱动中要操作很多芯片相关的寄存器,所以需要先新建一个icm20607.h的头文件,用来定义相关寄存器值。 #ifndef ICM20607_H #define ICM20607_H /*************************************************************** 文件名 : i…...
计算机网络-HTTP与HTTPS
文章目录 计算机网络网络模型网络OSITCP/IP 应用层常用协议HTTP报文HTTP状态码HTTP请求类型HTTP握手过程HTTP连接HTTP断点续传HTTPSHTTPS握手过程 计算机网络 网络模型 为了解决多种设备能够通过网络相互通信,解决网络互联兼容性问题。 网络模型是计算机网络中用于…...
Text2SQL在Spark NLP中的实现与应用:将自然语言问题转换为SQL查询的技术解析
概述 SQL 仍然是当前行业中最受欢迎的技能之一 免责声明:Spark NLP 中的 Text2SQL 注释器在 v3.x(2021 年 3 月)中已被弃用,不再使用。如果您想测试该模块,请使用 Spark NLP for Healthcare 的早期版本。 自新千年伊…...
Ubuntu20.04下使用dpkg方式安装WPS后,将WPS改为中文界面方法
Ubuntu20.04下使用dpkg方式安装WPS后,将WPS改为中文界面方法 说明方法 说明 Ubuntu20.04下使用dpkg方式安装WPS后,打开WPS后,发现界面是英文的,如有需要可以按照下面的方法将其改为中文界面。 方法 cd /opt/kingsoft/wps-offic…...
OpenCV CUDA 模块中的矩阵算术运算-----在频域(复数频谱)中执行逐元素乘法并缩放的函数mulAndScaleSpectrums()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 mulAndScaleSpectrums()是OpenCV CUDA模块中用于在频域(复数频谱)中执行逐元素乘法并缩放 的函数。 这个函数主要用于在…...
批量剪辑 + 矩阵分发 + 数字人分身源码搭建全技术解析,支持OEM
在互联网内容生态蓬勃发展的当下,企业与创作者对内容生产与传播效率的要求日益增长。批量剪辑、矩阵分发和数字人分身技术的融合,成为提升内容创作与运营效能的关键方案。从源码层面实现三者的搭建与整合,需要深入理解各功能技术原理…...
Spring Boot 与 RabbitMQ 的深度集成实践(三)
高级特性实现 消息持久化 在实际的生产环境中,消息的可靠性是至关重要的。消息持久化是确保 RabbitMQ 在发生故障或重启后,消息不会丢失的关键机制。它涉及到消息、队列和交换机的持久化配置。 首先,配置队列持久化。在创建队列时…...
部署java项目
1.编写shell脚本部署服务 restart.sh #!/bin/bash # # start the user program # echo "-------------------- start jk service --------------------" LOG_DIR"/home/joy/usr/app/ers-log" LOG_FILE"$LOG_DIR/log_$(date "%Y%m%d").txt&…...
中国城市间交通驾车距离矩阵(2024)
中国城市间交通驾车距离矩阵(2024) 1852 数据简介 中国城市中心的交通驾车距离,该数据为通过审图号GS(2024)0650的中国城市地图得其城市中心距离,再通过高德地图api计算得出其交通驾车最短距离矩阵,单位为KM,方便大家研究使用。…...
物联网数据湖架构
物联网海量数据湖分析架构(推荐实践) ┌──────────────┐ │ IoT设备端 │ └──────┬───────┘│(MQTT/HTTP)▼ ┌──────────────┐ │ EMQX等 │ 可选(也可…...
Python将Excel单元格某一范围生成—截图(进阶版—带样式+批量+多级表头)
目录 专栏导读1、库的介绍2、库的安装3、核心代码4、通用版——带样式5、进阶版(可筛选+自动截图)多级表头版总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该…...
使用Python将 Excel 中的图表、形状和其他元素导出为图片
目录 为什么将 Excel 中的图表、形状和其他元素导出为图片? 工具与设置 Python 将 Excel 图表导出为图片 将图表导出为图片 将图表工作表导出为图片 Python 将 Excel 中的形状和其他元素导出为图片 微软 Excel 是一个功能强大的数据分析和可视化工具ÿ…...
从编程助手到AI工程师:Trae插件Builder模式实战Excel合并工具开发
Trae插件下载链接:https://www.trae.com.cn/plugin 引言:AI编程工具的新纪元 在软件开发领域,AI辅助编程正在经历一场革命性的变革。Trae插件(原MarsCode编程助手)最新推出的Builder模式,标志着AI编程工具…...
AI大模型从0到1记录学习numpy pandas day25
第 3 章 Pandas 3.1 什么是Pandas Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)…...
【云实验】Excel文件转存到RDS数据库
实验名称:Excel文件转存到RDS数据库 说明:把Excel的数据通过数据管理服务DMS(Data Management Service)导入到RDS MySQL数据库中。 流程:创建一个RDS for MySQL的实例,再创建数据库和账号,通过D…...
用Python实现数据库数据自动化导出PDF报告:从MySQL到个性化文档的全流程实践
本文将介绍如何使用Python构建一个自动化工具,实现从MySQL数据库提取员工数据,并为每位员工生成包含定制化表格的PDF报告。通过该方案,可显著提升数据导出效率,避免手动操作误差,同时支持灵活的格式定制。 需求&#…...
深入理解 ZAB:ZooKeeper 原子广播协议的工作原理
目录 ZAB 协议:ZooKeeper 如何做到高可用和强一致?🔒ZAB 协议的核心目标 🎯ZAB 协议的关键概念 💡ZAB 协议的运行阶段 🎬阶段一:Leader 选举 (Leader Election) 🗳️阶段二ÿ…...
Javascript本地存储的方式有哪些?区别及应用场景?(含Deep Seek讲解)
JavaScript本地存储方式的区别与适用场景 1. Cookie 特点: Cookie是一种较早的本地存储技术,主要通过HTTP协议在客户端和服务器之间传递数据。它的大小通常被限制为4KB以内,并且每次HTTP请求都会携带Cookie信息。缺点: 数据量有限制(最多4K…...
二元Logistic回归
二元Logistic回归 在机器学习领域,二元Logistic回归是一种非常经典的分类模型,广泛用于解决具有两类标签的分类问题。Logistic回归通过逻辑函数(Sigmoid函数)将预测结果映射到概率值,并进行分类。 一、Logistic回归 …...
Android framework 问题记录
一、休眠唤醒,很快熄屏 1.1 问题描述 机器休眠唤醒后,没有按照约定的熄屏timeout 进行熄屏,很快就熄屏(约2s~3s左右) 1.2 原因分析: 抓取相关log,打印休眠背光 相关调用栈 //具体打印调用栈…...
企业网站架构部署与优化 --web技术与nginx网站环境部署
一、Web 基础 本节将介绍Web 基础知识,包括域名的概念、DNS 原理、静态网页和动态网页的 相关知识。 1、域名和DNS 1.1、域名的概念 网络是基于TCP/IP 协议进行通信和连接的,每一台主机都有一个唯一的标识(固定的IP 地址),用以区别在网络上成千上万个用户和计算机。…...
Scala与Spark:原理、实践与技术全景详解
Scala与Spark:原理、实践与技术全景详解 一、引言 在大数据与分布式计算领域,Apache Spark 已成为事实标准的计算引擎,而 Scala 作为其主要开发语言,也逐渐成为数据工程师和后端开发者的必备技能。本文将系统梳理 Scala 语言基础…...
【聚类】层次聚类
层次聚类 文章目录 层次聚类1. 算法介绍2. 公式及原理3. 伪代码 1. 算法介绍 背景与目标 层次聚类(Hierarchical Clustering)是一类无需事先指定簇数的聚类方法,通过构造一棵“树状图”(dendrogram)来呈现数据的多层次…...