【Poi-tl Documentation】区块对标签显示隐藏改造

news2024/12/30 2:34:02

前置说明:

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.12.1</version>
</dependency>

模板:
删除行表格测试.docx
image.png

改造前测试效果

package run.siyuan.poi.tl.区对块的改造;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.render.RenderContext;
import com.deepoove.poi.xwpf.BodyContainer;
import com.deepoove.poi.xwpf.BodyContainerFactory;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import run.siyuan.poi.tl.policy.CustomRenderPolicy;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class Main {


    public static void main(String[] args) throws Exception {
        test1();

    }

    public static void test1() throws IOException {
        // 读取模板文件
        FileInputStream fileInputStream = new FileInputStream("/Users/wuzhiqian/Desktop/HY/删除行表格测试.docx");

        // 创建模板配置
        ConfigureBuilder configureBuilder = Configure.builder();
        configureBuilder.buildGrammerRegex("((#)?[\\w\\u4e00-\\u9fa5\\-]+(\\.[\\w\\u4e00-\\u9fa5\\-]+)*)?");
        configureBuilder.setValidErrorHandler(new Configure.ClearHandler() {
            @Override
            public void handler(RenderContext<?> context) {
                System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                try {
                    XWPFRun run = context.getRun();
                    run.setText("/");
                    BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(run);
                    bodyContainer.clearPlaceholder(run);
                } catch (Exception e) {
                    System.out.println("标签不存在-------------------------------------------");
                }
            }
        });

        // 创建模板上下文
        Map<String, Object> context = new HashMap<>();
        context.put("a_1", "1");
        context.put("b_1", "2");
        context.put("c_1", "3");

        context.put("a_2", "4");
        context.put("b_2", "5");
        context.put("c_2", "6");

        context.put("a_3", "7");
        context.put("b_3", "8");
        context.put("c_3", "9");

        context.put("a_4", "10");
        context.put("b_4", "11");
        context.put("c_4", "12");

        context.put("a_5", "13");
        context.put("b_5", "14");
        context.put("c_5", "15");

        context.put("d_1", "16");

        configureBuilder.addPlugin('!', new CustomRenderPolicy(context));
        // 使用模板引擎替换文本标签
        XWPFTemplate compile = XWPFTemplate.compile(fileInputStream, configureBuilder.build());
        compile.render(context);


        // 保存生成的文档
        FileOutputStream outputStream = new FileOutputStream("/Users/wuzhiqian/Desktop/HY/删除行表格测试_" + System.currentTimeMillis() + ".docx");
        compile.write(outputStream);
        outputStream.close();

        compile.close();
        fileInputStream.close();
    }

}

运行后的效果:
image.png
显示没有问题,但是不是我想要的效果,我想要的效果
image.png
就是通过一个非bool的字段就能判断出我这个区块对的是否显示。

改造开始中

package run.siyuan.poi.tl.区对块的改造;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.render.compute.RenderDataCompute;
import com.deepoove.poi.render.processor.DocumentProcessor;
import com.deepoove.poi.render.processor.IterableProcessor;
import com.deepoove.poi.resolver.Resolver;
import com.deepoove.poi.template.IterableTemplate;
import com.deepoove.poi.template.MetaTemplate;
import com.deepoove.poi.xwpf.BodyContainer;
import com.deepoove.poi.xwpf.BodyContainerFactory;

import java.util.List;

/**
 * @ClassName CustomIterableProcessor
 * @Description TODO 自定义迭代起处理方法
 * @Author siyuan
 * @Date 2024/3/14 23:32
 */
public class CustomIterableProcessor extends IterableProcessor {
    public CustomIterableProcessor(XWPFTemplate template, Resolver resolver, RenderDataCompute renderDataCompute) {
        super(template, resolver, renderDataCompute);
    }

