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

Java获取小程序码示例(三种小程序码)

首先我们可以看到官方文档上是有三种码的 获取小程序码

在这里插入图片描述

这里特别要注意的是第一种和第三种是有数量限制的,所以大家生成的时候记得保存,也不要一直瞎生成

还有一点要注意的是第一种和第二种是太阳码

在这里插入图片描述

第三种是方形码

在这里插入图片描述

好了直接上代码
这里要注意,它请求成功返回的是一个 base64 的图片流,但是失败返回的是JSON字符串,我这里没有处理请求失败的问题

package com.sakura.user.utils;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sakura.common.exception.BusinessException;
import com.sakura.common.redis.RedisUtil;
import com.sakura.common.tool.HttpsRequestUtil;
import com.sakura.common.tool.StringUtil;
import com.sakura.user.param.GetAppCodeParam;
import com.sakura.user.vo.wx.WxAccessTokenVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;/*** @author Sakura* @date 2024/8/22 11:04* 微信小程序工具类*/
@Component
@Slf4j
public class WxAppUtil {@Value("${wx.app.appid}")private String appid;@Value("${wx.app.secret}")private String secret;// 获取授权tokenprivate static final String GET_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";private static final String WX_APP_ACCESS_TOKEN = "wx_app_access_token";// 获取小程序码URLprivate static final String GET_APP_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacode";// 获取不受限制的小程序码private static final String GET_UNLIMITED_APP_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit";private static final String GET_APP_QR_CODE_URL = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode";@Autowiredprivate RedisUtil redisUtil;// 获取授权凭证public String getAccessToken() {// 优先从Redis获取,没有再调接口// 如果Redis里面有则直接取Redis里面的if (redisUtil.hasKey(WX_APP_ACCESS_TOKEN)) {log.info(redisUtil.get(WX_APP_ACCESS_TOKEN).toString());return redisUtil.get(WX_APP_ACCESS_TOKEN).toString();}// 拼接请求参数StringBuilder strUrl = new StringBuilder();strUrl.append(GET_TOKEN).append("?grant_type=client_credential").append("&appid=").append(appid).append("&secret=").append(secret);try {String resultStr = HttpsRequestUtil.sendGetRequest(strUrl.toString());log.info("【微信小程序获取授权凭证】:返回结果:" + resultStr);WxAccessTokenVo wxAccessTokenVo = JSON.parseObject(resultStr, WxAccessTokenVo.class);if (StringUtil.isBlank(wxAccessTokenVo.getAccess_token())) {throw new BusinessException("微信小程序获取授权凭证异常");}//官方 access_token expires_in 为 2个小时, 这里设置 100分钟redisUtil.set(WX_APP_ACCESS_TOKEN, wxAccessTokenVo.getAccess_token(), 100 * 60);return wxAccessTokenVo.getAccess_token();} catch (Exception e) {log.info("【微信小程序获取授权凭证】:获取异常:" + e.getMessage());e.printStackTrace();throw new BusinessException("微信小程序获取授权凭证异常");}}// 获取小程序码public byte[] getAppCode(GetAppCodeParam getAppCodeParam) {// 先要获取access_tokenString accessToken = getAccessToken();// 拼接请求参数StringBuilder strUrl = new StringBuilder();strUrl.append(GET_APP_CODE_URL).append("?access_token=").append(accessToken);// 封装请求参数到bodyJSONObject jsonObject = new JSONObject();jsonObject.put("path", getAppCodeParam.getPath());if (StringUtil.isNotBlank(getAppCodeParam.getEnvVersion())) {jsonObject.put("env_version", getAppCodeParam.getEnvVersion());}if (getAppCodeParam.getWidth() != null) {jsonObject.put("width", getAppCodeParam.getWidth());}if (getAppCodeParam.getIsHyaline() != null) {jsonObject.put("is_hyaline", getAppCodeParam.getIsHyaline());}try {return HttpsRequestUtil.sendPostReturnByte(strUrl.toString(), jsonObject.toJSONString());} catch (Exception e) {log.info("【微信小程序获取小程序码】:获取小程序码异常:" + e.getMessage());e.printStackTrace();throw new BusinessException("微信小程序获取小程序码异常");}}// 获取无限制的小程序码public byte[] getUnlimitedAppCode(GetAppCodeParam getAppCodeParam) {// 先要获取access_tokenString accessToken = getAccessToken();// 拼接请求参数StringBuilder strUrl = new StringBuilder();strUrl.append(GET_UNLIMITED_APP_CODE_URL).append("?access_token=").append(accessToken);// 封装请求参数到bodyJSONObject jsonObject = new JSONObject();jsonObject.put("scene", getAppCodeParam.getScene());if (StringUtil.isNotBlank(getAppCodeParam.getPage())) {jsonObject.put("page", getAppCodeParam.getPage());}if (StringUtil.isNotBlank(getAppCodeParam.getEnvVersion())) {jsonObject.put("env_version", getAppCodeParam.getEnvVersion());}if (getAppCodeParam.getWidth() != null) {jsonObject.put("width", getAppCodeParam.getWidth());}if (getAppCodeParam.getIsHyaline() != null) {jsonObject.put("is_hyaline", getAppCodeParam.getIsHyaline());}if (getAppCodeParam.getCheckPath() != null) {jsonObject.put("check_path", getAppCodeParam.getCheckPath());}try {return HttpsRequestUtil.sendPostReturnByte(strUrl.toString(), jsonObject.toJSONString());} catch (Exception e) {log.info("【微信小程序获取不限制小程序码】:获取不限制小程序码异常:" + e.getMessage());e.printStackTrace();throw new BusinessException("微信小程序获取不限制小程序码异常");}}// 获取小程序二维码public byte[] getAppQRCode(GetAppCodeParam getAppCodeParam) {// 先要获取access_tokenString accessToken = getAccessToken();// 拼接请求参数StringBuilder strUrl = new StringBuilder();strUrl.append(GET_APP_QR_CODE_URL).append("?access_token=").append(accessToken);// 封装请求参数到bodyJSONObject jsonObject = new JSONObject();jsonObject.put("path", getAppCodeParam.getPath());if (getAppCodeParam.getWidth() != null) {jsonObject.put("width", getAppCodeParam.getWidth());}try {return HttpsRequestUtil.sendPostReturnByte(strUrl.toString(), jsonObject.toJSONString());} catch (Exception e) {log.info("【微信小程序获取小程序二维码】:获取小程序二维码异常:" + e.getMessage());e.printStackTrace();throw new BusinessException("微信小程序获取小程序二维码异常");}}
}

