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

文脉定序系统Java集成开发指南:SpringBoot微服务语义排序API构建

文脉定序系统Java集成开发指南SpringBoot微服务语义排序API构建如果你正在用SpringBoot做Java后端开发可能遇到过这样的问题用户搜索“苹果”到底是想找水果、手机还是电影传统的基于关键词的排序很难理解用户真正的意图。这时候就需要引入一点“智能”了。文脉定序系统就是一种能理解文本背后含义并据此进行智能排序的工具。它不只看字面更看“意思”。今天我就来和你聊聊怎么在一个SpringBoot微服务项目里把这个“智能排序大脑”给集成进去让它成为你服务的一部分。整个过程其实没想象中那么复杂跟着步骤走很快就能跑起来。1. 环境准备与项目搭建在开始敲代码之前我们得先把“舞台”搭好。这里假设你已经有一个基础的SpringBoot项目了如果没有用Spring Initializr生成一个就行记得选上Spring Web和Lombok这两个是基础。1.1 添加必要的依赖文脉定序系统通常会提供HTTP API供我们调用所以我们需要一个HTTP客户端。这里我推荐使用RestTemplateSpring自带的或者更现代的WebClient。为了处理JSON和简化代码我们还需要一些帮手。如果你用的是Maven在pom.xml里加上这些dependencies !-- Spring Boot Web Starter (已经包含RestTemplate) -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 用于更方便地处理HTTP请求比如Retrofit或OkHttp这里以OkHttp为例 -- dependency groupIdcom.squareup.okhttp3/groupId artifactIdokhttp/artifactId version4.12.0/version !-- 请使用最新稳定版 -- /dependency !-- JSON处理Jackson是Spring Boot默认的 -- dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId /dependency !-- 简化Getter/Setter等代码 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- 缓存支持后续优化用 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-cache/artifactId /dependency dependency groupIdcom.github.ben-manes.caffeine/groupId artifactIdcaffeine/artifactId /dependency /dependencies如果你用的是Gradle在build.gradle的dependencies块里添加implementation org.springframework.boot:spring-boot-starter-web implementation com.squareup.okhttp3:okhttp:4.12.0 implementation com.fasterxml.jackson.core:jackson-databind compileOnly org.projectlombok:lombok annotationProcessor org.projectlombok:lombok implementation org.springframework.boot:spring-boot-starter-cache implementation com.github.ben-manes.caffeine:caffeine1.2 配置文脉定序服务连接信息我们不应该把API地址、密钥这些敏感信息硬编码在代码里。Spring Boot的application.yml或application.properties是存放它们的好地方。在src/main/resources/application.yml里添加# 文脉定序服务的配置 contextual-ordering: service: # 文脉定序API的基础地址请替换为实际地址 base-url: https://api.example-context-ordering.com/v1 # 你的API密钥或认证Token非常重要妥善保管 api-key: your-actual-api-key-here # 连接超时时间毫秒 connect-timeout: 5000 # 读取超时时间毫秒 read-timeout: 10000然后我们创建一个配置类来读取这些属性这样在代码里用起来就方便了。package com.yourproject.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; Configuration ConfigurationProperties(prefix contextual-ordering.service) Data public class ContextOrderingConfig { private String baseUrl; private String apiKey; private Integer connectTimeout; private Integer readTimeout; }这样我们就有了一个ContextOrderingConfig对象它里面的字段会自动从application.yml里填充好值。2. 核心服务层构建环境搭好了接下来就是干活的核心部分——构建一个服务让它去和文脉定序API“对话”。2.1 定义数据模型首先得知道我们和API之间要传递什么样的“语言”。通常文脉定序API需要一个查询query和一个待排序的列表items。package com.yourproject.model; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; Data NoArgsConstructor AllArgsConstructor public class OrderingRequest { // 用户的查询文本例如“我想买一部拍照好的手机” private String query; // 待排序的文本列表例如[iPhone 15 Pro 影像旗舰, 华为P70 艺术摄影, 小米14 Ultra 徕卡镜头] private ListString items; // 可选参数例如返回排序后的前K个结果 private Integer topK; } Data NoArgsConstructor AllArgsConstructor public class OrderedItem { // 排序后的文本内容 private String text; // 相关性得分分数越高通常表示与查询越相关 private Double score; // 原始列表中的索引位置 private Integer originalIndex; } Data NoArgsConstructor AllArgsConstructor public class OrderingResponse { // 排序后的结果列表 private ListOrderedItem orderedItems; // 请求ID用于追踪 private String requestId; // 处理耗时等信息 private Long latencyMs; }2.2 实现HTTP客户端服务现在我们来写一个服务类负责实际的HTTP调用。这里我用OkHttpClient因为它用起来比较灵活。package com.yourproject.service; import com.fasterxml.jackson.databind.ObjectMapper; import com.yourproject.config.ContextOrderingConfig; import com.yourproject.model.OrderingRequest; import com.yourproject.model.OrderingResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.concurrent.TimeUnit; Slf4j Service RequiredArgsConstructor public class ContextOrderingHttpClient { private final ContextOrderingConfig config; private final ObjectMapper objectMapper; // Spring会自动注入 private OkHttpClient client; // 使用PostConstruct在Bean初始化后创建客户端 PostConstruct public void init() { this.client new OkHttpClient.Builder() .connectTimeout(config.getConnectTimeout(), TimeUnit.MILLISECONDS) .readTimeout(config.getReadTimeout(), TimeUnit.MILLISECONDS) .build(); log.info(文脉定序HTTP客户端初始化完成BaseUrl: {}, config.getBaseUrl()); } public OrderingResponse rankItems(OrderingRequest request) throws IOException { // 1. 构建请求URL String url config.getBaseUrl() /rank; // 假设API端点是 /rank // 2. 将请求对象转换为JSON String requestBody objectMapper.writeValueAsString(request); RequestBody body RequestBody.create( requestBody, MediaType.parse(application/json; charsetutf-8) ); // 3. 构建HTTP请求 Request httpRequest new Request.Builder() .url(url) .post(body) .addHeader(Authorization, Bearer config.getApiKey()) // 假设使用Bearer Token .addHeader(Content-Type, application/json) .build(); // 4. 发送请求并获取响应 try (Response response client.newCall(httpRequest).execute()) { if (!response.isSuccessful()) { log.error(文脉定序API调用失败状态码: {}, 响应体: {}, response.code(), response.body() ! null ? response.body().string() : 空); throw new IOException(API调用失败状态码: response.code()); } // 5. 解析响应JSON String responseBody response.body().string(); return objectMapper.readValue(responseBody, OrderingResponse.class); } } }这个服务类做了几件事配置HTTP客户端、把Java对象转成JSON、发送POST请求、处理响应和错误。现在我们已经在业务代码里屏蔽了HTTP调用的细节。3. 设计业务接口与控制器有了底层调用能力我们还需要一个更友好、更面向业务的接口。比如我们可能想对排序结果做一些后处理或者加入业务逻辑。3.1 创建业务服务层package com.yourproject.service; import com.yourproject.model.OrderingRequest; import com.yourproject.model.OrderingResponse; import com.yourproject.model.OrderedItem; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; Slf4j Service RequiredArgsConstructor public class SemanticRankingService { private final ContextOrderingHttpClient httpClient; /** * 对文本列表进行语义重排序 * param query 查询文本 * param items 待排序文本列表 * return 排序后的文本列表只返回文本 */ public ListString rankTexts(String query, ListString items) { try { OrderingRequest request new OrderingRequest(query, items, null); // 不限制topK返回全部 OrderingResponse response httpClient.rankItems(request); log.info(语义排序完成查询: {}处理了 {} 个条目, query, items.size()); // 只提取排序后的文本内容返回 return response.getOrderedItems().stream() .map(OrderedItem::getText) .collect(Collectors.toList()); } catch (Exception e) { log.error(语义排序服务调用异常查询: {}, 错误: {}, query, e.getMessage(), e); // 降级策略如果排序服务失败返回原始列表 return items; } } /** * 获取带得分的完整排序结果 * param query 查询文本 * param items 待排序文本列表 * return 完整的排序响应包含得分和原始索引 */ public OrderingResponse rankWithScores(String query, ListString items) { try { OrderingRequest request new OrderingRequest(query, items, null); return httpClient.rankItems(request); } catch (Exception e) { log.error(获取带得分的排序结果失败查询: {}, query, e); // 构造一个降级响应顺序不变得分为0或null ListOrderedItem fallbackItems items.stream() .map((text, index) - new OrderedItem(text, 0.0, index)) .collect(Collectors.toList()); return new OrderingResponse(fallbackItems, fallback- System.currentTimeMillis(), 0L); } } }这个SemanticRankingService提供了两个方法一个返回简单的排序后文本列表适合直接展示另一个返回包含得分等详细信息的完整结果适合需要分析得分的场景。它还加入了简单的异常处理和降级策略让服务更健壮。3.2 暴露REST API现在我们可以把这个能力通过HTTP API暴露给前端或其他微服务了。package com.yourproject.controller; import com.yourproject.model.OrderingRequest; import com.yourproject.model.OrderingResponse; import com.yourproject.service.SemanticRankingService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; RestController RequestMapping(/api/semantic-rank) RequiredArgsConstructor public class SemanticRankingController { private final SemanticRankingService rankingService; PostMapping(/simple) public ListString rankTextsSimple(Valid RequestBody OrderingRequest request) { return rankingService.rankTexts(request.getQuery(), request.getItems()); } PostMapping(/detailed) public OrderingResponse rankTextsDetailed(Valid RequestBody OrderingRequest request) { return rankingService.rankWithScores(request.getQuery(), request.getItems()); } // 一个更简洁的GET接口示例适用于简单场景注意URL长度限制 GetMapping(/rank) public ListString rankByGet(RequestParam String query, RequestParam ListString items) { return rankingService.rankTexts(query, items); } }这样我们就有了两个主要的API端点/api/semantic-rank/simple和/api/semantic-rank/detailed。你可以用Postman或curl测试一下应该就能看到排序效果了。4. 高并发处理与性能优化当你的服务被很多人同时调用时上面的简单版本可能会遇到性能瓶颈。别担心我们有几个“法宝”可以应对。4.1 引入结果缓存很多查询其实是重复的。比如热门搜索词“春节放假安排”可能被很多人搜。对相同的查询和列表进行重复的语义计算是浪费。我们可以用缓存把结果存起来。Spring Boot整合缓存非常方便。首先在主应用类上加上EnableCaching注解。package com.yourproject; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; SpringBootApplication EnableCaching public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }然后修改我们的SemanticRankingService在方法上添加缓存注解。Service RequiredArgsConstructor public class SemanticRankingService { // ... 其他代码不变 Cacheable(value semanticRankCache, key #query | #items.hashCode()) public ListString rankTexts(String query, ListString items) { // ... 方法体不变但调用会被缓存 log.info(执行实际语义排序计算查询: {}, query); // ... 原有的httpClient调用逻辑 } Cacheable(value semanticRankCacheDetailed, key #query | #items.hashCode()) public OrderingResponse rankWithScores(String query, ListString items) { // ... 方法体不变 log.info(执行实际语义排序计算详细查询: {}, query); // ... 原有的httpClient调用逻辑 } }Cacheable注解的意思是当用相同的query和items参数调用这个方法时Spring会先检查缓存里有没有结果有就直接返回没有才执行方法体并把结果存到缓存里。key属性定义了缓存的键这里我们用查询字符串和列表内容的哈希值组合确保唯一性。你还需要在application.yml里配置一下缓存比如使用Caffeinespring: cache: type: caffeine caffeine: spec: maximumSize10000, expireAfterWrite10m这表示最多缓存10000个条目每个条目写入后10分钟过期。4.2 异步非阻塞调用如果文脉定序API的响应时间比较长比如几百毫秒同步调用会阻塞你的服务线程。在高并发下线程很快会被耗光。我们可以用异步的方式来处理。首先让我们的ContextOrderingHttpClient支持异步。这里可以用CompletableFuture。Service RequiredArgsConstructor public class ContextOrderingHttpClient { // ... 其他代码和字段不变 public CompletableFutureOrderingResponse rankItemsAsync(OrderingRequest request) { return CompletableFuture.supplyAsync(() - { try { return rankItems(request); // 调用我们之前写的同步方法 } catch (IOException e) { throw new CompletionException(e); // 将受检异常包装为非受检异常 } }); } }然后在业务服务层我们可以提供异步版本的方法。Service RequiredArgsConstructor public class SemanticRankingService { // ... 其他代码和字段不变 Async // 需要配合EnableAsync使用 public CompletableFutureListString rankTextsAsync(String query, ListString items) { try { OrderingRequest request new OrderingRequest(query, items, null); return httpClient.rankItemsAsync(request) .thenApply(response - response.getOrderedItems().stream() .map(OrderedItem::getText) .collect(Collectors.toList())); } catch (Exception e) { log.error(异步语义排序失败, e); return CompletableFuture.completedFuture(items); // 降级 } } }别忘了在应用主类或一个配置类上加上EnableAsync来启用异步支持。这样当调用rankTextsAsync时它会立刻返回一个CompletableFuture对象而实际的计算会在另一个线程池中执行不会阻塞主请求线程。4.3 连接池与超时优化对于OkHttpClient我们可以配置连接池来复用TCP连接减少握手开销。PostConstruct public void init() { ConnectionPool connectionPool new ConnectionPool(10, 5, TimeUnit.MINUTES); // 最大空闲连接数10存活时间5分钟 this.client new OkHttpClient.Builder() .connectTimeout(config.getConnectTimeout(), TimeUnit.MILLISECONDS) .readTimeout(config.getReadTimeout(), TimeUnit.MILLISECONDS) .writeTimeout(5000, TimeUnit.MILLISECONDS) // 添加写超时 .connectionPool(connectionPool) // 设置连接池 .retryOnConnectionFailure(true) // 失败重试 .build(); }5. 错误处理与监控一个健壮的服务离不开良好的错误处理和监控。5.1 全局异常处理我们可以创建一个全局异常处理器来统一处理服务中可能抛出的异常并返回友好的错误信息给API调用者。package com.yourproject.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; Slf4j RestControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(IOException.class) public ResponseEntityMapString, Object handleIOException(IOException e) { log.error(外部服务调用IO异常, e); MapString, Object body new HashMap(); body.put(code, HttpStatus.BAD_GATEWAY.value()); // 502 Bad Gateway body.put(message, 语义排序服务暂时不可用请稍后重试); body.put(timestamp, System.currentTimeMillis()); return new ResponseEntity(body, HttpStatus.BAD_GATEWAY); } ExceptionHandler(Exception.class) public ResponseEntityMapString, Object handleGenericException(Exception e) { log.error(系统内部异常, e); MapString, Object body new HashMap(); body.put(code, HttpStatus.INTERNAL_SERVER_ERROR.value()); // 500 body.put(message, 系统内部错误); body.put(timestamp, System.currentTimeMillis()); return new ResponseEntity(body, HttpStatus.INTERNAL_SERVER_ERROR); } }5.2 添加日志与指标在关键位置添加日志可以帮助你追踪问题。我们已经在代码中使用了log.info和log.error。更进一步你可以集成Micrometer等库将调用耗时、成功率等指标暴露给Prometheus或Actuator方便监控。# application.yml 添加监控端点如果用了Spring Boot Actuator management: endpoints: web: exposure: include: health,metrics,prometheus metrics: tags: application: semantic-ranking-service然后在服务方法中你可以使用Timed等注解来自动记录指标。6. 总结好了到这里一个具备基本功能、有一定健壮性和性能考虑的SpringBoot语义排序微服务就搭建得差不多了。我们来简单回顾一下都做了些什么。首先我们把文脉定序系统的远程API调用封装成了一个Spring Boot服务里的一个组件。通过配置文件和HTTP客户端我们把调用细节隐藏了起来让业务代码更干净。然后我们设计了清晰的数据模型和业务接口不仅提供了简单的排序功能还考虑了返回详细得分和异常降级的场景。通过REST API这个能力可以很方便地被其他服务使用。面对可能的高并发我们引入了缓存和异步调用。缓存能避免重复计算大幅提升响应速度异步调用则能防止慢速的外部服务拖垮我们自己的应用。连接池等优化也让HTTP调用更高效。最后全局异常处理和日志监控像是给服务加上了“安全带”和“仪表盘”出了问题能及时知道、友好提示。实际用起来你可能会根据业务需求调整缓存策略、降级逻辑或者加入更复杂的重试机制。但整体的架子就是这样了。代码不算复杂但把这些点都考虑到做出来的服务就会靠谱很多。你可以先把核心功能跑起来再根据实际情况慢慢优化。希望这个指南能帮你顺利地把智能排序能力集成到你的项目里。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

