java 通用导出接口

每个功能导出文件都单独写接口太过繁琐,出于方便大致讲讲通用导出功能的实现。

导出文件配置表,该表保存导出dto和导出文件名的对应关系等信息:

@TableName(value = "SIMPLE_COMMON_EXPORT_TAB")
public class SimpleCommonExportTab extends BaseEntity<SimpleCommonExportTab> {/****/@TableId(value = "ID")private String id;/****/@TableField(value = "DTO_NAME")private String dtoName;/****/@TableField(value = "TITLE")private String title;/****/@TableField(value = "EXCEL_NAME")private String excelName;/***扩展1*/@TableField(value = "EXPAND1")private String expand1;/***扩展2*/@TableField(value = "EXPAND2")private String expand2;/***扩展3*/@TableField(value = "EXPAND3")private String expand3;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getDtoName() {return dtoName;}public void setDtoName(String dtoName) {this.dtoName = dtoName;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getExcelName() {return excelName;}public void setExcelName(String excelName) {this.excelName = excelName;}public String getExpand1() {return expand1;}public void setExpand1(String expand1) {this.expand1 = expand1;}public String getExpand2() {return expand2;}public void setExpand2(String expand2) {this.expand2 = expand2;}public String getExpand3() {return expand3;}public void setExpand3(String expand3) {this.expand3 = expand3;}@Overridepublic String toString() {return "SimpleCommonExportTab{" +"id='" + id + '\'' +", dtoName='" + dtoName + '\'' +", title='" + title + '\'' +", excelName='" + excelName + '\'' +", expand1='" + expand1 + '\'' +", expand2='" + expand2 + '\'' +", expand3='" + expand3 + '\'' +'}';}@Overrideprotected Serializable pkVal() {return this.id;}
}

示例数据:
在这里插入图片描述

CommonAttachFile 文件类,一般文件上传或下载均会在该表生成一条记录:

@TableName(value = "COMMON_ATTACH_FILE")
public class CommonAttachFile extends BaseEntity<CommonAttachFile> {/*** 主键*/@TableId(value = "ID")private String id;/**** 模块*/@TableField(value = "MODULE")private String module;/*** 附件名称*/@TableField(value = "FILE_NAME")private String fileName;/*** 附件路径*/@TableField(value = "FILE_PATH")private String filePath;/*** 附件大小*/@TableField(value = "FILE_SIZE")private String fileSize;/*** 附件类型*/@TableField(value = "FILE_TYPE")private String fileType;/*** 关联附件的主键*/@TableField(value = "COMMON_ID")private String commonId;/*** 附件所属表类型*/@TableField(value = "COMMON_TYPE")private String commonType;/*** 备注*/@TableField(value = "REMARK")private String remark;public CommonAttachFile() {}public CommonAttachFile(String fileName, String filePath, String fileSize, String fileType) {this.fileName = fileName;this.filePath = filePath;this.fileSize = fileSize;this.fileType = fileType;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public String getFileSize() {return fileSize;}public void setFileSize(String fileSize) {this.fileSize = fileSize;}public String getFileType() {return fileType;}public void setFileType(String fileType) {this.fileType = fileType;}public String getCommonId() {return commonId;}public void setCommonId(String commonId) {this.commonId = commonId;}public String getCommonType() {return commonType;}public void setCommonType(String commonType) {this.commonType = commonType;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public String getModule() {return module;}public void setModule(String module) {this.module = module;}@Overridepublic String toString() {return "CommonAttachFile{" +"id='" + id + '\'' +", fileName='" + fileName + '\'' +", filePath='" + filePath + '\'' +", fileSize='" + fileSize + '\'' +", fileType='" + fileType + '\'' +", commonId='" + commonId + '\'' +", commonType='" + commonType + '\'' +", remark='" + remark + '\'' +'}';}@Overrideprotected Serializable pkVal() {return this.id;}

ExportExcel类:

public class ExportExcel {private static Logger log = LoggerFactory.getLogger(ExportExcel.class);/*** 工作薄对象*/private SXSSFWorkbook wb;/*** 工作表对象*/private Sheet sheet;/*** 样式列表*/private Map<String, CellStyle> styles;/*** 当前行号*/private int rownum;/*** 注解列表(Object[]{ ExcelField, Field/Method })*/List<Object[]> annotationList = Lists.newArrayList();/*** 构造函数** @param title 表格标题,传“空值”,表示无标题* @param cls   实体对象,通过annotation.ExportField获取标题*/public ExportExcel(String title, Class<?> cls) {this(title, cls, 1);}/*** 构造函数** @param title  表格标题,传“空值”,表示无标题* @param cls    实体对象,通过annotation.ExportField获取标题* @param type   导出类型(1:导出数据;2:导出模板)* @param groups 导入分组*/public ExportExcel(String title, Class<?> cls, int type, int... groups) {// Get annotation fieldField[] fs = cls.getDeclaredFields();for (Field f : fs) {ExcelField ef = f.getAnnotation(ExcelField.class);if (ef != null && (ef.type() == 0 || ef.type() == type)) {if (groups != null && groups.length > 0) {boolean inGroup = false;for (int g : groups) {if (inGroup) {break;}for (int efg : ef.groups()) {if (g == efg) {inGroup = true;annotationList.add(new Object[]{ef, f});break;}}}} else {annotationList.add(new Object[]{ef, f});}}}// Get annotation methodMethod[] ms = cls.getDeclaredMethods();for (Method m : ms) {ExcelField ef = m.getAnnotation(ExcelField.class);if (ef != null && (ef.type() == 0 || ef.type() == type)) {if (groups != null && groups.length > 0) {boolean inGroup = false;for (int g : groups) {if (inGroup) {break;}for (int efg : ef.groups()) {if (g == efg) {inGroup = true;annotationList.add(new Object[]{ef, m});break;}}}} else {annotationList.add(new Object[]{ef, m});}}}// Field sortingCollections.sort(annotationList, new Comparator<Object[]>() {public int compare(Object[] o1, Object[] o2) {return new Integer(((ExcelField) o1[0]).sort()).compareTo(new Integer(((ExcelField) o2[0]).sort()));};});// InitializeList<String> headerList = Lists.newArrayList();for (Object[] os : annotationList) {String t = ((ExcelField) os[0]).title();// 如果是导出,则去掉注释if (type == 1) {String[] ss = StringUtils.split(t, "**", 2);if (ss.length == 2) {t = ss[0];}}headerList.add(t);}initialize(title, headerList);}/*** 构造函数** @param title   表格标题,传“空值”,表示无标题* @param headers 表头数组*/public ExportExcel(String title, String[] headers) {initialize(title, Lists.newArrayList(headers));}/*** 构造函数** @param title      表格标题,传“空值”,表示无标题* @param headerList 表头列表*/public ExportExcel(String title, List<String> headerList) {initialize(title, headerList);}/*** 初始化函数** @param title      表格标题,传“空值”,表示无标题* @param headerList 表头列表*/private void initialize(String title, List<String> headerList) {this.wb = new SXSSFWorkbook(500);this.sheet = wb.createSheet("Export");this.styles = createStyles(wb);// Create titleif (StringUtils.isNotBlank(title)) {Row titleRow = sheet.createRow(rownum++);titleRow.setHeightInPoints(30);Cell titleCell = titleRow.createCell(0);titleCell.setCellStyle(styles.get("title"));titleCell.setCellValue(title);sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(),titleRow.getRowNum(), titleRow.getRowNum(), headerList.size() - 1));}// Create headerif (headerList == null) {throw new RuntimeException("headerList not null!");}Row headerRow = sheet.createRow(rownum++);headerRow.setHeightInPoints(16);for (int i = 0; i < headerList.size(); i++) {Cell cell = headerRow.createCell(i);cell.setCellStyle(styles.get("header"));String[] ss = StringUtils.split(headerList.get(i), "**", 2);if (ss.length == 2) {cell.setCellValue(ss[0]);Comment comment = this.sheet.createDrawingPatriarch().createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6));comment.setString(new XSSFRichTextString(ss[1]));cell.setCellComment(comment);} else {cell.setCellValue(headerList.get(i));}sheet.autoSizeColumn(i);}for (int i = 0; i < headerList.size(); i++) {int colWidth = sheet.getColumnWidth(i) * 2;sheet.setColumnWidth(i, colWidth < 3000 ? 3000 : colWidth);}log.debug("Initialize success.");}/*** 创建表格样式** @param wb 工作薄对象* @return 样式列表*/private Map<String, CellStyle> createStyles(Workbook wb) {Map<String, CellStyle> styles = new HashMap<String, CellStyle>();CellStyle style = wb.createCellStyle();style.setAlignment(CellStyle.ALIGN_CENTER);style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);Font titleFont = wb.createFont();titleFont.setFontName("Arial");titleFont.setFontHeightInPoints((short) 16);titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);style.setFont(titleFont);styles.put("title", style);style = wb.createCellStyle();style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);style.setBorderRight(CellStyle.BORDER_THIN);style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderLeft(CellStyle.BORDER_THIN);style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderTop(CellStyle.BORDER_THIN);style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderBottom(CellStyle.BORDER_THIN);style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());Font dataFont = wb.createFont();dataFont.setFontName("Arial");dataFont.setFontHeightInPoints((short) 10);style.setFont(dataFont);styles.put("data", style);style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));style.setAlignment(CellStyle.ALIGN_LEFT);styles.put("data1", style);style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));style.setAlignment(CellStyle.ALIGN_CENTER);styles.put("data2", style);style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));style.setAlignment(CellStyle.ALIGN_RIGHT);styles.put("data3", style);style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));
//		style.setWrapText(true);style.setAlignment(CellStyle.ALIGN_CENTER);style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);Font headerFont = wb.createFont();headerFont.setFontName("Arial");headerFont.setFontHeightInPoints((short) 10);headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);headerFont.setColor(IndexedColors.WHITE.getIndex());style.setFont(headerFont);styles.put("header", style);return styles;}/*** 添加一行** @return 行对象*/public Row addRow() {return sheet.createRow(rownum++);}/*** 添加一个单元格** @param row    添加的行* @param column 添加列号* @param val    添加值* @return 单元格对象*/public Cell addCell(Row row, int column, Object val) {return this.addCell(row, column, val, 0, Class.class);}/*** 添加一个单元格** @param row    添加的行* @param column 添加列号* @param val    添加值* @param align  对齐方式(1:靠左;2:居中;3:靠右)* @return 单元格对象*/public Cell addCell(Row row, int column, Object val, int align, Class<?> fieldType) {Cell cell = row.createCell(column);String cellFormatString = "@";try {if (val == null) {cell.setCellValue("");} else if (fieldType != Class.class) {cell.setCellValue((String) fieldType.getMethod("setValue", Object.class).invoke(null, val));} else {if (val instanceof String) {cell.setCellValue((String) val);} else if (val instanceof Integer) {cell.setCellValue((Integer) val);cellFormatString = "0";} else if (val instanceof Long) {cell.setCellValue((Long) val);cellFormatString = "0";} else if (val instanceof Double) {cell.setCellValue((Double) val);cellFormatString = "0.00";} else if (val instanceof Float) {cell.setCellValue((Float) val);cellFormatString = "0.00";} else if (val instanceof Date) {cell.setCellValue((Date) val);cellFormatString = "yyyy-MM-dd HH:mm";} else {cell.setCellValue((String) Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),"fieldtype." + val.getClass().getSimpleName() + "Type")).getMethod("setValue", Object.class).invoke(null, val));}}if (val != null) {CellStyle style = styles.get("data_column_" + column);if (style == null) {style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data" + (align >= 1 && align <= 3 ? align : "")));style.setDataFormat(wb.createDataFormat().getFormat(cellFormatString));styles.put("data_column_" + column, style);}cell.setCellStyle(style);}} catch (Exception ex) {log.info("Set cell value [" + row.getRowNum() + "," + column + "] error: " + ex.toString());if (val != null) {cell.setCellValue(val.toString());}}return cell;}/*** 添加数据(通过annotation.ExportField添加数据)** @return list 数据列表*/public <E> ExportExcel setDataList(List<E> list) {for (E e : list) {int colunm = 0;Row row = this.addRow();StringBuilder sb = new StringBuilder();for (Object[] os : annotationList) {ExcelField ef = (ExcelField) os[0];Object val = null;// Get entity valuetry {if (StringUtils.isNotBlank(ef.value())) {val = Reflections.invokeGetter(e, ef.value());} else {if (os[1] instanceof Field) {val = Reflections.invokeGetter(e, ((Field) os[1]).getName());} else if (os[1] instanceof Method) {val = Reflections.invokeMethod(e, ((Method) os[1]).getName(), new Class[]{}, new Object[]{});}}// If is dict, get dict label//todo 现在没有字典工具类
//                    if (StringUtils.isNotBlank(ef.dictType())) {
//                        val = DictUtils.getDictLabel(val == null ? "" : val.toString(), ef.dictType(), "");
//                    }} catch (Exception ex) {// Failure to ignorelog.info(ex.toString());val = "";}this.addCell(row, colunm++, val, ef.align(), ef.fieldType());sb.append(val + ", ");}log.debug("Write success: [" + row.getRowNum() + "] " + sb.toString());}return this;}/*** 输出数据流** @param os 输出数据流*/public ExportExcel write(OutputStream os) throws IOException {wb.write(os);return this;}/*** 输出到客户端** @param fileName 输出文件名*/public ExportExcel write(HttpServletResponse response, String fileName) throws Exception {response.reset();response.setContentType("application/octet-stream; charset=utf-8");response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode(fileName));write(response.getOutputStream());return this;}/*** 输出到文件** @param name 输出文件名*/public ExportExcel writeFile(String name) throws FileNotFoundException, IOException {FileOutputStream os = new FileOutputStream(name);this.write(os);return this;}/*** 清理临时文件*/public ExportExcel dispose() {wb.dispose();return this;}}

接下来讲讲通用导出接口的具体实现,传入参数为tabId。本项目为微服务架构,当tabId=5时,先去对应服务将要导出的数据查询出来,然后导出。

具体导出通用接口:

	@PostMapping(value = "commonExport/exportFileByParams")public Result<CommonAttachFile> commonExportFileByParams(@RequestParam Map<String, Object> params) {//第一步:根据类型或者表名判断是哪个列表的导出,调用服务查询数据( todo 此处自行根据类型扩展)CommonAttachFile dataFile = null;if (params != null) {String type = String.valueOf(params.get("tabId"));// 获取登录用户String userId = UserUtils.getUserInfo().getLoginName();//根据传入参数tabId决定导出某个文件SimpleCommonExportTab simpleCommonExportTab = simpleCommonExportTabService.selectById(type);switch (type) {case "5":Result<List<PriceNoticeExportDto>> priceNoticeExportDtos = quotationsManageClient.getPriceNoticeListDtos(params);if (CommonConstant.SUCCESS_CODE == priceNoticeExportDtos.getCode() && priceNoticeExportDtos.getData() != null && priceNoticeExportDtos.getData().size() > 0) {ExportDto dto = new ExportDto();dto.setPriceNoticeDtos(priceNoticeExportDtos.getData());dataFile = listNewExport(simpleCommonExportTab, dto, type, PriceNoticeExportDto.class);}break;/***,,,***/default:}}return Res.makeOKRsp(dataFile);}

listNewExport()方法:

private CommonAttachFile listNewExport(SimpleCommonExportTab simpleCommonExportTab, ExportDto dto, String dataId, Class cls) {CommonAttachFile dataFile = null;//存储的附件名称String fileName = DateUtils.getNowTimes() + ".xlsx";String path = "export/" + fileName;try {String filePath = Export + File.separator + path;ExportExcel exportExcel = new ExportExcel(simpleCommonExportTab.getTitle(), cls);switch (dataId) {case "5"://价格通知列表导出exportExcel.setDataList(dto.getPriceNoticeDtos());break;case "6"://价格查询列表exportExcel.setDataList(dto.getPriceAllNoticeDtos());break;case "50":// 询报价清单导出exportExcel.setDataList(dto.getRequestForQuotationsMainDtoList());break;default:}FileUtils.createDirectory(Export + File.separator + "export/");exportExcel.writeFile(filePath);dataFile = new CommonAttachFile(simpleCommonExportTab.getExcelName(),path, "", ".xlsx");dataFile.setModule("export");dataFile.setCommonType("export");commonAttachFileService.save(dataFile);return dataFile;} catch (Exception e) {e.printStackTrace();logger.error("[commonExport]", e.getMessage());}return dataFile;}

上述代码为基础版本可正常运行,但是不够完善,如果导出数据为空未反馈提示给前端,之后再做优化。

大批量数据导出可参考我的另一篇文章
java实现数据导出为excel文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/169989.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Sentinel】Sentinel簇点链路的形成

说明 一切节点的跟是 machine-root&#xff0c;同一个资源在不同链路会创建多个DefaultNode&#xff0c;但是在全局只会创建一个 ClusterNode machine-root/\/ \EntranceNode1 EntranceNode2/ \/ \DefaultNode(nodeA) DefaultNode(nodeA)|…

QGIS003:【04地图导航工具栏】-地图显示、新建视图、时态控制、空间书签操作

摘要&#xff1a;QGIS地图导航工具栏包括平移地图、居中显示、放大、缩小、全图显示、缩放到选中要素、缩放到图层、缩放到原始分辨率、上一视图、下一视图、新建地图视图、新建3D地图视图、新建空间书签、打开空间书签、时态控制面板、刷新等选项&#xff0c;本文介绍各选项的…

Zynq UltraScale+ XCZU9EG 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

智慧公厕:打造更美好的城市生活环境

在信息技术迅猛发展的今天&#xff0c;智慧公厕作为一种创新的城市管理模式&#xff0c;正逐渐受到人们的关注。以物联网、大数据、人工智能为基础&#xff0c;智慧公厕正逐步改变传统公厕的面貌&#xff0c;为城市居民提供更便捷、舒适的公共服务。本文将以智慧公厕源头厂家广…

数据结构初阶——时间复杂度

朋友们我们又见面了&#xff0c;今天我们来学习数据结构的时间复杂度&#xff0c;在讲数据结构之前&#xff0c;大家可能只知道我们学习的是数据结构&#xff0c;但是还是不知道数据结构的具体定义&#xff0c;其实就是在内存上的数据。然后我们就像通讯录一样对它进行增删查改…

SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)

SQL server中&#xff1a;常见问题汇总 1.修改表时提示&#xff1a;不允许修改表结构步骤图例注意 2.将截断字符串或二进制数据。3.在将 varchar 值 null 转换成数据类型 int 时失败。4.插入insert 、更新update、删除drop数据失败&#xff0c;主外键FOREIGN KEY 冲突5.列不允许…

SpringAOP源码解析之advice构建排序(二)

上一章我们知道Spring开启AOP之后会注册AnnotationAwareAspectJAutoProxyCreator类的定义信息&#xff0c;所以在属性注入之后initializeBean的applyBeanPostProcessorsAfterInitialization方法执行的时候调用AnnotationAwareAspectJAutoProxyCreator父类(AbstractAutoProxyCre…

三步,金蝶K3的数据可视化了

数据可视化的一大特点就是“一图胜千言”&#xff0c;没什么能比图表更直观展现数据的了。那&#xff0c;金蝶K3系统上那海量数据能不能也做成数据可视化报表&#xff1f;操作复杂吗&#xff0c;难度大吗&#xff1f; 换了别的软件来做&#xff0c;操作多、难度大是板上钉钉&a…

(ubuntu)安装nginx

文章目录 前言回顾Linux命令在线安装&#xff1a;相关命令&#xff1a;相关路径常用配置&#xff1a; 卸载nginxbug相关: 前言 提示&#xff1a;别再问我的规划是什么了&#xff1a;呼吸&#xff0c;难道不算一个吗&#xff1f; --E.M齐奥朗 回顾Linux命令 # 查看当前进程的所…

pdf误删恢复如何恢复?分享4种恢复方法!

如何将pdf误删恢复&#xff1f;使用电脑的时候&#xff0c;经常会需要使用到pdf文件&#xff0c;但是有时候&#xff0c;因为一些操作上的失误&#xff0c;我们会丢失一些重要的文件。如果你不小心将pdf误删了&#xff0c;该如何进行恢复呢&#xff1f; PDF文件丢失的原因可以…

Jenkins部署失败:JDK ‘jdk1.8.0_381‘ not supported to run Maven projects

Jenkins部署报错&#xff1a;JDK ‘jdk1.8.0_381’ not supported to run Maven projects提示使用的jdk有问题&#xff0c;启动的jdk版本不能满足项目启动。 登录Jenkins管理页面&#xff0c;系统管理——全局工具配置——JDK安装配置满足条件的JDK版本&#xff0c;保存配置&…

YOLOv7改进:新颖的上下文解耦头TSCODE,即插即用,各个数据集下实现暴力涨点

💡💡💡本文属于原创独家改进:上下文解耦头TSCODE,进行深、浅层的特征融合,最后再分别输入到头部进行相应的解码输出,实现暴力暴力涨点 上下文解耦头TSCODE| 亲测在多个数据集实现暴力涨点,对遮挡场景、小目标场景提升也明显; 收录: YOLOv7高阶自研专栏介绍: …

零售数据分析模板分享(通用型)

零售数据来源多&#xff0c;数据量大&#xff0c;导致数据的清洗整理工作量大&#xff0c;由于零售的特殊性&#xff0c;其指标计算组合更是多变&#xff0c;进一步导致了零售数据分析工作量激增&#xff0c;往往很难及时分析数据&#xff0c;发现问题。那怎么办&#xff1f;可…

模仿企业微信界面

备注&#xff1a;未实现相关功能&#xff0c;仅模仿界面&#xff0c;不能作为商业用途&#xff0c;若有侵权&#xff0c;请联系删除。 <Window x:Class"模仿企业微信界面.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"…

CVE-2023-46227 Apache inlong JDBC URL反序列化漏洞

项目介绍 Apache InLong&#xff08;应龙&#xff09;是一站式、全场景的海量数据集成框架&#xff0c;同时支持数据接入、数据同步和数据订阅&#xff0c;提供自动、安全、可靠和高性能的数据传输能力&#xff0c;方便业务构建基于流式的数据分析、建模和应用。 项目地址 h…

Linux系统安装redis并配置为服务

一、Linux环境 1、下载 官网提供的源码下载地址&#xff1a; https://github.com/redis/redis/archive/7.0.5.tar.gz 2、将源码上传至服务器 3、解压缩 # 将解压缩后的文件放置在同目录的source文件夹下 tar -zxvf redis-7.0.5.tar.gz -C ./source4、编译安装 对源码进行编…

FFmpeg 解析Glide 缓存下的图片文件报错(Impossible to open xxx)

简单介绍下背景 我们业务有个功能把图片放到一个文件中&#xff0c;统一进行播放 &#xff0c;但是遇到一个棘手问题&#xff0c;某一个情况下 的图片 就是打不开 就是报错。以为是编译参数 。哪些格式没有加上。但经过测试 该加的都加了。 所以 不是编译参数的问题。 Impossi…

ElasticSearch:实现高效数据搜索与分析的利器!项目中如何应用落地,让我带你实操指南。

1.难点解答 收集到几个问题&#xff1a; elasticsearch是单独建一个项目&#xff0c;作为全文搜索使用&#xff0c;还是直接在项目中直接用&#xff1f; ES 服务器是要单独部署的&#xff0c;你可以把 ES 理解为 Redis。 新增数据时&#xff0c;插入到mysql中&#xff0c;需不…

Webpack 基础以及常用插件使用方法

目录 一、前言二、修改打包入/出口配置步骤 三、常用插件使用html-webpack-plugin打包 CSS 代码提取 CSS 代码优化压缩过程打包 less 代码打包图片文件 一、前言 本质上&#xff0c;Webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时…

多级缓存入门

文章目录 什么是多级缓存JVM进程缓存环境准备安装MySQL导入Demo工程导入商品查询页面 初识Caffeine Lua语法初识Lua第一个lua程序变量和循环Lua的数据类型声明变量循环 条件控制、函数函数条件控制 多级缓存安装OpenRestyOpenResty快速入门反向代理流程OpenResty监听请求编写it…