整合EasyExcel实现灵活的导入导出java
- 引入pom依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId></dependency>
-
实现功能
结合Vue前端,实现浏览器页面直接导出日志文件实现文件的灵活导入
文件导出
3. 实体类
实体类里有自定义转换器:用于Java类型数据和Excel类型数据的转换,非常使用。结合注解,可以非常方便的进行Excel文件导出。
/*** <p>* 操作日志信息* </p>** home.php?mod=space&uid=686208 horse* home.php?mod=space&uid=441028 2020-09-08* 注意: 实体类中如果使用@Accessory(chain=true),那么导入的数据无法填充到实例中,导出数据不受影响*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("tb_operational_log")
@ApiModel(value = "OperationalLog对象", description = "操作日志信息")
public class OperationalLog implements Serializable {private static final long serialVersionUID = 1L;@ExcelProperty({"操作日志", "日志ID"})@ApiModelProperty(value = "日志ID")@TableId(value = "id", type = IdType.ASSIGN_ID)private String id;@ExcelProperty({"操作日志", "操作类型"})@ApiModelProperty(value = "操作类型")private String operType;@ExcelProperty({"操作日志", "操作描述"})@ApiModelProperty(value = "操作描述")private String operDesc;@ExcelProperty({"操作日志", "操作员ID"})@ApiModelProperty(value = "操作员ID")private String operUserId;@ExcelProperty({"操作日志", "操作员名称"})@ApiModelProperty(value = "操作员名称")private String operUserName;@ExcelProperty({"操作日志", "操作方法"})@ApiModelProperty(value = "操作方法")private String operMethod;@ExcelProperty({"操作日志", "请求方法"})@ApiModelProperty(value = "请求方法")private String operRequWay;@ExcelProperty(value = {"操作日志", "请求耗时:单位-ms"}, converter = CustomRequestTimeConverter.class)@ApiModelProperty(value = "请求耗时:单位-ms")private Long operRequTime;@ExcelProperty({"操作日志", "请求参数"})@ApiModelProperty(value = "请求参数")private String operRequParams;@ExcelProperty({"操作日志", "请求Body"})@ApiModelProperty(value = "请求Body")private String operRequBody;@ExcelProperty({"操作日志", "请求IP"})@ApiModelProperty(value = "请求IP")private String operRequIp;@ExcelProperty({"操作日志", "请求URL"})@ApiModelProperty(value = "请求URL")private String operRequUrl;@ExcelProperty(value = {"操作日志", "日志标识"}, converter = CustomLogFlagConverter.class)@ApiModelProperty(value = "日志标识: 1-admin,0-portal")private Boolean logFlag;@ExcelProperty({"操作日志", "操作状态"})@ApiModelProperty(value = "操作状态:1-成功,0-失败")@TableField(value = "is_success")private Boolean success;@ExcelIgnore@ApiModelProperty(value = "逻辑删除 1-未删除, 0-删除")@TableField(value = "is_deleted")@TableLogic(value = "1", delval = "0")private Boolean deleted;@ExcelProperty(value = {"操作日志", "创建时间"}, converter = CustomTimeFormatConverter.class)@ApiModelProperty(value = "创建时间")private Date gmtCreate;
}
- 接口和具体实现
4.1 接口
@OperatingLog(operType = BlogConstants.EXPORT, operDesc = "导出操作日志,写出到响应流中")@ApiOperation(value = "导出操作日志", hidden = true)@PostMapping("/oper/export")public void operLogExport(@RequestBody List<String> logIds, HttpServletResponse response) {operationalLogService.operLogExport(logIds, response);}
4.2 具体实现
自定义导出策略HorizontalCellStyleStrategy自定义导出拦截器CellWriteHandler,更加精确的自定义导出策略
/*** 导出操作日志(可以考虑分页导出)** @param logIds* @param response*/@Overridepublic void operLogExport(List<String> logIds, HttpServletResponse response) {OutputStream outputStream = null;try {List<OperationalLog> operationalLogs;LambdaQueryWrapper<OperationalLog> queryWrapper = new LambdaQueryWrapper<OperationalLog>().orderByDesc(OperationalLog::getGmtCreate);// 如果logIds不为null,按照id查询信息,否则查询全部if (!CollectionUtils.isEmpty(logIds)) {operationalLogs = this.listByIds(logIds);} else {operationalLogs = this.list(queryWrapper);}outputStream = response.getOutputStream();// 获取单元格样式HorizontalCellStyleStrategy strategy = MyCellStyleStrategy.getHorizontalCellStyleStrategy();// 写入响应输出流数据EasyExcel.write(outputStream, OperationalLog.class).excelType(ExcelTypeEnum.XLSX).sheet("操作信息日志")// .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自适应列宽(不是很适应,效果并不佳).registerWriteHandler(strategy) // 注册上面设置的格式策略.registerWriteHandler(new CustomCellWriteHandler()) // 设置自定义格式策略.doWrite(operationalLogs);} catch (Exception e) {log.error(ExceptionUtils.getMessage(e));throw new BlogException(ResultCodeEnum.EXCEL_DATA_EXPORT_ERROR);} finally {IoUtil.close(outputStream);}}
自定义导出策略简单如下:
/*** @author Mr.Horse* @version 1.0* @description: 单元格样式策略* @date 2021/4/30 8:43*/public class MyCellStyleStrategy {/*** 设置单元格样式(仅用于测试)** @return 样式策略*/public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy() {// 表头策略WriteCellStyle headerCellStyle = new WriteCellStyle();// 表头水平对齐居中headerCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 背景色headerCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());WriteFont headerFont = new WriteFont();headerFont.setFontHeightInPoints((short) 14);headerCellStyle.setWriteFont(headerFont);// 自动换行headerCellStyle.setWrapped(Boolean.FALSE);// 内容策略WriteCellStyle contentCellStyle = new WriteCellStyle();// 设置数据允许的数据格式,这里49代表所有可以都允许设置contentCellStyle.setDataFormat((short) 49);// 设置背景色: 需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定contentCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);contentCellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());// 设置内容靠左对齐contentCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);// 设置字体WriteFont contentFont = new WriteFont();contentFont.setFontHeightInPoints((short) 12);contentCellStyle.setWriteFont(contentFont);// 设置自动换行contentCellStyle.setWrapped(Boolean.FALSE);// 设置边框样式和颜色contentCellStyle.setBorderLeft(MEDIUM);contentCellStyle.setBorderTop(MEDIUM);contentCellStyle.setBorderRight(MEDIUM);contentCellStyle.setBorderBottom(MEDIUM);contentCellStyle.setTopBorderColor(IndexedColors.RED.getIndex());contentCellStyle.setBottomBorderColor(IndexedColors.GREEN.getIndex());contentCellStyle.setLeftBorderColor(IndexedColors.YELLOW.getIndex());contentCellStyle.setRightBorderColor(IndexedColors.ORANGE.getIndex());// 将格式加入单元格样式策略return new HorizontalCellStyleStrategy(headerCellStyle, contentCellStyle);}
}
自定义导出拦截器简单如下:
/*** @author Mr.Horse* @version 1.0* @description 实现CellWriteHandler接口, 实现对单元格样式的精确控制* @date 2021/4/29 21:11*/
public class CustomCellWriteHandler implements CellWriteHandler {private static Logger logger = LoggerFactory.getLogger(CustomCellWriteHandler.class);@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {}/*** 单元格创建之后(没有写入值)** @param writeSheetHolder* @param writeTableHolder* @param cell* @param head* @param relativeRowIndex* @param isHead*/@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,Head head, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,CellData cellData, Cell cell, Head head, Integer relativeRowIndex,Boolean isHead) {}/*** 单元格处理后(已写入值): 设置第一行第一列的头超链接到EasyExcel的官网(本系统的导出的excel 0,1两行都是头,所以只设置第一行的超链接)* 这里再进行拦截的单元格样式设置的话,前面该样式将全部失效** @param writeSheetHolder* @param writeTableHolder* @param cellDataList* @param cell* @param head* @param relativeRowIndex* @param isHead*/@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex,Boolean isHead) {// 设置超链接if (isHead && cell.getRowIndex() == 0 && cell.getColumnIndex() == 0) {logger.info(" ==> 第{}行,第{}列超链接设置完成", cell.getRowIndex(), cell.getColumnIndex());CreationHelper helper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper();Hyperlink hyperlink = helper.createHyperlink(HyperlinkType.URL);hyperlink.setAddress("https://github.com/alibaba/easyexcel");cell.setHyperlink(hyperlink);}// 精确设置单元格格式boolean bool = isHead && cell.getRowIndex() == 1 &&(cell.getStringCellValue().equals("请求参数") || cell.getStringCellValue().equals("请求Body"));if (bool) {logger.info("第{}行,第{}列单元格样式设置完成。", cell.getRowIndex(), cell.getColumnIndex());// 获取工作簿Workbook workbook = writeSheetHolder.getSheet().getWorkbook();CellStyle cellStyle = workbook.createCellStyle();Font cellFont = workbook.createFont();cellFont.setBold(Boolean.TRUE);cellFont.setFontHeightInPoints((short) 14);cellFont.setColor(IndexedColors.SEA_GREEN.getIndex());cellStyle.setFont(cellFont);cell.setCellStyle(cellStyle);}}
}
4.3 前端请求
前端在基于Vue+Element的基础上实现了点击导出按钮,在浏览器页面进行下载。
// 批量导出batchExport() {// 遍历获取id集合列表const logIds = []this.multipleSelection.forEach(item => {logIds.push(item.id)})// 请求后端接口axios({url: this.BASE_API + '/admin/blog/log/oper/export',method: 'post',data: logIds,responseType: 'arraybuffer',headers: { 'token': getToken() }}).then(response => {// type类型可以设置为文本类型,这里是新版excel类型const blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' })const pdfUrl = window.URL.createObjectURL(blob)const fileName = 'HorseBlog操作日志' // 下载文件的名字// 对于<a>标签,只有 Firefox 和 Chrome(内核)支持 download 属性if ('download' in document.createElement('a')) {const link = document.createElement('a')link.href = pdfUrllink.setAttribute('download', fileName)document.body.appendChild(link)link.click()window.URL.revokeObjectURL(pdfUrl) // 释放URL 对象} else {// IE 浏览器兼容方法window.navigator.msSaveBlob(blob, fileName)}})}
测试结果:还行,基本实现了页面下载的功能
Excel文件导入
5. 文件读取配置
本配置基于泛型的方式编写,可扩展性较强。
/*** @author Mr.Horse* @version 1.0* @description: EasyExcel文件读取配置(不能让spring管理)* @date 2021/4/27 13:24*/public class MyExcelImportConfig<T> extends AnalysisEventListener<T> {private static Logger logger = LoggerFactory.getLogger(MyExcelImportConfig.class);/*** 每次读取的最大数据条数*/private static final int MAX_BATCH_COUNT = 10;/*** 泛型bean属性*/private T dynamicService;/*** 可接收任何参数的泛型List集合*/List<T> list = new ArrayList<>();/*** 构造函数注入bean(根据传入的bean动态注入)** @param dynamicService*/public MyExcelImportConfig(T dynamicService) {this.dynamicService = dynamicService;}/*** 解析每条数据都进行调用** @param data* @param context*/@Overridepublic void invoke(T data, AnalysisContext context) {logger.info(" ==> 解析一条数据: {}", JacksonUtils.objToString(data));list.add(data);if (list.size() > MAX_BATCH_COUNT) {// 保存数据saveData();// 清空listlist.clear();}}/*** 所有数据解析完成后,会来调用一次* 作用: 避免最后集合中小于 MAX_BATCH_COUNT 条的数据没有被保存** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {saveData();logger.info(" ==> 数据解析完成 <==");}/*** 保存数据: 正式应该插入数据库,这里用于测试*/private void saveData() {logger.info(" ==> 数据保存开始: {}", list.size());list.forEach(System.out::println);logger.info(" ==> 数据保存结束 <==");}/*** 在转换异常 获取其他异常下会调用本接口。我们如果捕捉并手动抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。** @param exception* @param context* @throws Exception*/@Overridepublic void onException(Exception exception, AnalysisContext context) throws Exception {logger.error(" ==> 数据解析失败,但是继续读取下一行:{}", exception.getMessage());// 如果是某一个单元格的转换异常 能获取到具体行号if (exception instanceof ExcelDataConvertException) {ExcelDataConvertException convertException = (ExcelDataConvertException) exception;logger.error("第{}行,第{}列数据解析异常", convertException.getRowIndex(), convertException.getColumnIndex());}}}
- 读取测试
@ApiOperation(value = "数据导入测试", notes = "操作日志导入测试[OperationalLog]", hidden = true)@PostMapping("/import")public R excelImport(@RequestParam("file") MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), OperationalLog.class, new MyExcelImportConfig<>(operationalLogService)).sheet().doRead();return R.ok().message("文件导入成功");}
-
附上自定义属性转换器
转换器的属性内容转换,需要根据自己的实际业务需求而定,这里仅作为简单示例
/*** @author Mr.Horse* @version 1.0* @description: 自定义excel转换器: 将操作日志的请求耗时加上单位 "ms"* @date 2021/4/27 10:25*/public class CustomRequestTimeConverter implements Converter<Long> {/*** 读取数据时: 属性对应的java数据类型** @return*/@Overridepublic Class<Long> supportJavaTypeKey() {return Long.class;}/*** 写入数据时: excel内部的数据类型,因为请求耗时是long类型,对应excel是NUMBER类型,但是加上"ms后对应的是STRING类型"** @return*/@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}/*** 读取回调** @param cellData* @param contentProperty* @param globalConfiguration* @return* @throws Exception*/@Overridepublic Long convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {// 截取字符串: "ms",转换为long类型String value = cellData.getStringValue();return Long.valueOf(value.substring(0, value.length() - 2));}@Overridepublic CellData<Long> convertToExcelData(Long value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {// 添加字符串: "ms"return new CellData<>(String.valueOf(value).concat("ms"));}
}
格式化时间
/*** @author Mr.Horse* @version 1.0* @description: {description}* @date 2021/4/27 14:01*/public class CustomTimeFormatConverter implements Converter<Date> {@Overridepublic Class<Date> supportJavaTypeKey() {return Date.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic Date convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {String value = cellData.getStringValue();return DateUtil.parse(value, DatePattern.NORM_DATETIME_PATTERN);}@Overridepublic CellData<Date> convertToExcelData(Date value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return new CellData<>(DateUtil.format(value, DatePattern.NORM_DATETIME_PATTERN));}
}相关文章:
整合EasyExcel实现灵活的导入导出java
引入pom依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId></dependency>实现功能 结合Vue前端,实现浏览器页面直接导出日志文件实现文件的灵活导入文件导出 3. 实体类 实体类里有自定义转…...
springSecurity学习之springSecurity web如何取得用户信息
web如何取得用户信息 之前说过SecurityContextHolder默认使用的是ThreadLocal来进行存储的,而且每次都会清除,但是web每次请求都会验证用户权限,这是如何做到的呢? 这是通过SecurityContextPersistenceFilter来实现的࿰…...
eclipse中的classbean导入外部class文件,clean项目后删除问题
最近被eclipse搞得头疼,下午终于解决 eclipse创建的java项目中,类的输出目录是classbean。由于项目需要,classbean目录下已经导入了外部的类,但每次clean项目时,会把class删掉。 广泛查询,eclipse不清空c…...
OBD诊断(ISO15031) 0A服务
文章目录 功能简介ISO 15765-4的诊断服务定义1、请求具有永久状态的排放相关故障诊断码2、请求具有永久状态的排放相关故障诊断码3、示例报文 功能简介 0A服务,即 Request emission-related diagnostic trouble code with permanent status(请求排放相关…...
ForCloud全栈安全体验,一站式云安全托管试用 开启全能高效攻防
对于正处于业务快速发展阶段的企业,特别是大型央国企而言,日常的安全部署和运营管理往往横跨多家子公司,所面临的挑战不言而喻。尤其是在面对当前常态化的大型攻防演练任务时,难度更是呈“几何级数”上升: 合规难 众…...
Java——————接口(interface) <详解>
1.1 接口的概念 在现实生活中,接口的例子比比皆是,比如:笔记本电脑上的USB接口,电源插座等。 电脑的USB口上,可以插:U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上,可以插ÿ…...
【C++】【继承】【子对象】【构造函数】含子对象的派生类的构造函数写法
(1)子对象的概念:若派生类A1的数据成员中包含基类A的对象a,则a为派生类A1的子对象 (2)含子对象的派生类的构造函数的执行顺序是: ①调用基类构造函数,对基类数据成员初始化 ②调用子…...
golang语言 .go文件版本条件编译,xxx.go文件指定go的编译版本必须大于等于xxx才生效的方法, 同一个项目多个go版本文件共存方法
在go语言中,我们不关是可以在编译时指定版本, 在我们的xxx.go文件中也可以指定go的运行版本,即 忽略go.mod中的版本,而是当当前的go运行版本达到指定条件后才生效的xxx.go文件。 方法如下: 我们通过在xxx.go文件的头部…...
深入浅出mediasoup—通信框架
libuv 是一个跨平台的异步事件驱动库,用于构建高性能和可扩展的网络应用程序。mediasoup 基于 libuv 构建了包括管道、信号和 socket 在内的一整套通信框架,具有单线程、事件驱动和异步的典型特征,是构建高性能 WebRTC 流媒体服务器的重要基础…...
每日一题 LeetCode03 无重复字符的最长字串
1.题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的最长字串的长度。 2 思路 可以用两个指针, 滑动窗口的思想来做这道题,即定义两个指针.一个left和一个right 并且用一个set容器,一个length , 一个maxlength来记录, 让right往右走,并且用一个set容器来…...
栈和队列(C语言)
栈的定义 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:…...
swagger-ui.html报错404
问题1:权限受限无法访问 由于采用的Shiro安全框架,需要在配置类ShiroConfig下的Shiro 的过滤器链放行该页面:【添加:filterChainDefinitionMap.put("/swagger-ui.html", "anon");】 public ShiroFilterFact…...
Milvus 核心组件(3)--- MinIO详解
目录 背景 MinIO 安装 docker desktop 安装 Ubuntu UI 在 docker 中的安装 Minio 下载及安装 启动minio docker image 保存 启动 minio web 网页 下一次启动 MinIO基本概念 基本概述 主要特性 应用场景 MinIO 使用 连接server 创建bucket 查询bucket 上传文件…...
[数据集][目标检测]婴儿车检测数据集VOC+YOLO格式1073张5类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1073 标注数量(xml文件个数):1073 标注数量(txt文件个数):1073 标注…...
JAVASE进阶day14(网络编程续TCP,日志)
TCP 三次握手 四次挥手 package com.lu.day14.tcp;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;public class Client {public static void main(String[] args) {try(Socket socket new Socket("192.…...
机器学习(五) -- 无监督学习(1) --聚类1
系列文章目录及链接 上篇:机器学习(五) -- 监督学习(7) --SVM2 下篇:机器学习(五) -- 无监督学习(1) --聚类2 前言 tips:标题前有“***”的内容…...
leetcode 116. 填充每个节点的下一个右侧节点指针
leetcode 116. 填充每个节点的下一个右侧节点指针 题目 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next …...
[C++]优先级队列
1 .了解优先级队列 优先级队列是一种容器适配器,根据一些严格的弱排序标准,专门设计使其第一个元素始终是它所包含的元素中最大的元素。 此上下文类似于堆,其中可以随时插入元素,并且只能检索最大堆元素(优先级队列中顶…...
学习大数据DAY22 Linux 基 本 指 令 3与 在 Linux 系 统 中 配 置MySQL 和 Oracle
目录 网络配置类 ps 显示系统执行的进程 kill systemctl 服务管理 配置静态 ip 常见错误---虚拟机重启网卡失败或者网卡丢失 mysql 操作 上机练习 6---安装 mysql---参考《mysql 安装》文档 解锁 scott 重启后的步骤 上机练习 7---安装 oracle---参考《oracle 安装》…...
scp 服务器复制命令
步骤如下: 终端执行如下命令 #ssh-keygen -t rsa 2. 密钥生成后会在 /root/.ssh/ 文件夹下产生两个文件 id_rsa id_rsa.pub 将 id_rsa.pub 文件复制到 152.136.121.24 执行如下命令 scp /root/.ssh/id_rsa.pub root152.136.121.24:/root/.ssh/authorized_keys…...
开源监控面板OpenClaw:从架构设计到生产部署实战指南
1. 项目概述:一个开源监控面板的诞生 在运维和开发的世界里,监控面板就像是驾驶舱里的仪表盘。没有它,你就是在盲飞。今天要聊的这个项目 xingrz/openclaw-dashboard ,就是一个由社区驱动的开源监控面板解决方案。它的名字很有意…...
Touchpoint:命令行工具集中管理工作上下文,提升开发效率
1. 项目概述:一个被低估的开发者效率工具如果你和我一样,日常开发工作需要在多个代码仓库、项目管理工具(如Jira、Linear)、文档平台(如Confluence、Notion)和沟通软件(如Slack)之间…...
Ruby中文分词利器Rurima:纯Ruby实现的高性能分词引擎详解
1. 项目概述:一个为Ruby打造的现代中文分词引擎在Ruby社区里,处理中文文本一直是个有点“硌脚”的活儿。如果你做过中文搜索、内容分析或者简单的词频统计,肯定遇到过这个经典难题:怎么把一串连续的中文字符,准确地切割…...
Windows Defender终极移除指南:高效卸载13项核心服务完整教程
Windows Defender终极移除指南:高效卸载13项核心服务完整教程 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirr…...
Bifrost:轻量高效的实时数据同步平台架构与实战
1. 项目概述:Bifrost,一个被低估的现代数据同步利器如果你正在处理跨数据库、跨数据源的数据同步任务,并且对传统ETL工具的笨重、配置复杂感到头疼,那么maximhq/bifrost这个项目绝对值得你花时间深入了解。我第一次接触Bifrost是在…...
【仿真学习框架】HoloMotion 从入门到精通:全身人形控制 Foundation Model 完全指南
HoloMotion 从入门到精通:全身人形控制 Foundation Model 完全指南 目标读者:具身智能研究者、人形机器人开发者、RL/机器人学习工程师 目录 第1章 HoloMotion 全景概览 1.1 什么是 HoloMotion 1.2 技术定位:"小脑"基座模型 1.3 4-Any 愿景与路线图 1.4 核心能力矩…...
车载以太网之要火系列 - 第46篇:郭大侠学SOME/IP (offer Service):启动时快稍后慢,断断续续哥还在
写在开篇蓉儿继续挖坑上回说到,郭靖搞清楚了Offer Service的基本原理——服务端广播“我会啥,我在这”,TTL告诉客户端有效期。郭靖合上笔记本,突然皱起眉头:“蓉儿,我有个问题——如果每个ECU都每隔1.5秒发…...
从零打造专业GitHub个人资料页:Markdown与动态集成实战指南
1. 项目概述与核心价值 在技术圈子里混了十几年,我越来越觉得,一个开发者的“数字门面”和代码能力同等重要。这个门面,很多时候就是你的GitHub主页。早些年,大家的GitHub个人页面就是个简单的仓库列表,加上一些贡献图…...
LC正弦波振荡器原理、设计与调试:从巴克豪森判据到电路实战
1. 从直流到交流:正弦波振荡器的核心价值与分类在电子电路的世界里,我们常常需要将稳定的直流电源,转换成特定频率和幅度的交流信号。这个看似“无中生有”的过程,正是正弦波振荡器的核心使命。无论是你手机里的无线通信模块、收音…...
Arm CoreLink PCK-600电源管理套件解析与应用实践
1. Arm CoreLink PCK-600电源控制套件概述在现代SoC设计中,电源管理已经成为一个关键的技术挑战。随着移动设备和物联网应用的普及,如何在保证性能的同时最大限度地降低功耗,成为芯片设计者面临的核心问题。Arm CoreLink PCK-600电源控制套件…...