文脉定序系统Java集成开发指南:SpringBoot微服务语义排序API构建

文脉定序系统Java集成开发指南:SpringBoot微服务语义排序API构建 如果你正在用SpringBoot做Java后端开发,可能遇到过这样的问题:用户搜索“苹果”,到底是想找水果、手机还是电影?传统的基于关键词的排序,很…...

AudioSeal部署案例:国家级AI内容安全实验室AIGC音频检测基准平台建设

AudioSeal部署案例:国家级AI内容安全实验室AIGC音频检测基准平台建设 1. 引言:当AI声音无处不在,我们如何辨别真伪? 想象一下,你接到一个电话,声音是你最信任的合作伙伴,他告诉你一个紧急的商…...

PyCharm界面介绍

PyCharm 界面说明PyCharm 是一款功能强大的 Python 集成开发环境(IDE),其界面设计直观且高效,适合开发者在日常工作中快速编写、调试和优化代码。以下是对 PyCharm 界面的详细说明,并附带丰富的代码实例。主界面布局Py…...

VMware 25h2 安装 RHEL 8 并且使用xshell ssh连接指南

一、准备工作: Vmware 25h2 exe安装包,RHEL 8 iso文件, xshell 客户端 1、 下载VMware Workstation Pro: 由于博通(Broadcom)已经收购了Vmware虚拟机业务并且开放了免费下载VMware Workstation Pro,所以我们可以去…...