    public void visit(IterableTemplate iterableTemplate) {
        this.logger.info("【custom】 Process iterableTemplate:{}", iterableTemplate);
//        super.visit(iterableTemplate);
        BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(iterableTemplate);
        // 数据
        Object compute = this.renderDataCompute.compute(iterableTemplate.getStartMark().getTagName());
        if (null == compute || compute instanceof Boolean && !(Boolean) compute) {
            this.handleNever(iterableTemplate, bodyContainer);
        } else if (compute instanceof Iterable) { // 数据为集合时
            this.handleIterable(iterableTemplate, bodyContainer, (Iterable) compute);
        } else if (compute instanceof Boolean && (Boolean) compute) { // 数据为 bool 时
            this.handleOnceWithScope(iterableTemplate, this.renderDataCompute);
        } else if (compute instanceof String) { // TODO 数据为字符串时
            this.handleOnceWithScope(iterableTemplate, this.renderDataCompute);
        } else if (compute instanceof Number) { // TODO 数据为数字时
            this.handleOnceWithScope(iterableTemplate, this.renderDataCompute);
        } else {
            // 初上出两种类型意外的数据
            this.handleOnce(iterableTemplate, compute);
        }

        this.afterHandle(iterableTemplate, bodyContainer);

    }

}

这块代码主要是新增了 String 和 Number 判断,this.renderDataCompute 相当于示例中的 context,conpute 相当于 a_1 对应的值 1。

package run.siyuan.poi.tl.区对块的改造;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.render.compute.RenderDataCompute;
import com.deepoove.poi.render.processor.DocumentProcessor;
import com.deepoove.poi.render.processor.ElementProcessor;
import com.deepoove.poi.render.processor.InlineIterableProcessor;
import com.deepoove.poi.resolver.Resolver;
import com.deepoove.poi.template.*;
import com.deepoove.poi.template.run.RunTemplate;
import com.deepoove.poi.xwpf.XWPFTextboxContent;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @ClassName CustomDocumentProcessor
 * @Description TODO
 * @Author siyuan
 * @Date 2024/3/16 15:27
 */
public class CustomDocumentProcessor extends DocumentProcessor {
    private ElementProcessor elementProcessor;
    private CustomIterableProcessor iterableProcessor;
    private InlineIterableProcessor inlineIterableProcessor;

    public CustomDocumentProcessor(XWPFTemplate template, Resolver resolver, RenderDataCompute renderDataCompute) {
        super(template, resolver, renderDataCompute);
        this.elementProcessor = new ElementProcessor(template, resolver, renderDataCompute);
        this.iterableProcessor = new CustomIterableProcessor(template, resolver, renderDataCompute);
        this.inlineIterableProcessor = new InlineIterableProcessor(template, resolver, renderDataCompute);
    }

    public void process(List<MetaTemplate> templates) {
        templates.forEach((template) -> {
            template.accept(this);
        });
        Set<XWPFTextboxContent> textboxs = this.obtainTextboxes(templates);
        textboxs.forEach((content) -> {
            content.getXmlObject().set(content.getCTTxbxContent());
        });
    }

    private Set<XWPFTextboxContent> obtainTextboxes(List<MetaTemplate> templates) {
        Set<XWPFTextboxContent> textboxs = new HashSet();
        if (CollectionUtils.isEmpty(templates)) {
            return textboxs;
        } else {
            templates.forEach((template) -> {
                RunTemplate checkTemplate = template instanceof RunTemplate ? (RunTemplate) template : (template instanceof BlockTemplate ? ((BlockTemplate) template).getStartMark() : null);
                if (null != checkTemplate && checkTemplate.getRun().getParent() instanceof XWPFParagraph && checkTemplate.getRun().getParagraph().getBody() instanceof XWPFTextboxContent) {
                    textboxs.add((XWPFTextboxContent) checkTemplate.getRun().getParagraph().getBody());
                }

            });
            return textboxs;
        }
    }

    public void visit(InlineIterableTemplate iterableTemplate) {
        iterableTemplate.accept(this.inlineIterableProcessor);
    }

    public void visit(IterableTemplate iterableTemplate) {
        iterableTemplate.accept(this.iterableProcessor);
    }

    public void visit(RunTemplate runTemplate) {
        runTemplate.accept(this.elementProcessor);
    }

    public void visit(PictureTemplate pictureTemplate) {
        pictureTemplate.accept(this.elementProcessor);
    }

    public void visit(PictImageTemplate pictImageTemplate) {
        pictImageTemplate.accept(this.elementProcessor);
    }

