当前位置: 首页 > news >正文

Springboot生成二维码

Springboot生成二维码整合

我们使用两种方式,去生成二维码,但是其实,二维码的生成基础,都是zxing包,这是Google开源的一个包,第一种是使用原始的zxing方式去实现,第二种是使用hutool来实现,hutool其实也是对于zxing的一个封装,但是封装前后,确实比较简单了。

Zxing原生方式

添加依赖

<!-- zxing生成二维码 -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version>
</dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.3</version>
</dependency>

二维码生成工具类

下面是把生成二维码的方法,封装到了QRCodeUtil的类之中,这个方法看起来还是比较多的,但是也谈不上太复杂,主要是对于BufferedImage生成图片,然后就是ImageIO.write()方法,write的位置,可以是普通的磁盘文件,也可以是web的流,我们使用web流的时候,就需要添加com.google.zxing-javase的依赖。

@Component
@Slf4j
public class QRCodeUtil {/*** CODE_WIDTH:二维码宽度,单位像素* CODE_HEIGHT:二维码高度,单位像素* FRONT_COLOR:二维码前景色,0x000000 表示黑色* BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色* 演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白*/private static final int CODE_WIDTH = 400;private static final int CODE_HEIGHT = 400;private static final int FRONT_COLOR = 0x000000;private static final int BACKGROUND_COLOR = 0xFFFFFF;/*** @param codeContent        二维码参数内容,如果是一个网页地址,如 https://www.baidu.com/ 则 微信扫一扫会直接进入此地址, 如果是一些参数,如*                           1541656080837,则微信扫一扫会直接回显这些参数值* @param codeImgFileSaveDir 二维码图片保存的目录,如 D:/codes* @param fileName           二维码图片文件名称,带格式,如 123.png*/public static void createCodeToFile(String codeContent, File codeImgFileSaveDir, String fileName) {try {if (codeContent == null || "".equals(codeContent)) {log.info("二维码内容为空,不进行操作...");return;}codeContent = codeContent.trim();if (codeImgFileSaveDir == null || codeImgFileSaveDir.isFile()) {codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();log.info("二维码图片存在目录为空,默认放在桌面...");}if (!codeImgFileSaveDir.exists()) {codeImgFileSaveDir.mkdirs();log.info("二维码图片存在目录不存在,开始创建...");}if (fileName == null || "".equals(fileName)) {fileName = new Date().getTime() + ".png";log.info("二维码图片文件名为空,随机生成 png 格式图片...");}BufferedImage bufferedImage = getBufferedImage(codeContent);/** javax.imageio.ImageIO:java扩展的图像IO* write(RenderedImage im, String formatName, File output)*       im:待写入的图像, formatName:图像写入的格式,output:写入的图像文件,文件不存在时会自动创建*/File codeImgFile = new File(codeImgFileSaveDir, fileName);ImageIO.write(bufferedImage, "png", codeImgFile);log.info("二维码图片生成成功:" + codeImgFile.getPath());} catch (Exception e) {e.printStackTrace();}}/*** 生成二维码并输出到输出流, 通常用于输出到网页上进行显示* 输出到网页与输出到磁盘上的文件中,区别在于最后一句 ImageIO.write* write(RenderedImage im,String formatName,File output):写到文件中* write(RenderedImage im,String formatName,OutputStream output):输出到输出流中** @param codeContent  :二维码内容* @param outputStream :输出流,比如 HttpServletResponse 的 getOutputStream*/public static void createCodeToOutputStream(String codeContent, OutputStream outputStream) {try {if (codeContent == null || "".equals(codeContent.trim())) {log.info("二维码内容为空,不进行操作...");return;}codeContent = codeContent.trim();BufferedImage bufferedImage = getBufferedImage(codeContent);/** 区别就是以一句,输出到输出流中,如果第三个参数是 File,则输出到文件中*/ImageIO.write(bufferedImage, "png", outputStream);log.info("二维码图片生成到输出流成功...");} catch (Exception e) {e.printStackTrace();log.error("发生错误: {}!", e.getMessage());}}private static BufferedImage getBufferedImage(String codeContent) throws WriterException {/** com.google.zxing.EncodeHintType:编码提示类型,枚举类型* EncodeHintType.CHARACTER_SET:设置字符编码类型* EncodeHintType.ERROR_CORRECTION:设置误差校正* ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction*   不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的* EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近*/Map<EncodeHintType, Object> hints = new HashMap();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);hints.put(EncodeHintType.MARGIN, 1);/** MultiFormatWriter:多格式写入,这是一个工厂类,里面重载了两个 encode 方法,用于写入条形码或二维码*      encode(String contents,BarcodeFormat format,int width, int height,Map<EncodeHintType,?> hints)*      contents:条形码/二维码内容*      format:编码类型,如 条形码,二维码 等*      width:码的宽度*      height:码的高度*      hints:码内容的编码类型* BarcodeFormat:枚举该程序包已知的条形码格式,即创建何种码,如 1 维的条形码,2 维的二维码 等* BitMatrix:位(比特)矩阵或叫2D矩阵,也就是需要的二维码*/MultiFormatWriter multiFormatWriter = new MultiFormatWriter();BitMatrix bitMatrix = multiFormatWriter.encode(codeContent, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);/** java.awt.image.BufferedImage:具有图像数据的可访问缓冲图像,实现了 RenderedImage 接口* BitMatrix 的 get(int x, int y) 获取比特矩阵内容,指定位置有值,则返回true,将其设置为前景色,否则设置为背景色* BufferedImage 的 setRGB(int x, int y, int rgb) 方法设置图像像素*      x:像素位置的横坐标,即列*      y:像素位置的纵坐标,即行*      rgb:像素的值,采用 16 进制,如 0xFFFFFF 白色*/BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);for (int x = 0; x < CODE_WIDTH; x++) {for (int y = 0; y < CODE_HEIGHT; y++) {bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);}}return bufferedImage;}/*** 根据本地二维码图片解析二维码内容 注:图片必须是二维码图片,但也可以是微信用户二维码名片,上面有名称、头像也是可以的)** @param file 本地二维码图片文件,如 E:\\logs\\2.jpg* @return* @throws Exception*/public static String parseQRCodeByFile(File file) {String resultStr = null;if (file == null || file.isDirectory() || !file.exists()) {return resultStr;}try {/** ImageIO的BufferedImage read(URL input)方法用于读取网络图片文件转为内存缓冲图像* 同理还有:read(File input)、read(InputStream input)、、read(ImageInputStream stream)*/BufferedImage bufferedImage = ImageIO.read(file);/** com.google.zxing.client.j2se.BufferedImageLuminanceSource:缓冲图像亮度源* 将 java.awt.image.BufferedImage 转为 zxing 的 缓冲图像亮度源* 关键就是下面这几句:HybridBinarizer 用于读取二维码图像数据,BinaryBitmap 二进制位图*/BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");/** 如果图片不是二维码图片,则 decode 抛异常:com.google.zxing.NotFoundException* MultiFormatWriter 的 encode 用于对内容进行编码成 2D 矩阵* MultiFormatReader 的 decode 用于读取二进制位图数据*/Result result = new MultiFormatReader().decode(bitmap, hints);resultStr = result.getText();} catch (IOException e) {e.printStackTrace();} catch (NotFoundException e) {e.printStackTrace();log.error("图片非二维码图片, 路径是: {}!", file.getPath());}return resultStr;}/*** 根据网络二维码图片解析二维码内容, 区别仅仅在于 ImageIO.read(url); 这一个重载的方法)** @param url 二维码图片网络地址,如 https://res.wx.qq.com/mpres/htmledition/images/mp_qrcode3a7b38.gif* @return* @throws Exception*/public static String parseQRCodeByUrl(URL url) {String resultStr = null;if (url == null) {return resultStr;}try {/** ImageIO 的 BufferedImage read(URL input) 方法用于读取网络图片文件转为内存缓冲图像* 同理还有:read(File input)、read(InputStream input)、、read(ImageInputStream stream)* 如果图片网络地址错误,比如不能访问,则 read 抛异常:javax.imageio.IIOException: Can't get input stream from URL!*/BufferedImage bufferedImage = ImageIO.read(url);/** com.google.zxing.client.j2se.BufferedImageLuminanceSource:缓冲图像亮度源* 将 java.awt.image.BufferedImage 转为 zxing 的 缓冲图像亮度源* 关键就是下面这几句:HybridBinarizer 用于读取二维码图像数据,BinaryBitmap 二进制位图*/BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Hashtable hints = new Hashtable();/** 如果内容包含中文,则解码的字符集格式应该和编码时一致*/hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");/** 如果图片不是二维码图片,则 decode 抛异常:com.google.zxing.NotFoundException* MultiFormatWriter 的 encode 用于对内容进行编码成 2D 矩阵* MultiFormatReader 的 decode 用于读取二进制位图数据*/Result result = new MultiFormatReader().decode(bitmap, hints);resultStr = result.getText();} catch (IOException e) {e.printStackTrace();log.error("二维码图片地址错误, 地址是: {}!", url);} catch (NotFoundException e) {e.printStackTrace();log.error("图片非二维码图片, 地址是: {}!", url);}return resultStr;}