07-redis性能优化

第七章:Redis性能优化 7.1 内存优化 数据结构选择 1. String vs Hash # String存储对象 SET user:1001 {"name":"张三","age":25,"email":"zhangsanexample.com"}# Hash存储对象(推荐) HS…...

第五篇:依赖注入系统(超详细版)

第五篇:依赖注入系统(超详细版) 依赖注入基础概念 什么是依赖注入? 依赖注入的核心优势 依赖注入的工作原理 函数依赖 1. 基础函数依赖 2. 异步函数依赖 3. 带yield的依赖(上下文管理器) 类依赖 1. 基础类依赖 2. 带参数的类依赖 3. 类依赖的实例化方式 依赖的依赖 1. 基…...

java工具:《判断当前时间是否在数据库起止时间范围内,是 ,返回true;否,返回false》

文章目录一、介绍功能说明参数说明返回值实现原理二、代码一、介绍 功能说明 这是一个判断当前时间是否在指定时间范围内的工具方法。方法接收两个 Date 类型的参数(开始时间和结束时间),判断当前的系统时间是否落在这两个时间点之间。 参…...

西门子smart 200 rtu方式通讯四台三菱E700变频器资料 硬件:smart plc...

西门子smart 200 rtu方式通讯四台三菱E700变频器资料 硬件:smart plc.三菱E700变频器,mcgs触摸屏(电脑仿真也可) 功能:指针写法,通过modbus rtu方式,实现对E700变频器通讯控制和监控。 有正反转,停止&…...

