【公众号开发】图像文字识别 · 模板消息推送 · 素材管理 · 带参数二维码的生成与事件的处理
【公众号开发】(4)
文章目录
- 【公众号开发】(4)
- 1. 图像文字识别功能
- 1.1 百度AI图像文字识别接口申请
- 1.2 查看文档学习如何调用百度AI
- 1.3 程序开发
- 1.3.1 导入依赖:
- 1.3.2 公众号发来post请求格式
- 1.3.3 对image类型的消息做好分支处理
- 1.3.4 访问百度AI的必要参数配置
- 1.3.5 访问百度AI(根据文档写就完事了)
- 1.3.6 封装回复消息
- 1.3.7 测试
- 2. 模板消息
- 2.1 设置所属的行业
- 2.2 获取设置的行业消息
- 2.3 发送模板消息
- 2.3.1 获得模板id
- 2.3.2 访问接口发送模板消息
- 3. 素材管理
- 3.1 上传文件资源方法
- 3.2 发送临时素材
- 3.3 获得临时素材
- 4. 二维码的生成与获取信息
- 4.1 生成带参数二维码
- 4.2 获取二维码
- 4.3 分支处理扫描二维码触发的事件
【公众号开发】(4)
1. 图像文字识别功能
我们的需求就是
实现读取图片文本信息
实现原理:
发送图片给公众号,开发者服务器会收到这个消息:
包含图片url:
1.1 百度AI图像文字识别接口申请
我们当然很难自己去实现一个图片识别功能,我们要借助强大的已有接口:
我们现在要实现的功能是图片的文字识别功能,首先我们在百度搜索一下“百度AI”:
百度AI开放平台给我们提供了很多人工智能相关的接口让我们去直接使用
登录一下(顺便实名认证):
找到满足我们需求,我们要用到的接口:
点击技术文档可以进行学习:文字识别OCR (baidu.com)
点击立即使用/在控制台前往文字识别:
创建一个应用:
我们不经常使用,所以就开通一下,来练习一下,按量计费,购买的话可以访问很久很多次,但是我觉得没啥必要
- 百度智能云-管理中心 (baidu.com)
在列表中查看信息,这些信息等一下我们的程序里是要用到的,有了这些信息,百度才允许你访问接口
1.2 查看文档学习如何调用百度AI
进入文档:
快速入门:
- 快速入门 - 文字识别OCR (baidu.com)
在里面我们可以查看如何实现这个功能
1.3 程序开发
1.3.1 导入依赖:
Maven Central: Search (sonatype.com)
<dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.16.16</version>
</dependency>
tips:版本冲突运行不了的话,可以这样排除
<exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion> </exclusions>
1.3.2 公众号发来post请求格式
基础消息能力 / 接收普通消息 (qq.com)
1.3.3 对image类型的消息做好分支处理
1.3.4 访问百度AI的必要参数配置
public class ImageUtils {//设置APPID/AK/SKpublic static final String APP_ID = "你的 App ID";public static final String API_KEY = "你的 Api Key";public static final String SECRET_KEY = "你的 Secret Key";
}
1.3.5 访问百度AI(根据文档写就完事了)
响应json的格式:
把word_result读出来就行了(其他两个一个记录id,一个结果数)
public static String getImageText(String picUrl) {// 初始化一个AipOcrAipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);System.out.println(picUrl);// 调用接口JSONObject jsonObject = client.webImageUrl(picUrl, new HashMap<String, String>());// 解析json字符串Map<String, Object> map = JsonUtils.jsonToMap(jsonObject.toString());// 获取单词集List<Map<String, Object>> wordsResult = (List<Map<String, Object>>) map.get("words_result");if(wordsResult == null || wordsResult.size() == 0) {return "";}List<String> words = new ArrayList<>();for(Map<String, Object> m : wordsResult) {words.add((String) m.get("words"));}System.out.println(words);// 返回识别结果return words.toString();
}
1.3.6 封装回复消息
private String handleImage(Map<String, Object> map) {String picUrl = (String) map.get("PicUrl");String content = ImageUtils.getImageText(picUrl);map.put("Content", content);TextMessage textMessage = TextMessage.getReplyTextMessage(map);String message = XmlUtils.objectToXml(textMessage);return message;
}
1.3.7 测试
成功啦😊~
补充,之前我们做的上拉菜单,点击里面的发送图片按钮,发送的并不是事件类型的消息:
- 点击它弹出子菜单:选择拍照或者相册选择
- 反正选择图片确认后,都相当于发送了图片类型的消息
这个只是示例,其他的自行研究,举一反三~
试玩了之后,把那个服务终止了,少花点钱🤭
2. 模板消息
在我们可以获得Access Token后就可以使用模板消息了
文档:基础消息能力 / 模板消息接口 (qq.com)
这个是公众号主动的向用户发送重要的消息
例如这种,就是模板消息
使用规则也要注意:
2.1 设置所属的行业
我们要想实现这个模板消息的发送的话,就要先设置所属的行业
参数:
- id1与id2,可以理解为主业和副业
行业编码可以在文档里查找:
public class TextModelMessage {public static void setTradeInfo() {String url = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry" + HttpUtils.getQueryString(new HashMap<String, Object>() {{this.put("access_token", TokenUtils.getToken());}});Map<String, Object> param = new HashMap<String, Object>() {{this.put("industry_id1", "1");this.put("industry_id2", "2");}};System.out.println(HttpUtils.doPost(url, JsonUtils.objectToJson(param)));}public static void main(String[] args) {setTradeInfo();}}
结果:
🆗啦😊~
2.2 获取设置的行业消息
公众号开发这么久了,套路都差不多~
public static String getTradeInfo() {String url = "https://api.weixin.qq.com/cgi-bin/template/get_industry" + HttpUtils.getQueryString(new HashMap<String, Object>() {{this.put("access_token", TokenUtils.getToken());}});return HttpUtils.doGet(url, null);
}public static void main(String[] args) {//setTradeInfo();System.out.println(getTradeInfo());
}
信息获取正确:
2.3 发送模板消息
2.3.1 获得模板id
首先我们要先获取模板id
在我们的测试公众平台界面,有这个模板消息接口:
新增测试模板:
模板消息运营规范:
基础消息能力 / 模板消息运营规范 (qq.com)
目前允许发的模板消息示例:
[微信模板消息测试 - 漂泊雪狼 - 博客园 (cnblogs.com)](https://www.cnblogs.com/weiweictgu/p/4933186.html#:~:text=目前允许发的模板消息示例 1.1资料变更类通知示例如下: 1.2政务服务类通知示例如下:,1.3物品 (含虚拟类)收取类通知示例如下: 1.4消费交易类通知示例如下:)
以一个很常见的为例子:
填入模板信息:
复制模板ID:
这里测试公众号阶段,直接这样获取模板id(此模板也只在此阶段能用),之后需要通过请求的方式获取,再回头来学!
- 基础消息能力 / 模板消息接口 (qq.com)
包括获取模板列表,删除模板,等等这些动作感兴趣的同学可以去研究一下,之后需要用到回头再学!
2.3.2 访问接口发送模板消息
data属性的值对象的各个 属性就是刚才的模板内容中的xxx.DATA:
更详细的json字符串示例:
可见,first和remark也在其中,并且属性值不仅有value(String)这个属性,还有color(String),也就是表现颜色(#六位十六进制的格式)
json字符串各个参数的介绍:
openid就是微信用户的id,这个用户肯定做了些事情我们才发模板消息给他,我们肯定有记录他的标识,也就是openid~
- 也就是这里的“微信号”
- 之后我们可以从数据库或者其他手段,也能获取到openid的,那个时候再说
小程序相关的和防止重入的这里不考虑(小程序不填了的话,其appid虽然必填,也因为miniprogram不填而不需要填写,pagepath也不需要)
返回码,简单了解即可
public static void sendModelMessage() {String url = "https://api.weixin.qq.com/cgi-bin/message/template/send" + HttpUtils.getQueryString(new HashMap<String, Object>() {{this.put("access_token", TokenUtils.getToken());}});String data ="{" +" \"first\":{\n" +" \"value\":\"你好,你申请参加活动报名成功。\",\n" +" \"color\":\"#101010\"" +" },\n" +" \"keyword1\":{\n" +" \"value\":\"张三\",\n" +" \"color\":\"#101010\"" +" },\n" +" \"keyword2\":{\n" +" \"value\":\"13333333333\"\n" +" },\n" +" \"keyword3\": {\n" +" \"value\":\"2023-10-21 17:43\"\n" +" },\n" +" \"keyword4\": {\n" +" \"value\":\"你选择的是足球队员\"\n" +" },\n" +" \"remark\": {\n" +" \"value\":\"感谢您 的使用,祝你生活愉快!\",\n" +" \"color\":\"#FF0000\"" +" }" +"}";Map<String, Object> param = new HashMap<String, Object>() {{this.put("touser", "otfI46nw4BoHVoOjivoWmEamB494");this.put("template_id", "jDrr4sGQBOgI7uTliXajxbaTTXMxhf2RzTXlwq3DBWY");this.put("url", "https://blog.csdn.net/Carefree_State?type=blog");this.put("data", JsonUtils.jsonToMap(data));}};// 发送请求System.out.println(HttpUtils.doPost(url, JsonUtils.objectToJson(param)));
}public static void main(String[] args) {//setTradeInfo();//System.out.println(getTradeInfo());sendModelMessage();
}
效果:
为什么不显示首行内容、尾部/备注内容、颜色?
- 参考公告:关于规范公众号模板消息的再次公告 (qq.com)
可能是很多违规案例的出现导致的(诈骗、营销、骚扰用户等等不良行为)
点此查看违规案例
这里的data,我直接偷懒给个写死了的~
- 之后我们只需要自己将我们的模板,封装成对象,再动态地获取和设置数据进去就行了
3. 素材管理
素材管理 / 新增临时素材 (qq.com)
有时候,我们需要将一些素材上传到公众号内进行缓存,所以我们需要学习一些素材管理的内容
差不多就这样吧,之后就是向公众号服务器发送请求
3.1 上传文件资源方法
这个方法比较万能,可以解决上传资源的各个文件问题,但是文件要满足限制!
//httpClient发送携带⽂件的post请求
public static String doPostByFile(String url, Map<String,Object> map, String localFile, String fileParamName) {HttpPost httpPost = new HttpPost(url);CloseableHttpClient httpClient = HttpClients.createDefault();String resultString = "";CloseableHttpResponse response = null;try {// 把⽂件转换成流对象FileBodyFileBody bin = new FileBody(new File(localFile));MultipartEntityBuilder builder =MultipartEntityBuilder.create();builder.addPart(fileParamName, bin);if (map != null) {for (String key : map.keySet()) {builder.addPart(key,new StringBody((String) map.get(key),ContentType.create("text/plain", Consts.UTF_8)));}}HttpEntity reqEntity = builder.build();httpPost.setEntity(reqEntity);// 发起请求 并返回请求的响应response = httpClient.execute(httpPost, HttpClientContext.create());resultString = EntityUtils.toString(response.getEntity(), "utf-8");} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null)response.close();} catch (IOException e) {e.printStackTrace();}}return resultString;
}
需要的依赖:
<!--httpClient需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency> <!--//httpclient缓存--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient-cache</artifactId><version>4.5</version> </dependency> <!--//http的mime类型都在这⾥⾯--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.3.2</version> </dependency>
3.2 发送临时素材
这里以发送图片为例,其他参考文档!
public static String sendImage() {// 构造urlString url = "https://api.weixin.qq.com/cgi-bin/media/upload" + HttpUtils.getQueryString(new HashMap<String, Object>() {{this.put("access_token", TokenUtils.getToken());this.put("type", "image");}});// 发起请求String response = HttpUtils.doPostByFile(url, null, "D:/马图/瞪眼.jpg", "");System.out.println(response);return (String) JsonUtils.jsonToMap(response).get("media_id");
}
测试:
public static void main(String[] args) {System.out.println(sendImage());
}
成功了😊:
- 这个就是临时的media_id(所有资源统一的字段)
3.3 获得临时素材
这里以发送图片为例,其他参考文档!
通过身份标识和media_id确认对于的临时资源
对于非视频消息素材,返回的就是素材的二进制序列!
- 在浏览器访问的话,会触发文件下载
public static String getImage(String mediaId) {// 构造urlString url = "https://api.weixin.qq.com/cgi-bin/media/get" + HttpUtils.getQueryString(new HashMap<String, Object>() {{this.put("access_token", TokenUtils.getToken());this.put("media_id", mediaId);}});System.out.println(url);return HttpUtils.doGet(url, null);
}
测试:
public static void main(String[] args) {String ret = getImage(sendImage());
}
成功啦😊:
访问一下这个链接:
- 触发下载了
打开后,就是刚才我们发的文件:
4. 二维码的生成与获取信息
账号管理 / 生成带参数的二维码 (qq.com)
这里生成带参数的二维码,扫二维码后是跳转到公众号,是公众号的宣传手段之一
带的参数有这些:
二维码分为四类:
- QR_SCENE为 临时的整型参数值
- QR_STR_SCENE为 临时的字符串参数值
- QR_LIMIT_SCENE为 永久的整型参数值
- QR_LIMIT_STR_SCENE为 永久的字符串参数值
4.1 生成带参数二维码
反正就字面意思,我这里就不封装对象,直接写死一个data:
public static String createTicket() {String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create" + HttpUtils.getQueryString(new HashMap<String, Object>() {{this.put("access_token", TokenUtils.getToken());}});//生成临时二维码的数据
// Map<String, Object> param = new HashMap<String, Object>(){{
//
// }};String data = "{\"expire_seconds\": 3600, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"test\"}}";// 发送请求String ret = HttpUtils.doPost(url, data);System.out.println(ret);return (String) JsonUtils.jsonToMap(ret).get("ticket");}
测试:
public static void main(String[] args) {System.out.println(createTicket());
}
4.2 获取二维码
这里就不需要access_token了,毕竟这个二维码要拿去宣传的
public static String getTicket() {String url = "https://mp.weixin.qq.com/cgi-bin/showqrcode" + HttpUtils.getQueryString(new HashMap<String, Object>() {{this.put("ticket", createTicket());}});//System.out.println(HttpUtils.doGet(url, null));return url;
}
测试:
public static void main(String[] args) {System.out.println(getTicket());
}
访问成功!
4.3 分支处理扫描二维码触发的事件
基础消息能力 / 接收事件推送 (qq.com)
如果未关注,扫码后进入公众号简介界面(可选择关注),关注后触发的事件类型为:
如果已关注,扫码后就直接触发的事件类型为:
对于EventKey,就是二维码所带参数相关,可进一步做分支,这里不做演示!
编写代码处理事件:
private String handleEvent(Map<String, Object> map) {String message = "";// 获取event值String event = (String) map.get("Event");// 事件分支switch (event) {case "CLICK":message = EventUtils.handleClick(map);break;case "VIEW":System.out.println("view");break;case "SCAN":message = EventUtils.handleScan(map);break;case "subscribe":message = EventUtils.handleSubscribe(map);break;default:break;}return message;
}
handleScan方法:
public static String handleScan(Map<String, Object> map) {map.put("Content", "欢迎光临! " + map.get("FromUserName"));TextMessage textMessage = TextMessage.getReplyTextMessage(map);return XmlUtils.objectToXml(textMessage);
}
handleSubscribe方法:
public static String handleSubscribe(Map<String, Object> map) {map.put("Content", "感谢关注! " + map.get("FromUserName"));TextMessage textMessage = TextMessage.getReplyTextMessage(map);return XmlUtils.objectToXml(textMessage);
}
测试:
关注状态下扫码:
非关注状态下扫码:
文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!代码:wx-demo · 游离态/马拉圈2023年10月 - 码云 - 开源中国 (gitee.com)
相关文章:

【公众号开发】图像文字识别 · 模板消息推送 · 素材管理 · 带参数二维码的生成与事件的处理
【公众号开发】(4) 文章目录 【公众号开发】(4)1. 图像文字识别功能1.1 百度AI图像文字识别接口申请1.2 查看文档学习如何调用百度AI1.3 程序开发1.3.1 导入依赖:1.3.2 公众号发来post请求格式1.3.3 对image类型的消息…...

Linux---(三)基本指令大全
前提引入:历史上先出现的键盘还是鼠标? 答案:键盘 ✨所以刚开始的时候绝对没有图形化界面,因此操作系统刚开始兴起的时候绝对没有图形化界面,因为当时没有鼠标。 ✨因为没有图形化界面,只有键盘,…...

基于selenium的pyse自动化测试框架
介绍: pyse基于selenium(webdriver)进行了简单的二次封装,比selenium所提供的方法操作更简洁。 特点: 默认使用CSS定位,同时支持多种定位方法(id\name\class\link_text\xpath\css)…...

【微服务 SpringCloudAlibaba】实用篇 · Nacos注册中心
微服务(5) 文章目录 微服务(5)1. 认识和安装Nacos2. 服务注册到nacos和拉取服务1)引入依赖2)配置nacos地址3)重启 3. 服务分级存储模型3.1 给user-service配置集群3.2 同集群优先的负载均衡 4. …...
华为手机安卓扫描安装包apk在哪
1、在文件管理器里找,有的安装包没有搜索到2、在应用市场-我的-安装包管理,它会扫描整个手机,推荐...

IDEA 新版本设置菜单展开
使用了新版本的IDEA 新UI后,常用的file,view,菜单看不见了,不太适应,找了一下,有个配置可以修改。 打开settings里面把show main menu in a separate toolbar勾选上,应用保存就可以了...
Leetcode 350:两个数组的交集II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。 示例 1…...

【数据结构】队列的实现与优化指南
一、前言 队列是一种重要的数据结构,它按照“先入先出”(FIFO)的原则管理数据。本文将介绍队列的概念、应用场景,以及如何使用数组实现普通队列和环形队列。 二、内容 2.1 概述 (1)什么是队列࿱…...

视频太大怎么压缩变小?三分钟学会视频压缩
随着科技的不断发展,视频已经成为了我们日常生活中不可或缺的一部分,然而,大尺寸的视频文件常常会给我们带来诸多困扰,例如发送不便、存储空间不足等等,那么,如何将这些过大的视频文件压缩变小呢࿱…...
Rust 泛型
泛型 Generics泛型详解 使用泛型参数,有一个先决条件,必需在使用前对其进行声明: fn largest<T>(list: &[T]) -> T {该泛型函数的作用是从列表中找出最大的值,其中列表中的元素类型为 T。首先 largest<T> 对…...

STM32+2.9inch微雪墨水屏(电子纸)实现显示
本篇文章从硬件原理以及嵌入式编程等角度完整的介绍了墨水屏驱动过程,本例涉及的墨水屏为2.9inch e-Paper V2,它采用的是“微胶囊电泳显示”技术进行图像显示,其基本原理是悬浮在液体中的带电纳米粒子受到电场作用而产生迁移,从而改变显示屏各…...

Hadoop3教程(二十九):(生产调优篇)集群扩容及缩容(白名单与黑名单)
文章目录 (150)添加白名单(151)服役新服务器(152)服务器间数据均衡(153)黑名单退役服务器参考文献 这一章还算是比较重要的。 (150)添加白名单 白名单&#…...

NET7下用WebSocket做简易聊天室
NET7下用WebSocket做简易聊天室 步骤: 建立NET7的MVC视图模型控制器项目创建websocket之间通信的JSON字符串对应的实体类一个房间用同一个Websocketwebsocket集合类,N个房间创建websocket中间件代码Program.cs中的核心代码,使用Websocket聊…...
详解API基础知识
目录 什么是API: API 的设计原则包括: API 的开发流程包括以下几个步骤: API 的使用场景包括: API 的优势包括: 然而,API 也存在一些挑战和问题,例如: 什么是API: API(应用程…...

b树和b+树
二叉树和平衡二叉树 二叉树,每个节点支持两个分支的树结构,相比于单向链表,多了一个分支。 二叉查找树,在二叉树的基础上增加了一个规则,左子树的所有节点的值都小于它的根 节点,右子树的所有子节点都大于它…...

Linux 下 Java 安装字体方法
因上线访问图字体乱码了,因为在windows下设置的微软雅黑,linux默认是没有的,所以需要给jdk安装一个微软雅黑字体。按照步骤来,so easy! 1)首先找到windows下面的字体,不用去其他地方下了&#…...
敏捷开发的实施要素和实现敏捷的实际改进
敏捷开发的实施要素如下: 个体和交互:胜过过程和工具。可以工作的软件:胜过面面俱到的文档。客户合作:胜过合同谈判。响应变化:胜过遵循计划。 敏捷开发过程是一个增量的、迭代的过程,责任人、开发人…...

学会使用Pandas进行数据清洗
大家好,如果你对数据科学感兴趣,那么数据清洗可能对你来说是一个熟悉的术语,本文将向你介绍使用Pandas进行数据清洗的过程。我们的数据通常来自多个资源,而且并不干净,它可能包含缺失值、重复值、错误或不需要的格式等…...

Stable Diffusion WebUI扩展a1111-sd-webui-tagcomplete之Booru风格Tag自动补全功能详细介绍
安装地址 直接附上地址先: Ranting8323 / A1111 Sd Webui Tagcomplete GitCodeGitCode——开源代码托管平台,独立第三方开源社区,Git/Github/Gitlabhttps://gitcode.net/ranting8323/a1111-sd-webui-tagcomplete.git上面是GitCode的地址,下面是GitHub的地址,根据自身情…...
Linux中iostat命令
iostat命令是IO性能分析的常用工具,其是input/output statistics的缩写。 一、安装 yum install sysstat -y二、参数说明 -c: 显示CPU使用情况-d: 显示磁盘使用情况--dec{ 0 | 1 | 2 }: 指定要使用的小数位数,默认为 2-g GROUP_NAME { DEVICE [...] | A…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...