添加Controller

public class QRCodeController {@GetMapping("qrCode")public void getQRCode(String codeContent, HttpServletResponse response) {System.out.println("codeContent=" + codeContent);try {/** 调用工具类生成二维码并输出到输出流中*/QRCodeUtil.createCodeToOutputStream(codeContent, response.getOutputStream());log.info("成功生成二维码!");} catch (IOException e) {log.error("发生错误, 错误信息是:{}!", e.getMessage());}}}

添加测试页面

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>二维码生成器</title><style type="text/css">textarea {font-size: 16px;width: 300px;height: 100px;}.hint {color: red;display: none;}.qrCodeDiv {width: 200px;height: 200px;border: 2px solid sandybrown;}.qrCodeDiv img {max-height: 100%;max-width: 100%;}</style><script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script><script type="text/javascript">$(function () {$("button").click(function () {var codeContent = $("textarea").val();console.log(codeContent);if (codeContent.trim() == "") {$(".hint").text("二维码内容不能为空").fadeIn(500);} else {$(".hint").text("").fadeOut(500);$("#codeImg").attr("src", "/qrCode?codeContent=" + codeContent);}});});</script></head><body><textarea placeholder="二维码内容..."></textarea><br><button>生成二维码</button><span class="hint"></span><div class="qrCodeDiv"><img src="" id="codeImg"></div></body>
</html>

