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"));

        //画logo
        retList.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"));
        //画logo
        retList.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"));
        //画logo
        retList.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"));
        //画logo
        retList.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提供强大的客户端支持,这是一次没有历史代码干扰的全新设计,也是对老效果的全面超越 哈哈

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app中轮播图实现大图预览

参考效果 当轮播图滑动切换的时候更新自定义下标&#xff0c;当图片被点击的时候大图预览。 参考代码 商品详情页轮播图交互 <script setup lang"ts"> // 轮播图变化时 const currentIndex ref(0) const onChange: UniHelper.SwiperOnChange (ev) > …

TAX税类小知识

历史及发展 我国作为流转税为主国家&#xff0c;目前经历3类税制&#xff1a;统收统付--包干制---分税制&#xff0c; 分别对应时间为建国--改革开放--93年朱提出分税延续至今&#xff1b; 未来趋势必然是完善所得税。 ps:流转税是间接税&#xff0c;间接转嫁给消费者&#…

TypeScript基础

ts学习 目录概述需求&#xff1a; 设计思路实现思路分析1.TypeScript 基础类型2.TypeScript 变量声明3.TypeScript 接口4.TypeScript 类5.TypeScript 函数5.TypeScript 泛型5.TypeScript 枚举TypeScript 类型推论TypeScript 类型兼容性TypeScript 高级类型TypeScript 迭代器和生…

深度解析Dubbo的基本应用与高级应用:负载均衡、服务超时、集群容错、服务降级、本地存根、本地伪装、参数回调等关键技术详解

负载均衡 官网地址&#xff1a; http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略&#xff0c; 以消费端为准。 这其中比较难理解的就是最少活跃调用数是如何进行统计的&#xff1f; 讲道理&#xff0c; 最少活跃数…

金和OA C6 upload_json 任意文件上传漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA C6 upload_json接口处存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上…

视频号小店新手该怎么运营?团队实操经验分享!

我是电商珠珠 视频号小店作为一个新兴平台&#xff0c;自然预示着有更多的机会在。 所以有很多新手想要了解这个平台并进行入驻&#xff0c;但是却不知道该怎么去运营&#xff0c;没有货源怎么办。 今天我就来给大家详细的讲一下。 一、入驻 入驻的话需要一张企业的营业执…

阿里巴巴秋招前端笔试题

单选题 下面的 JSX 代码中&#xff0c;哪一个无法达到预期的效果&#xff1f; A.<h2>Hello World</h2> B.<input type”checkbox”/> C.<div class”msg-box”>{msg}</div> D.<label htmlFor”name”>Leo</label> E.div styl…

人工智能_机器学习091_使用三维瑞士卷数据_KMeans聚类算法进行瑞士卷数据聚类---人工智能工作笔记0131

然后我们首先来构建一下数据 准备瑞士卷数据: import numpy as np 导入数学计算包 import matplotlib.pyplot as plt 导入画图包 #自底向上聚类 from sklearn.cluster import AgglceerativeClustering 导入分层聚类模型 from sklearn.datasets import make_swiss_roll # 瑞士卷…

“五岳杯”2023量子计算挑战赛启动仪式在南方科技大学成功举办

​2023年11月4日下午&#xff0c;由北京图象图形学学会、中国移动云能力中心&#xff08;以下简称“移动云”&#xff09;主办&#xff0c;南方科技大学承办&#xff0c;北京玻色量子科技有限公司&#xff08;以下简称“玻色量子”&#xff09;协办的“五岳杯”2023量子计算挑战…

RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动

关键词&#xff1a;SFUD,FLASH,W25Q64&#xff0c;W25Q128&#xff0c;STM32F407 说明&#xff1a;RT-Thread 系统 使用 SPI万能驱动 SFUD 驱动 Flash W25Q64&#xff0c;通过 STM32CubeMX 配置 STM32 SPI 驱动。 提示&#xff1a;SFUD添加后的存储位置 1.打开RT-Thread Sett…

OpenGL学习笔记-Blending

混合方程中&#xff0c;Csource是片段着色器输出的颜色向量&#xff08;the color output of the fragment shader&#xff09;&#xff0c;其权重为Fsource。Cdestination是当前存储在color buffer中的颜色向量&#xff08;the color vector that is currently stored in the …

ROS2 Humble学习笔记

本文发表与个人的github pages。部分内容未同步到这里。 想查看完整内容&#xff0c;请移步到ROS2 Humble学习笔记。 一、前言 2013年的时候已经接触ROS了&#xff0c;当时断断续续学习了一些ROS的基础知识。16年搬到深圳之后&#xff0c;也有幸参加过星火的一次关于ROS的一些…

S281 LoRa网关在智能电力监测系统中的应用

随着能源消耗的增加和环境保护的要求&#xff0c;智能电力监测系统在电力行业得到了广泛的应用。作为一家领先的科技公司&#xff0c;钡铼技术有限公司推出的S281 LoRa网关为智能电力监测系统提供了强大的支持和解决方案。本文将重点介绍S281 LoRa网关在智能电力监测系统中的应…

【Android Studio】APP练手小项目——切换图片APP

本项目效果&#xff1a; 前言&#xff1a;本项目最终实现生成一个安卓APP软件&#xff0c;点击按钮可实现按钮切换图片。项目包含页面布局、功能实现的逻辑代码以及设置APP图标LOGO和自定义APP名称。 关于Android Studio的下载与安装见我的博文&#xff1a;Android Studio 最新…

Native Crash回溯栈

获取调用栈四种方案&#xff1a;Android Native Crash 收集 1、使用系统的<unwind.h>库 可以获取到出错文件与函数名。只不过需要自己解析函数符号&#xff0c;同时经常会捕获到系统错误&#xff0c;需要手动过滤。 2、libcorkscrew 在4.1.1以上&#xff0c;5.0以下&…

C# 强制类型转换和as区别和不同使用场景

文章目录 1.强制类型转换2. as 运算符3.实例总结&#xff1a; 在C#中&#xff0c;as 和 强制类型转换&#xff08;例如 (T)value&#xff09;的主要区别在于它们处理类型转换不成功时的行为和适用场景&#xff1a; 1.强制类型转换 使用语法&#xff1a;Type variable (Type)…

设计模式之适配器模式【结构型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

“高端”的位运算

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 原计划迭代作为预备知识的收尾&#xff0c;不过在解2的幂和4的幂时&#xff0c;想到关于数字2的问题可以通过位运算去解决&#xff0c;因此补充了关于位运算的内容。 …

基于ssm的生鲜在线销售系统的设计与实现论文

摘 要 使用旧方法对生鲜在线销售系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在生鲜在线销售系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的生…

Python(33):数据断言(查询数据库数据和插入数据对比)

Python(33):数据断言(查询数据库数据和插入数据对比) 前言&#xff1a; 需求&#xff1a;需要针对查询数据库数据和插入的数据进行对比&#xff0c;用Python语言进行编写 数据库查询的结果可参考&#xff1a;https://blog.csdn.net/fen_fen/article/details/135462484 1、查…