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.hqwc.cn/news/317543.html

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

相关文章

JAVA电商平台 免 费 搭 建 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城

在数字化时代&#xff0c;电商行业正经历着前所未有的变革。鸿鹄云商的saas云平台以其独特的架构和先进的理念&#xff0c;为电商行业带来了全新的商业模式和营销策略。该平台涉及多个平台端&#xff0c;包括平台管理、商家端、买家平台、微服务平台等&#xff0c;涵盖了pc端、…

【数据结构——二叉树】二叉树及其应用2023(头歌习题)【合集】

目录 第1关&#xff1a;括号表示法创建二叉树任务描述相关知识编程要求测试说明完整代码 第2关&#xff1a;先序序列创建二叉树任务描述相关知识二叉树的前序遍历如何创建一颗二叉树伪代码如下&#xff1a; 二叉树的中序遍历 编程要求测试说明完整代码 第3关&#xff1a;计算二…

图片中src属性绑定不同的路径

vue3 需求是按钮disable的时候&#xff0c;显示灰色的icon&#xff1b;非disable状态&#xff0c;显示白色的icon 一开始src写成三元表达式&#xff0c;发现不行&#xff0c;网上说src不能写成三元表达式&#xff0c;vue会识别成字符串 最后的解决方案 同时&#xff0c;发现…

打造炫酷粒子效果的前端利器tsParticles

前端潮流速递 &#xff1a;打造炫酷粒子效果的前端利器tsParticles 在现代前端开发中&#xff0c;动画和视觉效果是吸引用户的关键元素之一。而实现炫酷而引人入胜的粒子效果&#xff0c;常常需要耗费大量的时间和精力。然而&#xff0c;有了 tsParticles&#xff0c;这一切变…

AIGC年度回顾!2024向量数据库是否还是AI发展方向之一?

引言 2023 年&#xff0c;是 AI 技术大爆发的一年&#xff0c;从年初到年末&#xff0c;全球关心技术发展的人们见证了一次次的 AI 技术升级&#xff0c;也逐步加深着对 AGI 发展的畅想。而伴随着生成式人工智能的飞速发展&#xff0c;向量数据库以其独特的技术优势逐渐崭露头角…

Linux/Unix/国产化操作系统常用命令(二)

目录 后CentOS时代国产化操作系统国产化操作系统有哪些常用Linux命令关于Linux的LOGO 后CentOS时代 在CentOS 8发布后&#xff0c;就有了一些变化和趋势&#xff0c;可以说是进入了"后CentOS时代"。这个时代主要表现在以下几个方面&#xff1a; CentOS Stream的引入…

BMS均衡技术

一、电池的不一致性&#xff1f; 每个电池都有自己的“个性”&#xff0c;要说均衡&#xff0c;得先从电池谈起。即使是同一厂家同一批次生产的电池&#xff0c;也都有自己的生命周期、自己的“个性”——每个电池的容量不可能完全一致。例如以下的两个原因都会造成电池不一致…

tomcat session cookie值设置逻辑

tomcat session cookie 值设置&#xff0c;tomcat jsessionid设置 ##调用request.getSession() Controller RequestMapping("/cookie") public class CookieController {RequestMapping("/tomcatRequest")ResponseBodypublic String tomcatRequest(HttpS…

SpringCloud微服务架构,适合接私(附源码)

一个由商业级项目升级优化而来的微服务架构&#xff0c;采用SpringBoot 2.7 、SpringCloud 等核心技术构建&#xff0c;提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租户微服务平台。 架构图 项目介绍 用户权益 仅允许免费用于学习、毕设、公司项目、私活等。…

论文阅读--EFFICIENT OFFLINE POLICY OPTIMIZATION WITH A LEARNED MODEL

作者&#xff1a;Zichen Liu, Siyi Li, Wee Sun Lee, Shuicheng YAN, Zhongwen Xu 论文链接&#xff1a;Efficient Offline Policy Optimization with a Learned Model | OpenReview 发表时间&#xff1a; ICLR 2023年1月21日 代码链接&#xff1a;https://github.com/s…

LeetCode 每日一题 Day 28293031 ||三则模拟||找循环节(hard)

1185. 一周中的第几天 给你一个日期&#xff0c;请你设计一个算法来判断它是对应一周中的哪一天。 输入为三个整数&#xff1a;day、month 和 year&#xff0c;分别表示日、月、年。 您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday…

高性能NVMe Host Controller IP

NVMe Host Controller IP 介绍 NVMe Host Controller IP可以连接高速存储PCIe SSD&#xff0c;无需CPU和外部存储器&#xff0c;自动加速处理所有的NVMe协议命令&#xff0c;具备独立的数据写入AXI4-Stream/FIFO接口和数据读取AXI4-Stream/FIFO接口&#xff0c;非常适合于超高…