    public void visit(ChartTemplate chartTemplate) {
        chartTemplate.accept(this.elementProcessor);
    }
}

新增完 CustomIterableProcessor 类之后就是使用起来,在 CustomDocumentProcessor 中使用起来。

package run.siyuan.poi.tl.区对块的改造;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.exception.RenderException;
import com.deepoove.poi.policy.DocxRenderPolicy;
import com.deepoove.poi.policy.RenderPolicy;
import com.deepoove.poi.render.DefaultRender;
import com.deepoove.poi.render.compute.RenderDataCompute;
import com.deepoove.poi.render.processor.DelegatePolicy;
import com.deepoove.poi.render.processor.LogProcessor;
import com.deepoove.poi.template.MetaTemplate;
import com.deepoove.poi.template.run.RunTemplate;
import com.deepoove.poi.xwpf.NiceXWPFDocument;
import org.apache.commons.lang3.time.StopWatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName CustomDefaultRender
 * @Description TODO
 * @Author siyuan
 * @Date 2024/3/16 15:25
 */
public class CustomDefaultRender extends DefaultRender {

    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultRender.class);

    public CustomDefaultRender() {
    }


    public void render(XWPFTemplate template, Object root) {
        Objects.requireNonNull(template, "Template must not be null.");
        Objects.requireNonNull(root, "Data root must not be null");
        LOGGER.info("Render template start...");
        RenderDataCompute renderDataCompute = template.getConfig().getRenderDataComputeFactory().newCompute(root);
        StopWatch watch = new StopWatch();

        try {
            watch.start();
            this.renderTemplate(template, renderDataCompute);
            this.renderInclude(template, renderDataCompute);
        } catch (Exception var9) {
            if (var9 instanceof RenderException) {
                throw (RenderException)var9;
            }

            throw new RenderException("Cannot render docx template", var9);
        } finally {
            watch.stop();
        }

        LOGGER.info("Successfully Render template in {} millis", TimeUnit.NANOSECONDS.toMillis(watch.getNanoTime()));
    }

    private void renderTemplate(XWPFTemplate template, RenderDataCompute renderDataCompute) {
        (new LogProcessor()).process(template.getElementTemplates());
        // TODO 调用自定义的 DocumentProcessor
        CustomDocumentProcessor documentRender = new CustomDocumentProcessor(template, template.getResolver(), renderDataCompute);
        documentRender.process(template.getElementTemplates());
    }

    private void renderInclude(XWPFTemplate template, RenderDataCompute renderDataCompute) throws IOException {
        List<MetaTemplate> elementTemplates = template.getElementTemplates();
        long docxCount = elementTemplates.stream().filter((meta) -> {
            return meta instanceof RunTemplate && ((RunTemplate)meta).findPolicy(template.getConfig()) instanceof DocxRenderPolicy;
        }).count();
        if (docxCount >= 1L) {
            template.reload(template.getXWPFDocument().generate());
            this.applyDocxPolicy(template, renderDataCompute, docxCount);
        }

    }

    private void applyDocxPolicy(XWPFTemplate template, RenderDataCompute renderDataCompute, long docxItems) {
        RenderPolicy policy = null;
        NiceXWPFDocument current = template.getXWPFDocument();
        List<MetaTemplate> elementTemplates = template.getElementTemplates();
        int k = 0;

        while(true) {
            while(k < elementTemplates.size()) {
                for(int j = 0; j < elementTemplates.size(); k = j) {
                    MetaTemplate metaTemplate = (MetaTemplate)elementTemplates.get(j);
                    if (metaTemplate instanceof RunTemplate) {
                        RunTemplate runTemplate = (RunTemplate)metaTemplate;
                        policy = runTemplate.findPolicy(template.getConfig());
                        if (policy instanceof DocxRenderPolicy) {
                            DelegatePolicy.invoke(policy, runTemplate, renderDataCompute.compute(runTemplate.getTagName()), template);
                            if (current != template.getXWPFDocument()) {
                                current = template.getXWPFDocument();
                                elementTemplates = template.getElementTemplates();
                                k = 0;
                                break;
                            }
                        }
                    }

                    ++j;
                }
            }

            return;
        }
    }

}