未来 5 年,对于程序员群体而言非AI 大模型莫属!

毫不夸张地讲,未来 5 年,对于程序员群体而言,最具潜力与前景的技术发展方向,非AI 大模型莫属! 在行业实践中,华为已_全面布局 Agent 技术_,并将其融入 80% 的新业务系统开发中,无论是…...

ResNet18在MNIST手写数字数据库上的深度学习网络识别及Matlab仿真实验研究

ResNet18深度学习网络的mnist手写数字数据库识别matlab仿真MNIST手写数字识别算是深度学习界的"Hello World"了,不过这次咱们用ResNet18来整点不一样的。别看ResNet本来是给ImageNet设计的,拿来折腾下28x28的小图片还挺有意思。先说说数据准备…...

第十五届蓝桥杯c++B组:宝石组合

蓝桥杯真题&#xff1a;宝石组合#include<bits/stdc.h> // 万能头文件&#xff0c;包含了C所有标准库 using namespace std; // 自定义函数&#xff1a;求三个数的最小公倍数&#xff08;LCM&#xff09; int LCM(int x, int y, int z) {int maxx max(…...

香橙派 5 的 Ubuntu 22.04 安装中文输入法

在 Orange Pi 5 (RK3588S) 的 Ubuntu 22.04 (ARM64) 系统上安装中文输入法&#xff0c;推荐使用 Fcitx5 框架 拼音输入法&#xff08;对 ARM64 支持完善、资源占用低、社区维护活跃&#xff09;。以下是完整步骤&#xff1a;&#x1f527; 安装步骤&#xff08;终端执行&#…...

