JRT打印元素绘制协议之-A4Double

以前打印相信很多人因为A4打印两个报告头大过,M要把一堆报告既有A4的也有A5的还有微生物的,可能输出Page还不那么严谨。要么换页不对叠加了、要么多空白页、中间夹杂A4报告就更加头大。也有的人为了打印页码的共几页而头大。

借助新设计的优势,一举解决痛点问题:

多输出PAGE导致空白页的协议优化
在这里插入图片描述
A4打印两个的协议约定
在这里插入图片描述
文本背景的协议约定
在这里插入图片描述

PDF的协议约定
在这里插入图片描述
页码的约定
在这里插入图片描述

约定封装

    /*** 控制打印用A4打印两个的模式,业务只需要确保第一个或第二个元素是该元素即可达到A4打印两个的效果* @param A4Last 如果打印包含A4纸的话是把A4往后移还是不打乱顺序的合并A4前后的A5打印* @return*/public static PrintElement A4Double(boolean A4Last) {PrintElement ret = new PrintElement();ret.PrintType = "A4DOUBLE";if(A4Last==true){ret.PrintFlag="Last";}return ret;}/*** 输出页码元素** @param x         x坐标(*必填)* @param y         y坐标(*必填)* @param format    格式串,给空为:第{curnum}页,共{allnum}页  其他自己控制占位符* @param font      字体* @param fontSize  字体大小* @param fontStyle 字体样式* @param alignment 字体靠齐方向  Center:居中  Right:靠右  Justified或者空:靠左* @param color     颜色,html颜色 red  #ffffff这种* @param colorBK   背景颜色,html颜色 red  #ffffff这种,正常不给* @param angle     旋转角度,角度数字* @return*/public static PrintElement DrawPageNum(int x, int y, String format, String font, Integer fontSize, String fontStyle, PrintAlignment alignment, String color, String colorBK, String angle) {PrintElement ret = new PrintElement();ret.PrintX = String.valueOf(x);ret.PrintY = String.valueOf(y);//默认值if (format == null || format.isEmpty()) {format = "第{curnum}页,共{allnum}页";}ret.PrintText = format;ret.PrintFont = font;if (fontSize == null) {fontSize = 9;}ret.PrintFontSize = String.valueOf(fontSize);ret.PrintFontStyle = fontStyle;if (color == null) {color = "";}ret.PrintColor = color;if (colorBK != null && !colorBK.isEmpty()) {ret.PrintColor = ret.PrintColor + "^" + colorBK;}if (alignment != null) {ret.PrintAlignment = alignment.toString();}ret.Angle = String.valueOf(angle);ret.PrintType = "PAGENUM";return ret;}/*** 画标签** @param x         x坐标(*必填)* @param y         y坐标(*必填)* @param drawStr   要绘制的文本(*必填)* @param font      字体* @param fontSize  字体大小* @param fontStyle 字体样式* @param alignment 字体靠齐方向  Center:居中  Right:靠右  Justified或者空:靠左* @param color     颜色,html颜色 red  #ffffff这种* @param colorBK   背景颜色,html颜色 red  #ffffff这种,正常不给* @param angle     旋转角度,角度数字* @return*/public static PrintElement DrawLabel(int x, int y, String drawStr, String font, Integer fontSize, String fontStyle, PrintAlignment alignment, String color, String colorBK, String angle) {PrintElement ret = new PrintElement();ret.PrintX = String.valueOf(x);ret.PrintY = String.valueOf(y);ret.PrintText = drawStr;ret.PrintFont = font;if (fontSize == null) {fontSize = 9;}ret.PrintFontSize = String.valueOf(fontSize);ret.PrintFontStyle = fontStyle;if (color == null) {color = "";}ret.PrintColor = color;if (colorBK != null && !colorBK.isEmpty()) {ret.PrintColor = ret.PrintColor + "^" + colorBK;}if (alignment != null) {ret.PrintAlignment = alignment.toString();}ret.Angle = String.valueOf(angle);ret.PrintType = "Label";return ret;}/*** PDF文件的ftp或http全路径。用英文逗号分隔两个A5PDF路径打印会自动合并为一个A4。一个A5路径后跟个英文逗号,会把PDF转A4纸打印.单独调用打印。** @param httpOrFtpPath pdf文件的下载路径* @return*/public static PrintElement DrawFile(String httpOrFtpPath) {PrintElement ret = new PrintElement();ret.DataField = httpOrFtpPath;ret.PrintType = "FILE";return ret;}/*** PDF文件的ftp或http全路径。用英文逗号分隔两个A5PDF路径打印会自动合并为一个A4。一个A5路径后跟个英文逗号,会把PDF转A4纸打印,会把PDF每页提取成大图当一页打印** @param httpOrFtpPath pdf文件的下载路径* @return*/public static PrintElement DrawPDF(String httpOrFtpPath) {PrintElement ret = new PrintElement();ret.DataField = httpOrFtpPath;ret.PrintType = "PDF";return ret;}

实现A4Double和忽略空PAGE

    /*** 构造函数,在这里就把切页处理好,避免老模式分页逻辑太复杂,简化后续操作** @param elementList* @return 返回页数,打印页的时候下标从0开始*/public int JRTPrintDrawInit(List<DrawElement> elementList) {if (elementList != null && elementList.size() > 0) {List<DrawElement> onePage = new ArrayList<>();for (DrawElement ele : elementList) {//控制打印机的元素不用管if (ele.PrintType.contains("PRINTER")) {continue;}//控制打印PDF的元素不用管if (ele.PrintType.contains("FILE")) {AllPDFFile.add(ele);continue;}//A4打印两个的模式if (ele.PrintType.contains("A4DOUBLE")) {//A4打印两个A5模式isA4Double=true;if(ele.PrintFlag.equals("Last")){//A4移到最后isA4ToLast=true;}continue;}//按照页切割if (ele.PrintType.equals("PAGE") || ele.PrintType.equals("PDF")) {//剔除空白页,让业务可以不那么容易出空白页if (onePage.size() > 0) {allPageData.add(onePage);//存每页纸张的判断if(pageMaxPrintY>587) {pagePaper.add("A4");}else{pagePaper.add("A5");}pageMaxPrintY=0;}onePage = new ArrayList<>();}//打印PDF文件的元素元素if (ele.PrintType.equals("PDF")) {JRTPrintDraw.FileService fileService = new JRTPrintDraw.FileService();InputStream stream = null;try {//从文件服务里面下载文件if (ele.PrintImageFile == "1") {stream = fileService.DownloadStream(ele.DataField, true);} else {stream = fileService.DownloadStream(ele.DataField, false);}if (stream != null) {List<BufferedImage> images = JRTPrintDraw.PDFUtil.GetPDFImage(stream);stream.close();if (images != null && images.size() > 0) {for (BufferedImage img : images) {DrawElement graph = new DrawElement();graph.PrintX = String.valueOf(0);graph.PrintY = String.valueOf(0);graph.DataField = ImgToBase64(img);graph.PrintWidth = String.valueOf(img.getWidth() / 5);graph.PrintHeight = String.valueOf(img.getHeight() / 5);graph.PrintType = "Graph";graph.PrintFlag = "D";onePage.add(graph);//剔除空白页,让业务可以不那么容易出空白页if (onePage.size() > 0) {allPageData.add(onePage);//存每页纸张的判断if(img.getHeight() / 5>587) {pagePaper.add("A4");}else{pagePaper.add("A5");}pageMaxPrintY=0;}onePage = new ArrayList<>();}}}} catch (Exception ex) {StringWriter stringWriter = new StringWriter();ex.printStackTrace(new PrintWriter(stringWriter));WriteLog(stringWriter.toString());}continue;}//得到最大的Y坐标DealMaxY(ele);//不是分页元素才加if (!ele.PrintType.equals("PAGE")) {onePage.add(ele);}}if (onePage.size() > 0) {allPageData.add(onePage);//存每页纸张的判断if(pageMaxPrintY>587) {pagePaper.add("A4");}else{pagePaper.add("A5");}pageMaxPrintY=0;}}//A4打印两个的处理逻辑if(isA4Double==true){DealA4Double();}//设置打印的页面for(List<DrawElement> onePage:allPageData) {printPageData.add(onePage);}return allPageData.size();}/*** 处理A4打印两个*/private void DealA4Double(){//存处理的A4打印两个页List<List<DrawElement>> allA4DoublePape = new ArrayList<>();//临时放A4后移的页List<List<DrawElement>> a4LastPageTmp = new ArrayList<>();int index=-1;//当前添加A5到一页的数量int addA5Num=0;//合并一页用的临时数组List<DrawElement> mergePageTmp=new ArrayList<>();for(List<DrawElement> onePage:allPageData){index++;String paper=pagePaper.get(index);//A4页处理if(paper.equals("A4")){//中间的A4后移if(isA4ToLast==true){a4LastPageTmp.add(onePage);}else{//如果有合并的页就终止if(mergePageTmp.size()>0) {//合并满一页开始新的一页allA4DoublePape.add(mergePageTmp);mergePageTmp = new ArrayList<>();addA5Num = 0;}allA4DoublePape.add(onePage);}}//A5页处理else{addA5Num++;//上半页if(addA5Num==1){MergePage(mergePageTmp,onePage,false);}//下半页else if(addA5Num==2){MergePage(mergePageTmp,onePage,true);//如果有合并的页就终止if(mergePageTmp.size()>0) {//合并满一页开始新的一页allA4DoublePape.add(mergePageTmp);mergePageTmp = new ArrayList<>();addA5Num = 0;}}}}//如果有合并的页就终止if(mergePageTmp.size()>0) {//合并满一页开始新的一页allA4DoublePape.add(mergePageTmp);mergePageTmp = null;addA5Num = 0;}//后移的A4合并进主数据if(a4LastPageTmp.size()>0){for(List<DrawElement> onePage:a4LastPageTmp){allA4DoublePape.add(onePage);}}//替换主数据allPageData=allA4DoublePape;allA4DoublePape=null;a4LastPageTmp=null;}/*** 合并页数据* @param mergeTmp 合并的临时数据* @param addPage 要并入的页* @param addY 是否添加y,是就是A4下面*/private void MergePage(List<DrawElement> mergeTmp,List<DrawElement> addPage,boolean addY){//不添加Y的话就原封不动的转移if(addY==false){if(addPage!=null&&addPage.size()>0){for(DrawElement ele:addPage){mergeTmp.add(ele);}}}//A4下半页偏移Y坐标else{if(addPage!=null&&addPage.size()>0){for(DrawElement ele:addPage){ele.PrintY=String.valueOf(DrawConvert.ToInt32(ele.PrintY)+583);//线的终点的Y坐标if(ele.PrintType.equals("ILineN")){ele.PrintHeight=String.valueOf(DrawConvert.ToInt32(ele.PrintHeight)+583);}//多边形的Y坐标if(ele.PrintType.equals("Poly")){String [] arr=ele.PrintText.split("\\^");String polyStr = "";for(String s:arr){String [] arr1=s.split("@");if (polyStr.isEmpty()) {polyStr = arr1[0] + "@" + String.valueOf(DrawConvert.ToInt32(arr[1])+583);} else {polyStr += "^" + arr1[0] + "@" + String.valueOf(DrawConvert.ToInt32(arr[1])+583);}}ele.PrintText=polyStr;}mergeTmp.add(ele);}}}}

打印示例代码

import JRT.Core.Dto.OutParam;
import JRT.Core.Dto.OutValue;
import JRT.Core.Dto.PrintElement;
import JRT.Core.Util.PrintDrawProtocol;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;import java.awt.*;
import java.util.ArrayList;
import java.util.List;/*** 输出符合打印元素绘制协议的打印元素数据,来供打印执行层打印*/
public class PrintBarCodeTest extends BaseHttpHandlerNoSession {/*** 按传入的RowID输出符合打印元素绘制协议的数据来实现打印控制* @param RowID 业务主键* @param P1* @param P2* @param P3* @param P4* @param P5* @param P6* @param P7* @param P8* @param P9* @param P10* @param P11* @param P12* @param P13* @param Session* @param Output* @return*/public String GetData(String RowID, String P1, String P2, String P3, String P4, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws  Exception{List<PrintElement> retList=new ArrayList<>();//标志A4打印两个retList.add(PrintDrawProtocol.A4Double(true));//打印PDF文件//retList.add(PrintDrawProtocol.DrawFile("http://localhost:8080/JRTWeb/FileService/test.pdf"));retList.add(PrintDrawProtocol.DrawPDF("http://localhost:8080/JRTWeb/FileService/test.pdf"));//换页retList.add(PrintDrawProtocol.ChangePage());//换页retList.add(PrintDrawProtocol.ChangePage());//换页retList.add(PrintDrawProtocol.ChangePage());//页码retList.add(PrintDrawProtocol.DrawPageNum(720,10,"","宋体",12,"", null,"","#fda632","0"));//画logoretList.add(PrintDrawProtocol.DrawLabel(420,10,"http的logn图","宋体",22,"", null,"","#fda632","0"));retList.add(PrintDrawProtocol.DrawGraph(420,30,64,64,"http://localhost:8080/JRTWeb/FileService/logo.png",false,null));retList.add(PrintDrawProtocol.DrawLabel(420,150,"ftp的logn图","宋体",12,"", null,"","#fda632","0"));//retList.add(PrintDrawProtocol.DrawGraph(420,180,64,64,"ftp://zlz:zlz@127.0.0.1:21/ftp.png",false,null));//画一个文本retList.add(PrintDrawProtocol.DrawLabel(20,20,"zhanglianzhu","宋体",12,"", null,"","#ff5252","0"));//画一个条码retList.add(PrintDrawProtocol.DrawBarCode(20,50,"0947809",true,5,30,"","宋体",12,"",null,"","0"));//换一根横线retList.add(PrintDrawProtocol.DrawLine(20,70,70,70,1,"",""));//换一根竖线retList.add(PrintDrawProtocol.DrawLine(50,10,50,470,1,"",""));//绘制一个条码retList.add(PrintDrawProtocol.DrawQRCode(20,90,"jbase",90,90));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(20,210,"jbase打印支持","宋体",12,"",null,"","","0"));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(20,230,"20231118 22:49","宋体",12,"",null,"","","0"));//画一个点retList.add(PrintDrawProtocol.DrawPoint(20,270,10,10,"o",""));retList.add(PrintDrawProtocol.DrawPoint(100,270,10,10,"[]",""));retList.add(PrintDrawProtocol.DrawPoint(200,270,10,10,"<>",""));//画多边形List<Point> pointList=new ArrayList<>();Point p1=new Point();p1.x=10;p1.y=300;pointList.add(p1);Point p2=new Point();p2.x=100;p2.y=310;pointList.add(p2);Point p3=new Point();p3.x=50;p3.y=360;pointList.add(p3);retList.add(PrintDrawProtocol.DrawPoly(pointList,""));//画复选框retList.add(PrintDrawProtocol.DrawCheckBox(10,400,true,30,30));//画单选框retList.add(PrintDrawProtocol.DrawRadio(60,400,true,30,30));//画复选框retList.add(PrintDrawProtocol.DrawCheckBox(110,400,false,30,30));//画单选框retList.add(PrintDrawProtocol.DrawRadio(160,400,false,30,30));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(20,1010,"页尾","宋体",12,"",null,"","","0"));retList.add(PrintDrawProtocol.DrawLabel(20,900,"A4纸张打印","宋体",12,"", null,"","","0"));//换一根横线retList.add(PrintDrawProtocol.DrawLine(20,1025,700,1025,1,"",""));//换页retList.add(PrintDrawProtocol.ChangePage());//页码retList.add(PrintDrawProtocol.DrawPageNum(520,10,"","宋体",12,"", null,"","#fda632","0"));//画logoretList.add(PrintDrawProtocol.DrawLabel(420,10,"logn图","宋体",12,"", null,"","","0"));retList.add(PrintDrawProtocol.DrawGraph(420,20,64,64,"http://localhost:8080/JRTWeb/FileService/logo.png",false,null));//画一个文本retList.add(PrintDrawProtocol.DrawLabel(10,10,"这是打印的第二页","宋体",12,"", null,"","","0"));//画一个条码retList.add(PrintDrawProtocol.DrawBarCode(10,50,"0947809",true,5,30,"","宋体",12,"",null,"","0"));//换一根横线retList.add(PrintDrawProtocol.DrawLine(10,70,70,70,1,"",""));//换一根竖线retList.add(PrintDrawProtocol.DrawLine(50,10,50,470,1,"",""));//绘制一个条码retList.add(PrintDrawProtocol.DrawQRCode(10,90,"jbase",90,90));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(10,210,"jbase打印支持","宋体",12,"",null,"","","0"));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(10,230,"20231119","宋体",12,"",null,"","","0"));retList.add(PrintDrawProtocol.DrawLabel(20,500,"A5纸张打印","宋体",12,"", null,"","","0"));//画一根横线retList.add(PrintDrawProtocol.DrawLine(20,525,700,525,1,"",""));//换页retList.add(PrintDrawProtocol.ChangePage());//页码retList.add(PrintDrawProtocol.DrawPageNum(520,10,"","宋体",12,"", null,"","#fda632","0"));//画logoretList.add(PrintDrawProtocol.DrawLabel(420,10,"logn图","宋体",12,"", null,"","","0"));retList.add(PrintDrawProtocol.DrawGraph(420,20,64,64,"http://localhost:8080/JRTWeb/FileService/logo.png",false,null));//画一个文本retList.add(PrintDrawProtocol.DrawLabel(10,10,"这是打印的第三页","宋体",12,"", null,"","","0"));//画一个条码retList.add(PrintDrawProtocol.DrawBarCode(10,50,"0947809",true,5,30,"","宋体",12,"",null,"","0"));//换一根横线retList.add(PrintDrawProtocol.DrawLine(10,70,70,70,1,"",""));//换一根竖线retList.add(PrintDrawProtocol.DrawLine(50,10,50,470,1,"",""));//绘制一个条码retList.add(PrintDrawProtocol.DrawQRCode(10,90,"jbase",90,90));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(10,210,"jbase打印支持","宋体",12,"",null,"","","0"));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(10,230,"20231119","宋体",12,"",null,"","","0"));retList.add(PrintDrawProtocol.DrawLabel(20,500,"A5纸张打印","宋体",12,"", null,"","","0"));//画一根横线retList.add(PrintDrawProtocol.DrawLine(20,525,700,525,1,"",""));//换页retList.add(PrintDrawProtocol.ChangePage());//页码retList.add(PrintDrawProtocol.DrawPageNum(520,10,"","宋体",12,"", null,"","#fda632","0"));//画logoretList.add(PrintDrawProtocol.DrawLabel(420,10,"logn图","宋体",12,"", null,"","","0"));retList.add(PrintDrawProtocol.DrawGraph(420,20,64,64,"http://localhost:8080/JRTWeb/FileService/logo.png",false,null));//画一个文本retList.add(PrintDrawProtocol.DrawLabel(10,10,"这是打印的第四页","宋体",12,"", null,"","","0"));//画一个条码retList.add(PrintDrawProtocol.DrawBarCode(10,50,"0947809",true,5,30,"","宋体",12,"",null,"","0"));//换一根横线retList.add(PrintDrawProtocol.DrawLine(10,70,70,70,1,"",""));//换一根竖线retList.add(PrintDrawProtocol.DrawLine(50,10,50,470,1,"",""));//绘制一个条码retList.add(PrintDrawProtocol.DrawQRCode(10,90,"jbase",90,90));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(10,210,"jbase打印支持","宋体",12,"",null,"","","0"));//绘制一个条码retList.add(PrintDrawProtocol.DrawLabel(10,230,"20231206","宋体",12,"",null,"","","0"));retList.add(PrintDrawProtocol.DrawLabel(20,500,"A5纸张打印","宋体",12,"", null,"","","0"));//画一根横线retList.add(PrintDrawProtocol.DrawLine(20,525,700,525,1,"",""));//先包一个打印元素绘制协议数据生成的工具类来解决元素约束问题,工具类实现了调用工具类得到标签,条码,文本等return Helper.Object2Json(retList);}
}

让独立的A4后移
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

不扰乱顺序
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样就能极大的简化业务的打印控制逻辑,方便得到高效稳定的打印效果,后面有时间将解决绘制表格的痛点问题来给Web提供强大的客户端支持,这是一次没有历史代码干扰的全新设计,也是对老效果的全面超越 哈哈

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

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

相关文章

搜维尔科技:【简报】第九届元宇宙数字人设计大赛,报名已经进入白热化阶段!

随着元宇宙时代的来临&#xff0c;数字人设计成为了创新前沿领域之一。为了提高大学生元宇宙虚拟人角色策划与美术设计的专业核心能力&#xff0c;我们特别举办了这场元宇宙数字人设计赛道&#xff0c;赛道主题为「AI人工智能科技」 &#xff0c;只要与「AI人工智能科技」相关的…

Docker·1(简介、安装、基本使用)

目录 1. 什么是Docker1.1. 什么是容器1.2. 什么是Docker 2. 安装Docker3. 镜像操作3.1. 拉取镜像3.2. 卸载镜像/容器3.3. 使用镜像/容器 4. 相关指令说明 1. 什么是Docker 1.1. 什么是容器 虚拟机&#xff1a; 操作系统是一个很笨重的程序&#xff0c;即是啥都不干&#xff0c…

MAC 中多显示器的设置(Parallels Desktop)

目录 一、硬件列表&#xff1a; 二、线路连接&#xff1a; 三、软件设置&#xff1a; 1. 设置显示器排列位置及显示参数 2. 分别设置外接显示器为&#xff1a;扩展显示器&#xff0c;内建显示器为主显示器 3. 设置Parallels Desktop屏幕参数 四、结果 一、硬件列表&a…

部署KVM虚拟化平台

一、KVM简介&#xff1a; KVM是Kernel Virtual Machine 的简写&#xff0c;目前Linux发行版必须在64位的系统环境才能运行KVM,同时硬件需要支持VT技术。KVM自Linux 2,6.20版本后就直接整合到Linux内核.它依托CPU虚拟化指令集&#xff08;如intel-VT.AMD-V&#xff09;实现高性…

RTSP/Onvif安防平台EasyNVR接入EasyNVS显示服务不存在的原因及解决办法

EasyNVS云管理平台具备汇聚与管理EasyGBS、EasyNVR等平台的能力&#xff0c;可以将接入的视频资源实现统一的视频能力输出&#xff0c;支持远程可视化运维等管理功能&#xff0c;还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户在现场部署EasyNVR&#xff0c;…

HTTP模块

一、Web服务器 当应用程序&#xff08;客户端&#xff09;需要某一个资源时&#xff0c;可以向一台服务器&#xff0c;通过Http请求获取到这个资源&#xff1b;提供资源的这个服务器&#xff0c;就是一个Web服务器 目前有很多开源的Web服务器&#xff1a;Nginx、Apache&#xf…

设计领域不可缺少的10款PS插件,2023年必知!

即时设计 即时设计是一个更快更简单的产品协作设计平台。即时设计主要用户人群涵盖产品经理&#xff0c;设计师和工程师&#xff0c;其核心功能点包括&#xff1a;智能标注、一键切图、多样批注、快速交互、全貌画板、团队管理。从产品到开发&#xff0c;真正实现了只要一个文…

MySQL之表的记录操作

前言 存数据不是目的&#xff0c;目的是能够将存起来的数据取出来或者查出来&#xff0c;并且能够对数据进行增删改查操作&#xff0c;本文将详细介绍表中记录的增删改查操作。对记录的操作属于DML数据库操作语言&#xff0c;可以通过SQL实现对数据的操作&#xff0c;包括实现向…

MSE Serverless 正式商用,构建低成本高弹性的微服务架构

作者&#xff1a;问思 微服务架构充分提升了研发效率&#xff0c;解决了复杂业务系统的快速迭代问题。但随着业务及技术演进&#xff0c;各种微服务组件也愈发复杂。如何实现更敏捷的开发&#xff0c;降低微服务开发运维成本&#xff0c;做到全链路的弹性&#xff0c;保障整个…

RT-Thread 14. GD32F330RBT6 Keil4移植RT-Thread

1.增加rt-thread-v4.1.0源码 rt-thread-v4.1.0\bsp\gd32350r-eval复制重命名为gd32f330_v1 2.文件组织结构 Usr&#xff1a;存放App任务应用&#xff0c;属于应用层&#xff0c;完全脱离硬件 CMSIS&#xff1a;硬件层&#xff0c;启动文件、系统文件 Driver&#xff1a;硬件外…

【无标题】idea的lombok插件支持@SuperBuilder注解啦

在我的博客阅读本文 1. 前言 今早进公司打开idea&#xff0c;弹出更新提示&#xff0c;简单看了下&#xff0c;原来是idea的lombok插件更新了&#xff0c;惊喜的发现update log上写着Add support for SuperBuilder。 为什么说是惊喜呢&#xff1f;因为之前也有用到这个的场景…

树莓派外设开发综述及WiringPi库安装

树莓派常用的接口 IO&#xff1a; input&#xff1a; output&#xff1a; PWM&#xff1a; IIC spi uart WiringPi库 树莓派一个非常重要的 WiringPi库&#xff08;Linux下 动态库 ”.so“ 静态库”.a"&#xff09; &#xff08;是一个特定平台&#xff0c;特…

不慌,新手专属!10款免费画图软件助你轻松入门!

即时设计 即时设计是一种基于云的在线矢量设计工具&#xff0c;是一种免费的绘图软件&#xff0c;专门用于现代UI和UX设计。它极大地简化了矢量图形的编辑&#xff0c;以一种非常直观和易于使用的方式&#xff0c;让设计师专注于他们最擅长的事情&#xff1a;创造优秀的产品。…

java数据结构与算法刷题-----LeetCode70. 爬楼梯

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

巨杉数据库荣登2023胡润全球猎豹企业榜

胡润研究院与广州南沙联合发布《2023胡润全球猎豹企业榜》&#xff0c;这是胡润研究院首次发布“全球猎豹企业”。榜单列出了全球成立于2000年后&#xff0c;五年内最有可能达到独角兽级十亿美金估值的高成长性企业。巨杉数据库凭借在分布式文档型数据库领域的创新突破&#xf…

「HarmonyOS」验证码多TextInput输入框焦点自动跳转问题

需求背景&#xff1a;需要做一个多输入框的验证码模块&#xff0c;输入验证码时输入后光标会自动跳转至下一个输入框&#xff0c;删除验证码时会自动删除上一个输入框内容&#xff0c;并且光标跳转至上一个输入框内。6位验证码全部输完后进行登录请求 具体样式如下图&#xff1…

快速跳闸中间继电器 RXMS1-RK216 066-AD 24V 柜内安装,板后接线带中座

系列型号 RXMS1 RK 216 437快速跳闸继电器&#xff1b;RXMS1 RK 216 237快速跳闸继电器&#xff1b; RXMS1 RK 216 449快速跳闸继电器&#xff1b;RXMS1 RK 216 249快速跳闸继电器&#xff1b; RXMS1 RK 216 450快速跳闸继电器&#xff1b;RXMS1 RK 216 250快速跳闸继电器&…

three.js Raycaster(鼠标点击选中模型)

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

URLConnection()和openStream()两个方法产生SSRF的原理和修复方法

今年是自主研发的第三个年份&#xff0c;也是重视安全的年份。 转一篇小文章&#xff1a; 0x00 前言 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定 URL 地址获取网页文本内容&#xff0c;加载指定地址的图…

VR云游开启智慧旅游新纪元,打造“云旅游”新模式

元旦假期&#xff0c;全国文化和旅游市场平稳有序&#xff0c;家人和亲友的出游趋势稳步增加&#xff0c;演唱会、音乐节、跨年等活动的叠加让元旦出游更加吸引游客。在冰雪旅游热度持续攀升的时候&#xff0c;许多年轻群体已经开始使用VR云游进行智慧景区旅游&#xff0c;身临…