整合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…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
