微信公众号开发学习

news2024/9/20 22:26:56

申请测试号

地址

  • 通过F12抓取体验接口权限表的HTML
    在这里插入图片描述

解析HTML

引入pom

		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-extra</artifactId>
            <version>5.8.21</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.8.21</version>
        </dependency>

        <dependency>
            <groupId>io.github.biezhi</groupId>
            <artifactId>TinyPinyin</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>
   <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.16.1</version>
	</dependency>

代码

CellDTO

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class CellDTO {
    private String namePY;
    private String nameZW;
    private String url;
}

HeadDTO

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class HeadDTO {
    private String namePY;
    private String nameZW;
}

核心逻辑

        private static  CellDTO[][] gen(String html){
        Document document = Jsoup.parse(html);
        List<HeadDTO> headDTOList =new ArrayList<>();
        for (Element theadELe : document.select("thead th")) {
            List<String> resultFindAll = ReUtil.findAll("[\\u4e00-\\u9fa5]+", theadELe.html(), 0, new ArrayList<>());
            String zw=String.join("",resultFindAll);
            String pinyin= PinyinUtil.getFirstLetter(zw,"");
            headDTOList.add(HeadDTO.builder().namePY(pinyin).nameZW(zw).build());
        }
        int columnSize = headDTOList.size();
        Map<Integer,Integer> tdCount =new HashMap<>();
        Elements trs = document.select(".table_special > tbody > tr");
        int trTotal = trs.size();
        CellDTO[][] table = new CellDTO[trTotal][columnSize-2];
        int tdNowFixNum =0;
        int tdTotalFixNum =0;

        for (int trIndex = 0; trIndex < trs.size(); trIndex++) {
            Elements tds = trs.get(trIndex).select("> td ");
            int tdSize = tds.size();
            int nowTrIndex=trIndex;
            for (int tdIndex = 0; tdIndex < tdSize-2; tdIndex++) {
                if(0==tdIndex){
                    for (Map.Entry<Integer,Integer> entry : tdCount.entrySet()) {
                        Integer key=entry.getKey();        //获取键
                        Integer value=entry.getValue();
                        value=value-1;
                        if(0==value){
                            tdTotalFixNum--;
                        }
                        tdCount.put(key,value);
                    }
                    tdNowFixNum=tdTotalFixNum;
                }
                Element td =tds.get(tdIndex);
                int nowTdIndex = columnSize==tdSize?tdIndex:(tdIndex+tdTotalFixNum );
                String tdValue;
                Elements a = td.select("a");
                String url="";
                if(!a.isEmpty()){
                    tdValue=a.html();
                    url=a.attr("href");
                }  else {
                    tdValue= td.html();
                }
                List<String> resultFindAll = ReUtil.findAll("[\\u4e00-\\u9fa5]+", tdValue, 0, new ArrayList<>());
                String zw=String.join("",resultFindAll);
                String pinyin= PinyinUtil.getFirstLetter(zw,"");
                CellDTO cell = CellDTO.builder().url(url).nameZW(zw).namePY(PinyinUtil.getFirstLetter(pinyin, "")).build();
//                System.out.println("> "+(trIndex+1)+" "+ (tdIndex+1)+" || "+nowTrIndex+" "+ nowTdIndex +" > "+tdNowFixNum +" : "+tdTotalFixNum + " >>  "+tdValue);
                if (td.hasAttr("rowspan")) {
                    Integer trAddNum = Integer.valueOf(td.attr("rowspan"));
                    for (int fillTrNum = nowTrIndex; fillTrNum < nowTrIndex+trAddNum; fillTrNum++) {
                        table[fillTrNum][nowTdIndex]=cell;
                    }
                    tdCount.put(nowTdIndex,trAddNum);
                    tdNowFixNum++;
                }else {
                    table[nowTrIndex][nowTdIndex]=cell;
                }
            }
            tdTotalFixNum =tdNowFixNum;

        }
        return table;
    }

vm模板代码生成

wx-java-mp-spring-boot-starter