接着就是使用 CustomDocumentProcessor 类型了,CustomDefaultRender 中的 64 行。

package run.siyuan.poi.tl.区对块的改造;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.exception.ResolverException;
import com.deepoove.poi.resolver.TemplateResolver;
import com.deepoove.poi.xwpf.NiceXWPFDocument;

import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * @ClassName CustomXWPFTemplate
 * @Description TODO
 * @Author siyuan
 * @Date 2024/3/16 15:23
 */
public class CustomXWPFTemplate {


    /**
     * 模拟 {@link XWPFTemplate} 类 {@link #compile(InputStream, Configure)} 方法,通过反射的方式来创建 {@link XWPFTemplate} 并给属性赋值,
     *
     * @param inputStream
     * @param config
     * @return {@link XWPFTemplate}
     */
    public static XWPFTemplate compile(InputStream inputStream, Configure config) {
        try {
            Class<XWPFTemplate> xwpfTemplateClass = XWPFTemplate.class;

            Field docFiled = xwpfTemplateClass.getDeclaredField("doc");
            docFiled.setAccessible(true);
            NiceXWPFDocument niceXWPFDocument = new NiceXWPFDocument(inputStream);
            Field configFiled = xwpfTemplateClass.getDeclaredField("config");
            configFiled.setAccessible(true);
            Field resolverFiled = xwpfTemplateClass.getDeclaredField("resolver");
            resolverFiled.setAccessible(true);
            Field rendererFiled = xwpfTemplateClass.getDeclaredField("renderer");
            rendererFiled.setAccessible(true);
            Field eleTemplatesFiled = xwpfTemplateClass.getDeclaredField("eleTemplates");
            eleTemplatesFiled.setAccessible(true);

            Constructor<XWPFTemplate> declaredConstructor = xwpfTemplateClass.getDeclaredConstructor();
            declaredConstructor.setAccessible(true);
            XWPFTemplate xwpfTemplate = declaredConstructor.newInstance();
            docFiled.set(xwpfTemplate, niceXWPFDocument);
            configFiled.set(xwpfTemplate, config);
            TemplateResolver templateResolver = new TemplateResolver(config);
            resolverFiled.set(xwpfTemplate, templateResolver);
            // TODO 使用自定义的 CustomDefaultRender
            rendererFiled.set(xwpfTemplate, new CustomDefaultRender());
            eleTemplatesFiled.set(xwpfTemplate, templateResolver.resolveDocument(niceXWPFDocument));
            return xwpfTemplate;
        } catch (Exception e) {
            throw new ResolverException("Compile template failed", e);
        }
    }

}

最后就是用我们自定义的 CustomDefaultRender 了,因为 XWPFTemplate 构造函数是 private,不能使用继承的方式实现,最后我们通过反射的方式来处理,模拟 XWPFTemplate.compile(InputStream, Configure) 方法,通过反射的方式来创建 XWPFTemplate 并给属性赋值,renderer 使用我们自定会的 CustomDefaultRender。
这次改造过程中涉及到的很多方法都是从原有的方法中赋值,改动的部分很少。

改造后测试效果