探索相场锂枝晶:形状、形核与生长的奇妙旅程

相场锂枝晶—形状形核生长枝晶在锂电领域&#xff0c;相场锂枝晶的研究可是个热门话题。锂枝晶的形状、形核与生长&#xff0c;直接关系到锂电池的性能与安全&#xff0c;就像建筑物的基石&#xff0c;影响着整个“锂电大厦”的稳固。 相场法简述 相场法是研究这类问题的得力工…...

《创业之路》-904- 人间清醒:故事在开始时,结局就已注定——从“党指挥枪”到华为“力出一孔”,破解组织分裂的千年宿命

我党成功的关键&#xff1a;在组织架构上&#xff0c;实现了党、政、军领导的分离的情况下&#xff0c;开创性的创造了"党"指挥军、"党"领导政&#xff0c;当党"到连部等制度&#xff0c;用“党”、思想和愿景协同军、政&#xff1b;在利益上&#xf…...

动态规划DP经典例题

一、定义 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;&#xff0c;一种将答案过程性存储的优化算法。核心就是“空间换时间”&#xff0c;通常可以理解为将算过一遍的答案存起来&#xff0c;下次计算时直接调用&#xff0c;省再次计算的时间。 二…...

交错并联BUCK变换器仿真之旅

交错并联BUCK变换器仿真 输入电压范围&#xff1a;36~70V&#xff1b;输出电压&#xff1a;28.5V&#xff1b;电压电流双闭环PI控制 可 单片机芯片型号&#xff1a;dsPIC33FJ32MC204 仿真平台&#xff1a;proteus8.9&#xff1b;编译软件&#xff1a;MPLAB X IDE在电源管理领域…...