引入pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.15</version>
        <relativePath/>
    </parent>
    <groupId>com.binarywang</groupId>
    <artifactId>wx-java-mp-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>wx mp demo</name>
    <description>Demo project for wx mp with spring boot</description>

    <properties>
        <java.version>1.8</java.version>
        <swagger.version>3.0.0</swagger.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.8.21</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-extra</artifactId>
            <version>5.8.21</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.8.21</version>
        </dependency>

        <dependency>
            <groupId>io.github.biezhi</groupId>
            <artifactId>TinyPinyin</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.16.1</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>wx-java-mp-spring-boot-starter</artifactId>
            <version>4.5.3.B</version>
        </dependency>


        <dependency>
            <groupId>com.github.jedis-lock</groupId>
            <artifactId>jedis-lock</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- Swagger3依赖 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>${swagger.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-models</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.6.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


配置模板

文件路径:src/main/resources/templates/Controller.java.vm

package com.binarywang.demo.wx.mp.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/${requestMapping}")
@Api(value = "${apiValue}", tags = {"${apiValue}"})
public class ${requestMappingUF}Controller {
    @Autowired
    private WxMpService wxMpService;
#foreach ($data in $datas)

    @ApiOperation("${data.nameZW}")
    @GetMapping("/${data.namePY}")
    public Object ${data.namePY}ListFn() throws WxErrorException {
    return  null;
    }

#end
}

核心代码

html 是F12抓取的页面代码 , 需要替换中文 文件目录


        CellDTO[][] gen = HtmlUtils.gen(html);
        String key =null;
        List<CellDTO> data =null;
        TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH));
        Template template = engine.getTemplate("Controller.java.vm");
        for (int i = 0; i <gen.length ; i++) {
            CellDTO cell= gen[i][1];
            if (key == null) {
                key=cell.getNamePY();
                data =new ArrayList<>();
            }
            if(key.equals(cell.getNamePY() ) ){
                data.add( gen[i][2]);
            }else {
                CODE_WRITE(gen,i,data,template);
                key=cell.getNamePY();
                data =new ArrayList<>();
                data.add( gen[i][2]);
            }
        }
        CODE_WRITE(gen,gen.length,data,template);

    }

    public static void CODE_WRITE(CellDTO[][] gen, int i , List<CellDTO> data, Template template){
        String py= gen[i-1][1].getNamePY();
        String apiValue =gen[i-1][0].getNameZW()+" - "+gen[i-1][1].getNameZW();
        Map<String,Object> map = new HashMap<>();
        map.put("datas",data);
        map.put("requestMapping",py);
        String requestMappingUF=StrUtil.upperFirst(py);
        map.put("requestMappingUF",requestMappingUF );
        map.put("apiValue",apiValue);
        String fileName= requestMappingUF+"Controller.java";
        String result = template.render(map);
        String filePath="文件目录\\main\\java\\com\\binarywang\\demo\\wx\\mp\\controller\\"+fileName;
        FileUtil.writeUtf8String(result,new File(filePath));
        System.out.println(result);
        System.out.println("  ");
    }

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

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

相关文章

物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)

文章目录 可变参数的使用技巧第三阶段-初级实验Lesson5:不一样的点灯实验---学习I/O的输出 ☆点灯的电路图分析1 一起看看点灯的电路图Tip1:另一种点灯的电路Tip1:如何访问外设的寄存器2 STM32F407中操作GPIO的方法 通过直接操作寄存器实现点灯实验Tip1:硬件编程的基本流程 2代…

数据可视化(4)散点图及面积图

1.简单散点图 #散点图 #scatter(x,y) x数据&#xff0c;y数据 x[i for i in range(10)] y[random.randint(1,10) for i in range(10)] plt.scatter(x,y) plt.show()2.散点图分析 #分析广告支出与销售收入相关性 dfcarpd.read_excel(广告支出.xlsx) dfdatapd.read_excel(销售…

VS开发Qt程序,无法打印QDebug调试信息,VS进行Qt开发时Qt Designer无法使用“转到槽”选项

VS开发Qt程序&#xff0c;无法打印QDebug调试信息&#xff0c;VS进行Qt开发时Qt Designer无法使用“转到槽”选项 VS开发Qt程序&#xff0c;无法打印QDebug调试信息VS进行Qt开发时Qt Designer无法使用“转到槽”选项 VS开发Qt程序&#xff0c;无法打印QDebug调试信息 解决方案…

使用Idea提交项目到远程仓库

使用Idea提交项目到远程仓库 1.在Idea中打开本地要推送的项目2.创建远程仓库并提交 1.在Idea中打开本地要推送的项目 tips: 首先你得有git工具&#xff0c;没有的话可以参考下面的这篇文章 git与gitee结合使用&#xff0c;提交代码&#xff0c;文件到远程仓库 从导航栏中选择 V…

如何快速开拓海外华人市场?附解决方案!

开拓华人市场对于企业来说是非常必要的。华人市场庞大且潜力巨大&#xff0c;拥有巨额的消费能力。随着华人经济的不断增长&#xff0c;越来越多的企业开始意识到华人市场的重要性。 通过开拓华人市场&#xff0c;企业可以获得更多的销售机会&#xff0c;并且在竞争激烈的市场…

Go语言time库,时间和日期相关的操作方法

time库 用于处理时间、日期和时区的核心库。在实际开发中&#xff0c;常常需要与时间打交道&#xff0c;例如记录日志、处理时间差、计算时间间隔等等。因此&#xff0c;掌握time库的使用方法对于Go开发者来说非常重要。 在Go语言中&#xff0c;时间表示为time.Time类型&…

嵌入式开发的学习内容和技能包括:

. 熟悉C语言编程 掌握基础电子知识&#xff0c;如数字电路、模拟电路和单片机 .熟练掌握嵌入式操作系统的原理、内核架构和应用&#xff0c;如Linux、RTOS等 了解各种外设接口及其驱动程序开发&#xff0c;如SPI、I2C、USART等 熟悉常用的嵌入式开发工具和软件工程流程&#…