Hutool的方式

Hutool的是非强制依赖性,因此zxing需要用户自行引入,我们需要加入依赖。使用hutool的时候,com.google.zxing-javase的依赖可以不需要。

添加依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.10</version>
</dependency>
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version>
</dependency>

创建QRCodeService

QRCodeService其实就是对QrCodeUtil的功能的封装,QrCodeUtil此处的类是hutool工具提供的,和我们在上面与自己与自己提供的QRCodeUtil类,不是同一个,这个需要注意一下。QrCodeUtil的功能此处主要使用到了的是生成二维码,到文件或者流之中,QrConfig是Hutool工具QrCodeUtil的配置类。

@Service
@Slf4j
public class QRCodeService {// 自定义参数,这部分是Hutool工具封装的private static QrConfig initQrConfig() {QrConfig config = new QrConfig(300, 300);// 设置边距,既二维码和背景之间的边距config.setMargin(3);// 设置前景色,既二维码颜色(青色)config.setForeColor(Color.CYAN.getRGB());// 设置背景色(灰色)config.setBackColor(Color.GRAY.getRGB());return config;}/*** 生成到文件** @param content* @param filepath*/public void createQRCode2File(String content, String filepath) {try {QrCodeUtil.generate(content, initQrConfig(), FileUtil.file(filepath));log.info("生成二维码成功, 位置在:{}!", filepath);} catch (QrCodeException e) {log.error("发生错误! {}!", e.getMessage());}}/*** 生成到流** @param content* @param response*/public void createQRCode2Stream(String content, HttpServletResponse response) {try {QrCodeUtil.generate(content, initQrConfig(), "png", response.getOutputStream());log.info("生成二维码成功!");} catch (QrCodeException | IOException e) {log.error("发生错误! {}!", e.getMessage());}}
}

添加Controller