http 工具类

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;/*** @author Sakura* @date 2024/6/24 17:07*/
public class HttpsRequestUtil {public static String sendPostRequest(String urlString, String jsonInputString) throws IOException {URL url = new URL(urlString);HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法为POSTconnection.setRequestMethod("POST");// 设置请求头connection.setRequestProperty("Content-Type", "application/json");connection.setRequestProperty("Accept", "application/json");// 启用输出流,用于发送请求数据connection.setDoOutput(true);try (OutputStream os = connection.getOutputStream()) {byte[] input = jsonInputString.getBytes("utf-8");os.write(input, 0, input.length);}// 获取响应try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) {StringBuilder response = new StringBuilder();String responseLine;while ((responseLine = br.readLine()) != null) {response.append(responseLine.trim());}return response.toString();} finally {// 关闭连接connection.disconnect();}}public static String sendGetRequest(String urlString) throws IOException {URL url = new URL(urlString);HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法为GETconnection.setRequestMethod("GET");// 设置请求头connection.setRequestProperty("Accept", "application/json");// 获取响应try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) {StringBuilder response = new StringBuilder();String responseLine;while ((responseLine = br.readLine()) != null) {response.append(responseLine.trim());}return response.toString();} finally {// 关闭连接connection.disconnect();}}public static byte[] sendPostReturnByte(String urlString, String jsonInputString) throws IOException {URL url = new URL(urlString);HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法为POSTconnection.setRequestMethod("POST");// 设置请求头connection.setRequestProperty("Content-Type", "application/json");connection.setRequestProperty("Accept", "application/json");// 启用输出流,用于发送请求数据connection.setDoOutput(true);try (OutputStream os = connection.getOutputStream()) {byte[] input = jsonInputString.getBytes("utf-8");os.write(input, 0, input.length);}// 获取响应try (InputStream is = connection.getInputStream()) {ByteArrayOutputStream buffer = new ByteArrayOutputStream();int bytesRead;byte[] data = new byte[1024];while ((bytesRead = is.read(data, 0, data.length)) != -1) {buffer.write(data, 0, bytesRead);}return buffer.toByteArray();} finally {// 关闭连接connection.disconnect();}}}

请求的参数

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;import javax.validation.constraints.NotNull;
import java.io.Serializable;/*** 获取小程序码参数** @author Sakura* @since 2024-08-26*/
@Data
@Accessors(chain = true)
@ApiModel(value = "获取小程序码参数")
public class GetAppCodeParam implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("类型:1小程序码 2不受限制小程序码 3小程序二维码")@NotNull(message = "小程序码类型不能为空")private Integer type;@ApiModelProperty("type为1.3时必传 扫码进入的小程序页面路径")private String path;@ApiModelProperty("type为1.2时可传 要打开的小程序版本。正式版为 \"release\",体验版为 \"trial\",开发版为 \"develop\"。默认是正式版。")private String envVersion;@ApiModelProperty("二维码宽度 默认430,二维码的宽度,单位 px,最小 280px,最大 1280px")private Integer width;@ApiModelProperty("type为2时必传 自定义参数最大32个可见字符 如 a=1")private String scene;@ApiModelProperty("type为2时可传 默认是true,检查page 是否存在,为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在, 但page 有数量上限(60000个)请勿滥用。")private Boolean checkPath;@ApiModelProperty("type为2时可传 默认是主页,页面 page,例如 pages/index/index,根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面。scancode_time为系统保留参数,不允许配置")private String page;@ApiModelProperty("type为1.2时可传 默认值false;是否需要透明底色,为 true 时,生成透明底色的小程序码")private Boolean isHyaline;}

还有因为返回的是个流,所以我们还需要把它转成图片保存起来,这里大家可以上传到云存储也可就放在服务器上,我这里就是放在服务器上的,在本地项目或者服务器 jar 包目录下 “./resources/files/appcode”