【3GPP LTE】【Release 16】基于R16的eMTC GWUS(Group Wake-Up Signal)简要方案解析

摘要 LTE Cat-M(eMTC)作为物联网主流技术之一,其终端功耗是核心性能指标。3GPP在Rel-15/16中引入了唤醒信号(WUS)及其增强方案——组唤醒信号(GWUS),以进一步降低UE在空闲态下的功耗。本文将从背景原理、协议定义、实现方案到参数配置,系统阐述GWUS的简要技术方案,并…...

高频注入Simulink模型在50r/min工况下的电角度观测对比

此为高频注入simulink模型用于电角度观测。 模型为在d轴注入正弦波电压信号&#xff0c;经过低通&#xff0c;带通滤波器之后得到角度信息。 图一为高频注入观测电角度与实际电角度的对比在50r/min时的工况&#xff0c;图像表明观测电角度与实际电角度几乎重合。高频注入这玩意…...

MySql自用

一、语法 1.左连接 left join ...on... left左边的表的行全保留 2.子嵌套需要给别名 3.基础函数框架 Create Function 函数名(N INT) Returns Int 函数返回值类型 BeginReturn(--函数体); End N INT&#xff1a;入参&#xff0c;参数名为 N&#xff0c;类型为整数 INT&a…...

50个 filter相关的公共函数

这里给你50 个纯 JS、Vue3 通用、可直接复制使用的 filter 过滤工具函数&#xff0c;覆盖业务 99% 场景&#xff0c;包含&#xff1a;基础过滤、搜索、数组、对象、时间、真假值、去重、区间、正则、树形、空值、多条件等。 全部即拿即用&#xff0c;不依赖任何库&#xff01;5…...

ABAQUS有限元分析软件在隧道开挖模型中的应用:从CD法到CRD法、台阶法、双侧壁导坑法、环...