@RestController
@Slf4j
public class QRCodeController {@Autowiredprivate QRCodeService qrCodeService;@GetMapping("qrCode")public void getQRCode(String codeContent, HttpServletResponse response) {try {qrCodeService.createQRCode2Stream(codeContent, response);log.info("成功生成二维码!");} catch (Exception e) {log.error("发生错误, 错误信息是:{}!", e.getMessage());}}}

相关文章:

Springboot生成二维码

Springboot生成二维码整合 我们使用两种方式&#xff0c;去生成二维码&#xff0c;但是其实&#xff0c;二维码的生成基础&#xff0c;都是zxing包&#xff0c;这是Google开源的一个包&#xff0c;第一种是使用原始的zxing方式去实现&#xff0c;第二种是使用hutool来实现&…...

“独裁者”何小鹏,再造小鹏汽车

文丨智能相对论 作者丨沈浪 如果没有何小鹏&#xff0c;小鹏汽车将失去灵魂。 2014年&#xff0c;夏珩、何涛等人在广州组建小鹏汽车&#xff08;当时还叫“橙子汽车”&#xff09;&#xff0c;何小鹏还只是股权投资人。 夏珩、何涛原任职于广汽&#xff0c;负责新能源汽车…...

数据结构 | 泛型 | 擦除机制| 泛型的上界

目录 ​编辑 1.泛型 1.1Object类引出泛型概念 2.泛型语法 2.1泛型编写代码 3.泛型的机制 3.1擦除机制 4.泛型的上界 4.1泛型上界的语法 4.2泛型上界的使用 5.泛型方法 5.1泛型方法语法 5.2泛型方法的使用 1.泛型 一般的类和方法中&#xff0c;只能使用具体的代码…...

C++拷贝构造函数(复制构造函数)详解

拷贝和复制是一个意思&#xff0c;对应的英文单词都是copy。对于计算机来说&#xff0c;拷贝是指用一份原有的、已经存在的数据创建出一份新的数据&#xff0c;最终的结果是多了一份相同的数据。例如&#xff0c;将 Word 文档拷贝到U盘去复印店打印&#xff0c;将 D 盘的图片拷…...

python学习——多线程

python学习——多线程概念python中线程的开发线程的启动线程的退出和传参threading的属性和方法threading实例的属性和方法多线程daemon线程和non-demone线程daemon线程的应用场景线程的jointhreading.local类线程的延迟执行&#xff1a;Timer线程同步Event 事件Lock ——锁加锁…...

SAP 系统中过账码or记账码

SAP中过账码和记账码是指同一个事物。 在实际业务中&#xff0c;记账码就是只有“借”和“贷”&#xff0c; 而SAP中Posting Code肩负着更多的任务&#xff1a; 1&#xff09;界定科目类型&#xff0c; 2&#xff09;借贷方向&#xff0c; 3&#xff09;凭证输入时画面上的字…...

【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS

初识FreeRTOS一、实时操作系统概述1、概念2、RTOS的必要性3、RTOS与裸机的区别4、FreeRTOS的特点二、FreeRTOS的架构三、FreeRTOS的代码架构一、实时操作系统概述 1、概念 RTOS&#xff1a;根据各个任务的要求&#xff0c;进行资源&#xff08;包括存储器、外设等&#xff09…...

Python中 __init__的通俗解释是什么?

__init__是Python中的一个特殊方法&#xff0c;用于在创建对象时初始化对象的属性。通俗来讲&#xff0c;它就像是一个构造函数&#xff0c;当我们创建一个类的实例时&#xff0c;__init__方法会被自动调用&#xff0c;用于初始化对象的属性。 举个例子&#xff0c;如果我们定义…...

网友真实面试总结出的自动化测试面试题库

目录 常规问题 手工测试部 自动化测试 自动化测试面试题2&#xff1a;selenium篇 常规问题 1、如何快速深入的了解移动互联网领域的应用 &#xff08;答案&#xff1a;看http协议 restful api知识 json加1分&#xff09; 2、对xx应用自己会花多久可以在业务上从入门到精通&…...

2023 年最佳 C++ IDE

文章目录前言1. Visual Studio2. Code::Blocks3. CLion4. Eclipse CDT&#xff08;C/C 开发工具&#xff09;5. CodeLite6. Apache NetBeans7. Qt Creator8. Dev C9. C Builder10. Xcode11. GNAT Programming Studio12. Kite总结前言 要跟踪极佳 IDE&#xff08;集成开发环境&…...