package run.siyuan.poi.tl.区对块的改造;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.render.RenderContext;
import com.deepoove.poi.xwpf.BodyContainer;
import com.deepoove.poi.xwpf.BodyContainerFactory;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import run.siyuan.poi.tl.policy.CustomRenderPolicy;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class Main {


    public static void main(String[] args) throws Exception {
        test1();

    }

    public static void test1() throws IOException {
        // 读取模板文件
        FileInputStream fileInputStream = new FileInputStream("/Users/wuzhiqian/Desktop/HY/删除行表格测试.docx");

        // 创建模板配置
        ConfigureBuilder configureBuilder = Configure.builder();
        configureBuilder.buildGrammerRegex("((#)?[\\w\\u4e00-\\u9fa5\\-]+(\\.[\\w\\u4e00-\\u9fa5\\-]+)*)?");
        configureBuilder.setValidErrorHandler(new Configure.ClearHandler() {
            @Override
            public void handler(RenderContext<?> context) {
                System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                try {
                    XWPFRun run = context.getRun();
                    run.setText("/");
                    BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(run);
                    bodyContainer.clearPlaceholder(run);
                } catch (Exception e) {
                    System.out.println("标签不存在-------------------------------------------");
                }
            }
        });

        // 创建模板上下文
        Map<String, Object> context = new HashMap<>();
        context.put("a_1", "1");
        context.put("b_1", "2");
        context.put("c_1", "3");

        context.put("a_2", "4");
        context.put("b_2", "5");
        context.put("c_2", "6");

        context.put("a_3", "7");
        context.put("b_3", "8");
        context.put("c_3", "9");

        context.put("a_4", "10");
        context.put("b_4", "11");
        context.put("c_4", "12");

        context.put("a_5", "13");
        context.put("b_5", "14");
        context.put("c_5", "15");

        context.put("d_1", "16");

        configureBuilder.addPlugin('!', new CustomRenderPolicy(context));
        // 使用模板引擎替换文本标签
        XWPFTemplate compile = CustomXWPFTemplate.compile(fileInputStream, configureBuilder.build());
        compile.render(context);


        // 保存生成的文档
        FileOutputStream outputStream = new FileOutputStream("/Users/wuzhiqian/Desktop/HY/删除行表格测试_" + System.currentTimeMillis() + ".docx");
        compile.write(outputStream);
        outputStream.close();

        compile.close();
        fileInputStream.close();
    }

}

image.png

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

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

相关文章

数据结构——通讯录项目

1.通讯录的介绍 顺序表是通讯录的底层结构。 通讯录是将顺序表的类型替换成结构体类型来储存用户数据&#xff0c;通过运用顺序表结构来实现的。 用户数据结构&#xff1a; typedef struct PersonInfo {char name[12];char sex[10];int age;char tel[11];char addr[100]; }…

Java Web 概述