abaqus隧道CD法开挖&#xff0c;CD法开挖模型&#xff0c;step by step&#xff0c;过程演示&#xff1b;abaqus隧道CRD法开挖模型&#xff0c;abaqus隧道台阶法开挖&#xff0c;abaqus隧道双侧壁导坑法开挖&#xff0c;abaqus隧道环形开挖预留核心土法开挖&#xff0c;模型&am…...

Spring全局异常处理拦截器JWT令牌使用

一、全局异常处理使用步骤step1&#xff1a;创建异常处理器类注意&#xff1a;要确保能扫描到异常处理器类| RestControllerAdvice用于标识当前类为REST风格对应的异常处理器 ExceptionHandler(Exception.class)标识处理哪些异常RestControllerAdvice public class ProjectExce…...

手把手教你学Simulink——基于Simulink的滞环电压控制(Bang-Bang)Buck仿真

目录 手把手教你学Simulink ——基于Simulink的滞环电压控制(Bang-Bang)Buck仿真 一、问题背景 二、Buck 电路与滞环控制原理 1. Buck 主电路 2. 滞环控制逻辑 三、Simulink 建模步骤 第一步:搭建 Buck 主电路(使用 Simscape Electrical) 第二步:实现滞环控制器 …...

聊聊 GitHub CLI,以及我为什么不再手动配 SSH 了

传统认证方式到底哪里难受&#xff1f; 说实话&#xff0c;在接触 gh 之前&#xff0c;我一直觉得 GitHub 的认证这块挺烦的。不是说它不能用&#xff0c;而是用起来总有点别扭。 先说用 HTTPS 加令牌这条路。GitHub 要求你去网页端生成一串很长的字符串&#xff0c;复制下来&a…...

RHEL9.7虚拟机部署及后续优化

一、搭建环境前的准备工作首先在搭建环境前将安装包提前解压到电脑D:\RHCSA文件夹(一定不要下载到C盘&#xff01;&#xff01;&#xff01;&#xff09;二、创建新的虚拟机二、RHEL后续优化从阅读模式进入编辑者模式从编辑模式退回阅读模式按ESC键并按住shift&#xff1a;输入…...

前沿科技一——5G/6G

一、概念 1、5G&#xff1a;万物互联的基石 &#xff08;1&#xff09;定义与特点&#xff1a; 5G&#xff0c;即第五代移动通信技术&#xff0c;具有高速率、低时延和大连接的特点。它实现了多种新型无线接入的状态&#xff0c;是真正意义上的通信技术与互联网的融合。 &a…...

手把手教你学Simulink——基于Simulink的主从式多机器人协同搬运控制仿真

目录 手把手教你学Simulink ——基于Simulink的主从式多机器人协同搬运控制仿真 一、问题背景 二、系统建模基础 1. 协同搬运系统结构 2. 运动学约束 3. 动力学耦合 三、主从式控制架构设计 1. 主机器人控制律(阻抗控制) 2. 从机器人控制律(导纳控制) 四、Simuli…...

南北阁Nanbeige 4.1-3B行业方案:数据库课程设计智能辅导系统

南北阁Nanbeige 4.1-3B行业方案&#xff1a;数据库课程设计智能辅导系统 1. 引言&#xff1a;当课程设计遇上AI&#xff0c;会发生什么&#xff1f; 如果你是计算机专业的学生&#xff0c;大概率逃不过“数据库课程设计”这门课。我还记得当年自己做的那个“学生信息管理系统…...

乐高兼容ESP32对讲机:模块化嵌入式音频通信设计

1. 项目概述乐高兼容积木对讲机是一个面向教育与趣味交互场景的嵌入式音频通信系统&#xff0c;其核心设计目标是将专业级无线语音通信能力封装为可拼搭、可扩展、可定制的模块化硬件平台。该项目并非传统意义上的消费级对讲设备&#xff0c;而是一种融合了硬件工程实践、音频信…...

霜儿-汉服-造相Z-Turbo开发环境配置:从零开始搭建Python与PyTorch环境

霜儿-汉服-造相Z-Turbo开发环境配置&#xff1a;从零开始搭建Python与PyTorch环境 想自己动手研究“霜儿-汉服-造相Z-Turbo”这类AI模型的源码&#xff0c;或者想基于它做些二次开发&#xff0c;第一步也是最关键的一步&#xff0c;就是搭建一个稳定、兼容的开发环境。很多朋友…...