在Ubuntu上使用VSCode编译MySQL Connector/C连接库

首先下载并解压MySQL Connector/C源码&#xff0c;然后执行以下步骤&#xff1a; 1、安装MySQL Connector/C依赖&#xff1a;在终端中输入以下命令来安装MySQL Connector/C的依赖项&#xff1a; sudo apt-get install build-essential cmake 2、下载并解压MySQL Connector/C源…...

单声道数字音频放大器AD87589

AD87589是一种集成音频系统解决方案&#xff0c;嵌入数字音频处理、功率级放大器和立体声2Vrms线路驱动器。 AD87589具有可编程转换速率控制的输出缓冲器&#xff0c;可直接驱动一个&#xff08;单声道&#xff09;或两个&#xff08;立体声&#xff09;扬声器。此外&#xff0…...

网络的UDP协议和TCP协议

协议&#xff1a;数据在网络中的传输规则&#xff0c;常见的协议有 UDP协议和TCP协议 协议&#xff1a;计算机网络中&#xff0c;连接和通信的规则被称为网络通信协议 UDP协议&#xff1a;用户数据报协议&#xff0c;是面向无连接通信协议&#xff0c;速度快&#xff0c;有大小…...

【JaveEE】多线程之阻塞队列(BlockingQueue)

目录 1.了解阻塞队列 2.生产者消费者模型又是什么&#xff1f; 2.1生产者消费者模型的优点 2.1.1降低服务器与服务器之间耦合度 2.1.2“削峰填谷”平衡消费者和生产的处理能力 3.标准库中的阻塞队列&#xff08;BlockingQueue&#xff09; 3.1基于标准库&#xff08;Bloc…...

分布式ELK日志监控系统环境搭建

文章目录1.1为什么需要监控项目日志1.2ELK日志监控系统介绍1.3ELK的工作流程1.4ELK环境搭建1.4.1Elasticsearch的安装1.4.2Kibana的安装1.4.3Logstash的安装1.4.4数据源配置1.4.5日志监测测试1.4.6日志数据可视化展示1.1为什么需要监控项目日志 项目日志是记录项目运行过程中产…...

【数据结构刷题集】链表经典习题

&#x1f63d;PREFACE&#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐ 评论&#x1f4dd;&#x1f4e2;系列专栏&#xff1a;数据结构刷题集&#x1f50a;本专栏涉及到题目是数据结构专栏的补充与应用&#xff0c;只更新相关题目&#xff0c;旨在帮助提高代码熟练度&#x…...

JavaSE(3.27) 异常

学习不要眼高手低&#xff0c;学习是一点点积累的。即使你现在很菜&#xff0c;坚持学一个学期不会差的&#xff01;只要花时间学习&#xff0c;每天都是进步的&#xff0c;这些进步可能你现在看不到&#xff0c;但是不要小瞧了积累效应&#xff0c;30天&#xff0c;60天&#…...

【看门狗】我说的是定时器不是狗啊

单片机在运行中死机了&#xff0c;你或许只能按2下电源键&#xff08;重启&#xff09;或1下复位键。 这里简单说一下重启和复位&#xff1a; 从RESET引脚复位&#xff0c;只有MCU复位。而外设看情况&#xff0c;有的可能会有MCU同步复位或者重新初始化。也有可能一些保持复位…...

24万字智慧城市顶层设计及智慧应用解决方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。部分资料内容&#xff1a; 4.8 机房消防系统 4.8.1消防系统概况 根据本工程机房消防系统的特殊要求&#xff0c;整个消防系统由火灾报警系统、消防联动系统和气体灭火系统三部…...

跨境电商卖家工具——跨境卫士内容介绍

一、简介 跨境卫士是一款集合多种跨境电商工具的综合软件&#xff0c;由知名跨境电商服务商跨境通开发。跨境卫士可以帮助卖家完成海外物流管理、订单处理、报关报税、市场营销等多项任务&#xff0c;同时还提供数据分析、客户服务、运营管理等一系列支持功能&#xff0c;方便卖…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...