	@Overridepublic String getAppCode(GetAppCodeParam getAppCodeParam) throws Exception {// 根据类型获取不同二维码byte[] bytes = null;if (getAppCodeParam.getType() == 1) {bytes = wxAppUtil.getAppCode(getAppCodeParam);} else if (getAppCodeParam.getType() == 2) {bytes = wxAppUtil.getUnlimitedAppCode(getAppCodeParam);} else if (getAppCodeParam.getType() == 3) {bytes = wxAppUtil.getAppQRCode(getAppCodeParam);}if (bytes == null || bytes.length < 1) {throw new BusinessException("获取小程序码失败");}// 目标目录String outputDir = "./resources/files/appcode";// 创建目录(如果不存在)File directory = new File(outputDir);if (!directory.exists()) {directory.mkdirs();}// 生成图片文件的完整路径String outputFileName = RandomStringUtils.randomAlphanumeric(32);String outputFilePath = outputDir + "/" + outputFileName + ".png";// 将字节数组写入到图片文件中try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {fos.write(bytes);}return "https://sakura.com/api-wx/appCode/download/" + outputFileName;}

因为图片存在服务器上了,我们还需要下载下来
看不懂的可以看下我另一篇讲什么上传下载文件的 Java实现本地文件上传下载接口示例

 @Overridepublic void download(HttpServletResponse response, String code) throws Exception {File downloadFile = new File("./resources/files/appcode/" + code + ".png");if (!downloadFile.exists() || downloadFile.length() == 0) {throw new BusinessException(500, "文件不存在");}// 确定文件的Content-TypeString mimeType = Files.probeContentType(downloadFile.toPath());if (mimeType == null) {mimeType = "application/octet-stream"; // 默认类型}response.setContentType(mimeType);response.addHeader("Content-Length", String.valueOf(downloadFile.length()));response.addHeader("Content-Disposition", "attachment; filename=\"" + code + ".png\"");try (InputStream is = new FileInputStream(downloadFile);OutputStream os = response.getOutputStream()) {IOUtils.copy(is, os);os.flush(); // 确保数据已写入输出流} catch (IOException e) {log.info("下载图片发生IO异常");e.printStackTrace();throw new BusinessException(500, "文件下载失败");} catch (Exception e) {log.info("下载图片发生异常");e.printStackTrace();throw new BusinessException(500, "文件下载失败");}}

最后,小程序获取 AccessToken 是需要添加白名单的,然后第二种码在小程序没发布的时候 check_path 一定要传 false,默认是 true 会报错的

相关文章:

Java获取小程序码示例(三种小程序码)

首先我们可以看到官方文档上是有三种码的 获取小程序码 这里特别要注意的是第一种和第三种是有数量限制的&#xff0c;所以大家生成的时候记得保存&#xff0c;也不要一直瞎生成 还有一点要注意的是第一种和第二种是太阳码 第三种是方形码 好了直接上代码 这里要注意&#xff…...

【最新华为OD机试E卷-支持在线评测】分糖果(100分)-多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…...

Windows下Python和PyCharm的应用(二)__快捷键方式的设定

前言 程序写久了&#xff0c;难免会形成自己的编程习惯。比如对某一套快捷键的使用&#xff0c;已经形成了肌肉记忆。 为了方便快捷键的使用&#xff0c;可以在PyCharm中设置自己喜欢的快捷键。 我比较习惯于微软Visual Studio的快捷键设置。&#xff08;因为早些年VC开发用的…...

网络安全宗旨和目标

网络安全涉及网络和相关数据及信息的保护与保障。它已从物理技术发展到防病毒和反网络钓鱼平台等软件方法。 在本章中&#xff0c;我们将详细讨论网络安全的主要目标和原则&#xff0c;并提供与之相关的具体示例。所以&#xff0c;让我们从网络安全的目标开始。 网络安全的目的…...

stm32之软件SPI读写W25Q64存储器应用案例

系列文章目录 1. stm32之SPI通信协议 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例分析3.1 SPI通信模块3.2 W25Q64模块3.3 主程序 前言 提示&#xff1a;本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记&#xff0c;旨在学习记录&a…...

Python数据验证库schema

目录 一、简述 二、安装schema库 三、使用 基本概念 代码示例 简单使用 列表验证 正则表达式 一、简述 schema用于简化数据验证的过程。它提供了一种简单的方式来定义数据结构&#xff0c;并验证传入的数据是否符合预期的结构。schema 库非常适合用于 Web 应用的请求验…...

python数据类型与运算符

1、数据类型 &#xff08;1&#xff09;Python中提供了基本数据类型&#xff1a; 数值类型&#xff1a;int整数类型、float浮点数类型、complex复数类型 布尔类型&#xff1a;bool&#xff0c;取值True / False 字符串&#xff1a;单引号包含、双引号包含、三对单引号/双引号…...

加密解密工具类

加密解密工具类 package com.example.modules.util;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; import java.util.Base64; public…...

validationtools中按键测试选项光标移除

最近处理一个问题&#xff0c;设备有方向键盘&#xff0c;做cit中的按键测试&#xff0c;发现按方向键第一次按键不能触发该键值&#xff0c;而是让屏幕第一个按钮获取焦点&#xff0c;然后再次按键&#xff0c;则其他正常。问题&#xff1a;进入界面第一次按键就要响应对应按键…...

【Hot100算法刷题集】哈希-02-字母异位词分组(含排序构造键、自定义键、自定义哈希函数法)

&#x1f3e0;关于专栏&#xff1a;专栏用于记录LeetCode中Hot100专题的所有题目 &#x1f3af;每日努力一点点&#xff0c;技术变化看得见 题目转载 题目描述 &#x1f512;link->题目跳转链接 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺…...

用华为智驾,开启MPV的下半场

作者 |老缅 编辑 |德新 8月28日&#xff0c;岚图正式对外公布了全球首款搭载华为乾崑智驾和鸿蒙座舱的MPV——全新岚图梦想家。 新车定位「全景豪华科技旗舰MPV」&#xff0c;全系标配四驱&#xff0c;分为四驱鲲鹏版和四驱乾崑版。 其中岚图逍遥座舱和鲲鹏智驾构成的鲲鹏版…...

发烧时眼睛胀痛的多种原因

发烧时眼睛胀痛的多种原因 发烧时眼睛胀痛可能由多种原因引起&#xff0c;主要包括以下几个方面&#xff1a; 上呼吸道感染&#xff1a; 发烧通常由上呼吸道感染引起&#xff0c;如感冒等。这些疾病多由病毒或细菌感染导致&#xff0c;如流感病毒、副流感病毒、腺病毒等。当机…...

用ACF和PACF计算出一堆数据的周期个数以及周期时长,数据分析python

具体步骤 1使用ACF和PACF&#xff1a;可以通过查看ACF图中的周期性峰值&#xff0c;找到数据中的周期性。如果ACF图在某个滞后期处出现显著的正相关峰值&#xff0c;并且这种模式在多个滞后周期中重复出现&#xff0c;这就是周期性信号的特征。而PACF则可以帮助确定延迟的直接影…...

生活方式对人健康影响非常大 第三篇

身体健康因素中 生活方式占到60% 赶紧去调整自己哪错了 上游的生活方式管理 是药三分毒 药物会影响身体肝肾功能,代谢 所以你要去找上游到底是我哪错了 短板越多 个健康状态越差 饮食管理是生活方式管理中难度最大的 原则1:与基因相对应相平衡 只吃素 会导致大脑萎…...

ubuntu22.04 qemu 安装windows on arm虚拟机

ubuntu22.04 qemu 安装windows on arm虚拟机 iso: https://uupdump.net/ https://massgrave.dev/windows_arm_links vivo driver: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.262-2/ qemu sudo apt update sudo a…...

前端框架的演变与选择

目录 前端框架的演变与选择 1. 什么是前端框架&#xff1f; 2. 前端框架的演变 2.1 早期的Web开发 2.2 JavaScript库的兴起 2.3 MVC架构的引入 3. 现代前端框架概览 3.1 React 3.2 Vue.js 3.3 Angular 4. 其他值得关注的前端框架 4.1 Svelte 4.2 Ember.js 5. 如何…...

Oracle(109)如何管理用户密码策略?

管理用户密码策略是确保数据库安全性的重要措施之一。通过定义和实施密码策略&#xff0c;可以确保用户使用强密码&#xff0c;并定期更新密码&#xff0c;以防止未经授权的访问。以下是如何在 MySQL 和 PostgreSQL 中详细配置和管理用户密码策略的步骤和代码示例。 MySQL 用户…...

【重学MySQL】十三、基本的 select 语句

【重学MySQL】十三、基本的 select 语句 基本结构示例检索所有列检索特定列带有条件的检索dual 列的别名基本的列别名使用别名在表达式中的使用别名在聚合函数中的应用 distinct基本用法注意事项示例 空值参与运算数学运算字符串连接比较运算逻辑运算处理NULL的函数 着重号为什…...

vue3.5新特性整理

本文章介绍vue3.5更新的几个新特性 1.vue中watch中深度监听更新的层级 在之前deep 属性是一个boolean值 我们要监听对象的变化需要使用deep: true 在vue3.5之后 deep 也可以是一个number 表示对象要监听的层级数量 这个功能还是比较实用的 因为层级过深的时候我们可能需要监听…...

RK3588 系列之3—rknn使用过程中遇到的bug

RK3588 系列之3—rknn使用过程中遇到的bug 1.librockchip_mpp.so: file format not recognized&#xff1b; treating as linker scrip2.Could not find a package configuration file provided by "OpenCV" with any of the following names参考文献 1.librockchip_…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...