【ASPICE】:学习记录

学习记录 ASPICE中文资料什么是ASPICE过程参考模型 ASPICE全称“Automotive Software Process Improvement and Capability dEtermination”&#xff0c;即“汽车软件过程改进及能力评定”模型框架 ASPICE中文资料 主要资料来源 什么是ASPICE 过程参考模型

神经网络原理概述

文章目录 1.神经元和感知器1.1.什么是感知器1.2.什么是单层感知器1.3.多层感知机&#xff08;Multi-Layer Perceptron&#xff0c;MLP&#xff09; 2.激活函数2.1.单位阶跃函数2.2.sigmoid函数2.3.ReLU函数2.4.输出层激活函数 3.损失函数4.梯度下降和学习率5.过拟合和Dropout6.…

python学到什么程度算入门,python从入门到精通好吗

本篇文章给大家谈谈python学到什么程度算入门&#xff0c;以及python从入门到精通好吗&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 学习 Python 之 进阶学习 一切皆对象 1. 变量和函数皆对象2. 模块和类皆对象3. 对象的基本操作 (1). 可以赋值给变量(2). …

JAVA- SQL注入案例(黑马程序员)和避免 超级详细

文章目录 sql注入准备1.创建应该新的数据库用于测试&#xff1b;2.修改配置3.启动jar包4.打开网页测试5.测试sql注入 sql注入避免1. java中的登录逻辑代码2.演示sql注入3.原因5.参数化查询-PreparedStatement SQL注入是什么&#xff1f; SQL 注入&#xff08;SQL Injection&…

【Python】Web学习笔记_flask(2)——getpost

flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 from flask import Flask,url_for,redirect,requestappFlask(__name__)app.route(/) def index():namerequest.args.get(name)agerequest.args.get(age)messagef姓名:{nam…

【LeetCode 75】第十七题(1493)删掉一个元素以后全为1的最长子数组

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给一个数组&#xff0c;求删除一个元素以后能得到的连续的最长的全是1的子数组。 我们可以先单独统计出连续为1的子数组分别长度…

命令模式-请求发送者与接收者解耦

去小餐馆吃饭的时候&#xff0c;顾客直接跟厨师说想要吃什么菜&#xff0c;然后厨师再开始炒菜。去大点的餐馆吃饭时&#xff0c;我们是跟服务员说想吃什么菜&#xff0c;然后服务员把这信息传到厨房&#xff0c;厨师根据这些订单信息炒菜。为什么大餐馆不省去这个步骤&#xf…

【JVM】(一)深入理解JVM运行时数据区

文章目录 一、JVM 运行流程二、虚拟机栈&#xff08;线程私有&#xff09;三、本地方法栈 &#xff08;线程私有&#xff09;四、方法区&#xff08;元数据区&#xff09;五、堆&#xff08;线程共享&#xff09;六、程序计数器&#xff08;线程私有&#xff09; 一、JVM 运行流…

安装Apache遇到的问题

安装Apache服务 httpd -k install -n Apache2.4 #-n后面表示自定义访问名称 问题1&#xff1a; 此时去 windows 的开始摁扭里找到控制器右键管理员运行 问题2&#xff1a; 命令行没用对 应该用&#xff1a; .\httpd -k install -n Apache2.4 #-n后面表示自定义访问名称

远程控制平台四之优化部署

服务器端打包 把服务器打成jar包对于后台开发的朋友来说小菜一碟,但对于前端开发可能有些细节要注意一下,尤其是有依赖其他第三方库的情况下,这里梳理了一下流程: File – Project Structure – Artifacts – add – JAR – From modules and dependencies 选中module和主…

前端构建(打包)工具发展史

大多同学的前端学习路线&#xff1a;三件套框架慢慢延伸到其他&#xff0c;在这个过程中&#xff0c;有一个词出现的频率很高&#xff1a;webpack 。 作为一个很出名的前端构建工具我们在网上随便一搜&#xff0c;就会有各种教程&#xff1a;loader plugin entry吧啦吧啦。 但…

嵌入式Linux的学习嵌入式一开始该怎么学?

把握以下几点&#xff1a; 文件 进程&#xff0c;线程&#xff0c;信号 进程&#xff0c;线程通信同步 网络&#xff1a;这个简单&#xff0c;就那几个API&#xff0c;TCP和udp。 嵌入式Linux 目前我正在学&#xff0c;我看到资料是正点原子&#xff0c;野火和韦东山作为参…

在中国人民大学与加拿大女王大学金融硕士项目中蜕变,成长

毕业十年后&#xff0c;还想得起大学时你的样子吗&#xff1f;有人这十年浑浑噩噩&#xff0c;或过着按部就班的日子&#xff0c;渐渐认命了&#xff1b;也有人用这十年实现了底层逆袭&#xff0c;完成了华丽的人生转身。如中国人民大学与加拿大女王大学金融硕士项目&#xff0…