XML基础 XML概述 XML(exiensile markup language&#xff0c;可扩展标记语言)是一套定义语义标记的规则&#xff0c;这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言&#xff0c;可以定义其他与特定领域有关的、语义的、结构化的标记。 XML与 HTML 都…

【C语言步行梯】各类操作符、类型转换与原码、反码、补码详谈

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 算术运算符原码、反码、补码介绍移位运算…

【C语言步行梯】C语言实现三子棋游戏(含详细分析)

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 需求分析具体实现主函数体菜单实现游戏实…

LLM之RAG实战(三十)| 探索RAG语义分块策略

在LLM之RAG实战&#xff08;二十九&#xff09;| 探索RAG PDF解析解析文档后&#xff0c;我们可以获得结构化或半结构化的数据。现在的主要任务是将它们分解成更小的块来提取详细的特征&#xff0c;然后嵌入这些特征来表示它们的语义&#xff0c;其在RAG中的位置如图1所示&…

【GitHub】使用git链接下载很慢?试试服务器配置SSH,起飞

参考文献 保姆级教学&#xff0c;教你用配置SSH拉取github代码 CentOS ssh -T gitgithub.comgit config --global user.name "learnore" git config --global user.email "15200831505163.com"cd /root/.ssh vim id_rsa.pubGitHub Settings 结果 下载速…

力扣L13--- 409.最长回文串(JAVA版)-2024年3月1日

1.题目描述 2.知识点 注1&#xff1a;向下取整是将一个数值向下舍入到最接近的整数&#xff0c;但不超过这个数值的整数。具体规则如下&#xff1a; 对于正数&#xff0c;向下取整后得到的整数是不大于原数值的最大整数&#xff1b; 对于负数&#xff0c;向下取整后得到的整数…

uniapp——第2篇:编写vue语法

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;还有一定要会Vue!&#xff08;Vue2\Vue3&#xff09;都要会&#xff01;&#xff01;&#xff01;不然不好懂 一、去哪写&#xff1f; 就在【pages】的你的人一个页面文件夹里的【.vue】文…

简单的网页制作

1网页编写格式 <!DOCTYPE html> <html><head><meta charset"utf-8"> <title>中文测试。。。。</title></head><body>这里是测试body测试内容。。。</body> </html>2标签 在body内<h1></h1&…

突破编程_前端_JS编程实例(工具栏组件)

1 开发目标 工具栏组件旨在模拟常见的桌面软件工具栏&#xff0c;所以比较适用于 electron 的开发&#xff0c;该组件包含工具栏按钮、工具栏分割条和工具栏容器三个主要角色&#xff0c;并提供一系列接口和功能&#xff0c;以满足用户在不同场景下的需求&#xff1a; 点击工具…

中间件 | RPC - [Dubbo]

INDEX 1 Dubbo 与 web 容器的关系2 注册发现流程3 服务配置3.1 注册方式 & 订阅方式3.2 服务导出3.3 配置参数 4 底层技术4.1 Dubbo 的 spi 机制4.2 Dubbo 的线程池4.3 Dubbo 的负载均衡策略4.3 Dubbo 的协议 1 Dubbo 与 web 容器的关系 dubbo 本质上是一个 RPC 框架&…

leetcode代码记录(动态规划基础题(斐波那契数列)

目录 1. 题目&#xff1a;2. 斐波那契数列&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a…

基于高德地图JS API实现Vue地图选点组件

基于高德地图JS API2.0实现一个搜索选择地点后返回给父组件位置信息的功能&#xff0c;同时可以进行回显 目录 1 创建key和秘钥1.1 登录高德地图开放平台1.2 创建应用1.3 绑定服务创建秘钥 2 使用组件前准备2.1 导入loader2.2 在对应的组件设置秘钥2.3 引入css样式 3 功能实现…

【C语言】整型提升与算术转换

一、表达式求值 在我们平常的表达式求值的题目中&#xff0c;虽然看似是道很简单的题目&#xff1b;但是出题人总是会埋坑&#xff0c;其中最常见的就是整型提升与算术转换。 二、整型提升 C语⾔中整型算术运算总是⾄少以缺省(默认)整型(int)类型的精度来进⾏的&#xff1b;…

【MySQL基础】MySQL基础操作二

文章目录 &#x1f34e;1.数据库约束&#x1f350;约束类型&#x1f346;1.1NOT NULL&#x1f346;1.2UNIQUE&#x1f346;1.3DEFAULT&#x1f346;1.4PRIMARY KEY&#x1f346;1.5FOREIGN KEY &#x1f34f;2.查询操作&#x1f35f;2.1聚合查询&#x1f354;2.1.1聚合函数&…

视频号电商的风口来了!这个消息还有多少人不知道?

大家好&#xff0c;我是电商糖果 短视频做电商&#xff0c;这几年的热度真的是非常高&#xff0c;就是因为热度太高了&#xff0c;才让视频号也动了电商的心思。 腾讯推出的视频号是为了和抖音对打&#xff0c;这几年靠着微信输送的流量&#xff0c;视频号的日活已经渐渐有赶…

JavaSE-----认识异常【详解】

目录 一.异常的概念与体系结构&#xff1a; 1.1异常的概念&#xff1a; 1.2一些常见的异常&#xff1a; 1.3异常的体系结构&#xff1a; 1.4异常的分类&#xff1a; 二.异常的处理机制&#xff1a; 2.1 抛出异常&#xff1a; 2.2异常的捕获&#xff1a; 2.3try-catch-&…

JavaWeb一些开发问题

一、Restful package com.example.crudtest1.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class Result {private Integer code;//响应码&#xff0c;1 代表成功; 0 代表失…

浅易理解:卷积神经网络(CNN)

浅易理解卷积神经网络流程 本文的目录&#xff1a; 1 什么卷积神经网络 2 输入层 3 卷积层 4 池化层 5 全连接层 传统的多层神经网络只有 输入层、隐藏层、输出层 卷积神经网络&#xff08;CNN)&#xff1a; 在多层神经网络的基础上&#xff0c;加入了更加有效的特征学习部分…

315曝光黑灰产业链:主板机

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 315晚会曝光主板机黑灰产业链&#xff0c;主板机是什么呢?可能很多人还不知道。在这里松松给大家普及一下&#xff0c;也欢迎大家关注卢松松哟! 主板机是什么呢? 通过报废手机的主板&#xff0c;拆出来后组装成主…