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

SpringAI实现AI应用-搭建知识库

SpringAI实战链接

1.SpringAl实现AI应用-快速搭建-CSDN博客

2.SpringAI实现AI应用-搭建知识库-CSDN博客

概述

想要使用SpringAI搭建知识库,就要使用SpringAI中的TikaDocumentReader,它属于ETL(提取、转换、加载)框架中的提取(Extract)阶段。

作用

TikaDocumentReader是Spring AI提供的一个文档读取器,它基于Apache Tika技术实现,能够读取并解析多种格式的文档,包括但不限于PDF、DOC/DOCX、PPT/PPTX和HTML等。这使得TikaDocumentReader成为一个非常灵活和强大的工具,适用于构建知识库或处理各种文档数据。

使用场景

TikaDocumentReader的使用场景非常广泛,包括但不限于:

构建知识库:在构建知识库时,需要从各种格式的文档中提取文本内容。TikaDocumentReader能够轻松地读取这些文档,并将其转换为统一的格式,以便后续的处理和存储。
文档处理:在处理大量文档时,如文档分类、摘要生成等任务中,TikaDocumentReader可以作为一个预处理步骤,将文档内容提取出来,为后续的处理提供便利。
数据清洗:在数据清洗过程中,有时需要从非结构化的文档中提取关键信息。TikaDocumentReader能够读取这些文档,并将其转换为结构化的数据格式,以便进行后续的数据清洗和分析。

准备工作一

在制作本地知识库的时候,还需要安装矢量数据库并下载插件vector,下载矢量化模型

矢量数据库(PostgreSQL)下载地址:EDB: Open-Source, Enterprise Postgres Database Management

插件vector下载地址:vector: Open-source vector similarity search for Postgres / PostgreSQL Extension Network

矢量化模型下载地址:text2vec-base-chinese · 模型库

遇到的问题

问题一

安装完成PostgreSQL之后,想用自带的管理器(pgAdmin4),但是报错,解决了半天没成功,直接改用navicat进行连接,但是连接的时报错(datlastsysoid does not exist),是因为Postgres 15 从pg_database表中删除了 datlastsysoid 字段引发此错误。(我安装的是PostgreSQL17)

解决方式

方法一:升级navicat

方法二:安装Postgres 15以下

方法三:修改navicat的dll文件

详述方法三:找到navicat安装的位置

找到libcc.dll文件(最好进行备份)

使用在线十六进制编辑器打开文件,在线地址:HexEd.it — 基于浏览器的十六进制编辑器

在文件中搜索“SELECT DISTINCT datlastsysoid”,并将其替换为“SELECT DISTINCT dattablespace”

最后另存并替换原来的文件,重启navicat就可以使用了

问题二

安装vector插件的时候遇到的问题,网上也有很多方法,自己百度吧,(真的是一步一个坑)我参考的是:Windows 安装 PostgreSQL 并安装 vector 扩展_win10上安装postgresql的 vector扩展-CSDN博客

问题三

下载矢量化模型

准备工作二

PostgreSQL和插件vector都安装好之后,创建矢量表

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS hstore;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";CREATE TABLE IF NOT EXISTS vector_store (id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,content text,metadata json,embedding vector(768)
);CREATE INDEX ON vector_store USING HNSW (embedding vector_cosine_ops);

搭建工程

通过第一篇帖子,已经可以创建一个SpringAI的demo了,现在需要将矢量化模型放在resources下

修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>SpringAI_Demo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>17</java.version><spring-ai.version>1.0.0-M6</spring-ai.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!--    常规jar--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--    springAI--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><!--    向量存储引擎--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-transformers-spring-boot-starter</artifactId></dependency><!--   向量库--><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency><!--    文档解析器--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-tika-document-reader</artifactId></dependency><!--    lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><resources><resource><directory>src/main/java</directory><!--所在的目录--><includes><!--包括目录下的.properties,.xml 文件都会被扫描到--><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.2.5</version></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories>
</project>

与第一篇相比,多了如下依赖

每个依赖的作用也已经在文件中加了注释

修改application.yml

server:port: 3210spring:#向量库datasource:url: jdbc:postgresql://localhost:5432/postgresusername: postgrespassword: #数据库密码driver-class-name: org.postgresql.Driverai:#调用ai大模型(可使用本地化部署模型,也可以使用线上的)openai:base-url: https://api.siliconflow.cnapi-key: #你自己申请的keychat:options:model: deepseek-ai/DeepSeek-R1-Distill-Qwen-7B#调用矢量化模型embedding:transformer:onnx:modelUri: classpath:/text2vec-base-chinese/onnx/model.onnxtokenizer:uri: classpath:/text2vec-base-chinese/onnx/tokenizer.json#矢量化配置vectorstore:pgvector:index-type: HNSWdistance-type: COSINE_DISTANCEdimensions: 768

EmbeddingController(矢量化接口)

import org.springframework.ai.document.Document;
import org.springframework.ai.reader.tika.TikaDocumentReader;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.util.List;import static java.util.stream.Collectors.toList;/*** @Author majinzhong* @Date 2025/4/30 14:00* @Version 1.0*/
@RestController
public class EmbeddingController {@AutowiredVectorStore vectorStore;@PostMapping("/ai/vectorStore")public List<String> vectorStore(@RequestParam(name = "file") MultipartFile file) throws Exception {// 从IO流中读取文件TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));// 将文本内容划分成更小的块List<Document> splitDocuments = new TokenTextSplitter().apply(tikaDocumentReader.read());// 存入向量数据库,这个过程会自动调用embeddingModel,将文本变成向量再存入。vectorStore.add(splitDocuments);return splitDocuments.stream().map(Document::getText).collect(toList());}@GetMapping("/ai/vectorSearch")public List<String> vectorSearch(@RequestParam(name = "text") String text) {List<Document> documents = vectorStore.similaritySearch(SearchRequest.builder().query(text).topK(1).build());return documents.stream().map(Document::getText).collect(toList());}
}

修改SimpleAiController(AI接口)

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;import java.util.List;
import java.util.Map;/*** @Author majinzhong* @Date 2025/4/28 10:37* @Version 1.0* SpringAI对话样例*/
@CrossOrigin
@RestController
public class SimpleAiController {@AutowiredVectorStore vectorStore;// 负责处理OpenAI的bean,所需参数来自properties文件private final ChatClient chatClient;//对话记忆private final InMemoryChatMemory inMemoryChatMemory;public SimpleAiController(ChatClient chatClient,InMemoryChatMemory inMemoryChatMemory) {this.chatClient = chatClient;this.inMemoryChatMemory = inMemoryChatMemory;}/*** 根据消息直接输出回答* @param map* @return*/@PostMapping("/ai/call")public String call(@RequestBody Map<String,String> map) {String message = map.get("message");return chatClient.prompt().user(message).call().content().trim();}/*** 根据消息采用流式输出* @param message* @return*/@PostMapping(value = "/ai/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ServerSentEvent<String>> streamChat(@RequestParam(value = "message", defaultValue = "Hello!") String message) {return chatClient.prompt(message).stream().content().map(content -> ServerSentEvent.builder(content).event("message").build())//问题回答结速标识,以便前端消息展示处理.concatWithValues(ServerSentEvent.builder("").build()).onErrorResume(e -> Flux.just(ServerSentEvent.builder("Error: " + e.getMessage()).event("error").build()));}/*** 对话记忆(多轮对话)* @param message* @return* @throws InterruptedException*/@GetMapping(value = "/ai/streamresp", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ServerSentEvent<String>> streamResp(@RequestParam(value = "message", defaultValue = "Hello!") String message){Flux<ServerSentEvent<String>> serverSentEventFlux = chatClient.prompt(message).advisors(new MessageChatMemoryAdvisor(inMemoryChatMemory, "123", 10), new SimpleLoggerAdvisor()).stream().content().map(content -> ServerSentEvent.builder(content).event("message").build())//问题回答结速标识,以便前端消息展示处理.concatWithValues(ServerSentEvent.builder("").build()).onErrorResume(e -> Flux.just(ServerSentEvent.builder("Error: " + e.getMessage()).event("error").build()));return serverSentEventFlux;}/*** 整合知识库和自己提问的问题一块向AI提问* @param message* @return*/@GetMapping("/ai/vectorStoreChat")public Flux<String> ollamaApi(@RequestParam(value = "message") String message) {//从知识库检索相关信息,再将检索得到的信息同用户的输入一起构建一个prompt,最后调用ollama apiList<Document> documents = vectorStore.similaritySearch(SearchRequest.builder().query(message).topK(1).build());String targetMessage = String.format("已知信息:%s\n 用户提问:%s\n", documents.get(0).getText(), message);return chatClient.prompt(targetMessage).stream().content();}
}

与第一篇相比,多了如下代码

测试

首先测试上传文件到矢量库

上传成功之后,查看数据库已经有数据了

然后测试查询矢量库

最后测试矢量库和AI统一的接口

再来看一下如果只通过AI进行查询会返回什么(没有矢量库)

如此看来,本地化知识库成功,接下来就剩往里面一直添数据了。

相关文章:

SpringAI实现AI应用-搭建知识库

SpringAI实战链接 1.SpringAl实现AI应用-快速搭建-CSDN博客 2.SpringAI实现AI应用-搭建知识库-CSDN博客 概述 想要使用SpringAI搭建知识库&#xff0c;就要使用SpringAI中的TikaDocumentReader&#xff0c;它属于ETL&#xff08;提取、转换、加载&#xff09;框架中的提取&…...

大连理工大学选修课——机器学习笔记(4):NBM的原理及应用

NBM的原理及应用 贝叶斯决策及相关 贝叶斯决策 对于给定数据集 X [ X 1 , X 2 , ⋯ , X d ] T X[X_1,X_2,\cdots,X_d]^T X[X1​,X2​,⋯,Xd​]TK个类 C i , i 1 , ⋯ , K C_i,i1,\cdots,K Ci​,i1,⋯,K, 满足 P ( C i ) > 0 a n d ∑ P ( C i ) 1 P(C_i)>0\ and\ …...

SQL Server 数据库重命名

通过将 SQL Server 数据库置于单用户模式&#xff0c;对其重命名 使用下列步骤在 SSMS 中使用 T-SQL 重命名 SQL Server 数据库。 1.为实例连接到 master 数据库。 2.打开一个查询窗口。 3.将以下示例复制并粘贴到查询窗口中&#xff0c;然后选择“执行”。 此示例将 MyTes…...

5W1H分析法——AI与思维模型【86】

一、定义 5W1H分析法思维模型是一种通过对问题或事件从原因&#xff08;Why&#xff09;、对象&#xff08;What&#xff09;、地点&#xff08;Where&#xff09;、时间&#xff08;When&#xff09;、人员&#xff08;Who&#xff09;和方法&#xff08;How&#xff09;六个…...

【closerAI ComfyUI】开源社区炸锅!comfyUI原生支持Step1X-Edit 图像编辑!离简单免费高效又进一步

添加图片注释,不超过 140 字(可选) 更多AI前沿科技资讯,请关注我们: closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 【closerAI ComfyUI】开源社区炸锅!comfyUI原生支持Step1X-Edit 图像编辑!离简单免费高效又进一步! 大家好,我是Jimmy。前面有介绍了阶跃…...

spring中关键字Assert和jdk的assert关键字

你提出的问题非常关键&#xff0c;涉及到 Java 中两种不同的 assert 用法&#xff1a; ✅ 一、你提到的两种 assert 类型 示例 来源 特点 JDK 自带的 assert 关键字 assert str ! null; Java 原生语言特性&#xff08;JDK 1.4&#xff09; 可开关控制&#…...

git分支分叉强制更改为线性

git分支分叉更改为线性 远端分支情况 本地分支情况 在执行 git pull origin main 时遇到了一个提示&#xff0c;说明本地分支和远程分支发生了分歧&#xff08;divergent branches&#xff09;。 这通常是因为远程分支上有新的提交&#xff0c;而本地分支也有未推送的提交&a…...

从实列中学习linux shell6: 写一个 shell 脚本 过滤 恶意ip 攻击

下面是检测和过滤恶意IP攻击的Shell脚本&#xff0c;包含自动分析日志、封锁IP、白名单管理等功能&#xff1a; 第一步&#xff1a;过滤脚本 #!/bin/bash# 配置区域&#xff08;根据需求修改&#xff09; LOG_FILES(/var/log/auth.log /var/log/nginx/access.log) # 监控的日…...

代码随想录打卡|Day31动态规划(最后一块石头的重量2、目标和、一和零)

动态规划Part 04 最后一块石头的重量 II 力扣题目链接 代码随想录链接 视频讲解链接 题目描述&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉…...

一区思路!挑战5天一篇NHANES预测模型 DAY1-5

挑战5天一篇预测模型NHANES Day1! 近期美国关闭seer数据库的信息在互联网上广泛传播&#xff0c;大家都在担心数据库挖掘是否还能做。这个问题其实是有答案的&#xff0c;数据库挖掘肯定能做&#xff0c;做没被关的数据库即可&#xff0c;同时留意一些国产数据库&#xff5e;…...

Stack--Queue 栈和队列

一、Stack--栈 1.1 什么是栈&#xff1f; 堆栈是一种容器适配器&#xff0c;专门设计用于在 LIFO 上下文&#xff08;后进先出&#xff09;中运行&#xff0c;其中元素仅从容器的一端插入和提取。 第一个模版参数T&#xff1a;元素的类型&#xff1b;第二个模版参数Container…...

Redis热key大key详解

不要阻挡我走向成功&#xff0c;勇者配享所有&#xff0c;感想敢干 hotkey热key 大量请求可能会使redis节点流量不均匀&#xff0c;进而导致宕机&#xff0c;继而打到数据库崩溃&#xff1b;因此需要对热key优化 引发问题&#xff1a; 分片服务瘫痪可能打到数据库&#xff0…...

软件架构选型之“如何选”

本文提出的多维度评估框架旨在建立客观、全面的架构选型方法论&#xff0c;帮助团队做出更科学的架构决策&#xff0c;通过业务需求、技术约束、组织能力和演进策略四个核心维度建立量化评估模型。该框架旨在解决移动应用架构决策中的主观性和片面性问题&#xff0c;提供系统化…...

C语言写文件模式错误

“w” 和“wb”区别 出错实例 图像.raw文件输出时&#xff0c;采用“w”模式打开写文件&#xff0c;会将值为0A (即\n的ASCII值)&#xff0c;前自动添加0D(即\r的ASCII值)&#xff0c;如下图所示...

2025最新福昕PDF编辑器,PDF万能处理工具

软件介绍 Foxit PDF Editor Pro 2025 中文特别版&#xff08;以前称为 Foxit PhantomPDF Business&#xff09;是一款专为满足各种办公需求而设计的业务就绪的PDF工具包。 软件特点 1. 强大的PDF编辑能力 创建新文档&#xff1a;用户可以从无到有地构建PDF文档&#xff0c;添…...

Android 动态权限申请

ContextCompat.checkSelfPermission 检查应用是否具有某个危险权限。如果应用具有此权限&#xff0c;方法将返回PackageManager.PERMISSION_GRANTED&#xff0c;并且应用可以继续操作。如果应用不具有此权限&#xff0c;方法将返回PackageManager.PERMISSION_DENIED&#xff0c…...

【模型量化】量化基础

目录 一、认识量化 二、量化基础原理 2.1 对称量化和非对称量化 2.1.1 对称量化 2.1.2 非对称量化 2.1.3 量化后的矩阵乘 2.2 神经网络量化 2.2.1 动态量化 2.2.2 静态量化 2.3 量化感知训练 一、认识量化 量化的主要目的是节约显存、提高计算效率以及加快通信 dee…...

智能 + 安全:婴幼儿托育管理实训基地标准化建设方案

婴幼儿托育服务与管理实训基地智能安全的开发&#xff0c;需以“岗位能力-职业标准-行业需求”为核心逻辑&#xff0c;构建“需求分析-课程设计-教学实施-效果评估”全闭环体系。结合托育行业难点、技术赋能手段及职业能力要求&#xff0c;呈现课程开发全流程&#xff0c;重点突…...

AI重构家居营销新范式:DeepSeek如何破解行业流量与转化困局?

1. 流量下滑、成本攀升、内容同质化&#xff1a;家居行业亟需一场“效率革命” 中国家居行业正经历一场深刻的转型阵痛。线下门店客流量持续萎缩&#xff0c;线上获客成本攀升至临界点&#xff0c;传统营销模式陷入“高投入、低转化”的泥潭&#xff1b;智能家居产品快速迭代&…...

机器学习实操 第一部分 机器学习基础 第7章 集成学习与随机森林

机器学习实操 第一部分 机器学习基础 第7章 集成学习与随机森林 内容概要 第7章深入探讨了集成学习方法&#xff0c;这是一种结合多个预测模型&#xff08;如分类器或回归器&#xff09;以提高预测性能的技术。这些方法通过利用群体的智慧&#xff0c;可以比单个模型获得更好…...

如何用GPU Instancing来优化树木草石重复模型

1&#xff09;如何用GPU Instancing来优化树木草石重复模型 2&#xff09;Unity ASTC压缩后的纹理在部分安卓机型上不显示 3&#xff09;现在大部分项目的竖版UI设计分辨率是多少 4&#xff09;Android上拖拽物体不实时跟随手指的问题 这是第430篇UWA技术知识分享的推送&#x…...

Windows服务器部署全攻略:Flask+Vue+MySQL跨平台项目实战(pymysql版)

当你的后端(Flask+pymysql,Windows开发)与前端(Vue,Mac开发)需要统一部署到Windows服务器时,通过「IIS反向代理+原生组件适配」方案可实现稳定交互。以下是针对Windows环境的专属部署指南,解决路径适配、服务启动等核心问题。 一、Windows服务器环境准备(必做!) 1…...

自动驾驶-一位从业两年的独特视角

时间简介 2023.03 作为一名大三学生&#xff0c;加入到某量产车企&#xff0c;从事地图匹配研发 2023.07 地图匹配项目交付&#xff0c;参与离线云端建图研发 2023.10 拿到24届校招offer 2024.07 正式入职 2025.01 离线云端建图稳定&#xff0c;开始接触在线车端融图研发 自动…...

Vue 3 单文件组件中 VCA 语法糖及核心特性详解

在 Vue.js 的开发世界里&#xff0c;单文件组件&#xff08;Single File Components&#xff0c;简称 SFC&#xff09;是构建复杂应用的基石。它将 HTML、CSS 和 JavaScript 代码封装在一个.vue文件中&#xff0c;极大地提高了代码的可维护性和复用性。 本文将深入探讨单文件组…...

iVX:数字化转型全场景技术革新与生态构建实践

在数字经济蓬勃发展的当下&#xff0c;企业数字化转型需求日益迫切。iVX 凭借其独特的技术架构与创新解决方案&#xff0c;深度渗透工业互联网、元宇宙、智慧城市等领域&#xff0c;成为推动全场景数字化转型的重要力量。本文将重新梳理 iVX 的技术应用与生态价值&#xff0c;以…...

车辆检测新突破:VFM-Det 如何用大模型提升识别精度

目录 ​编辑 一、摘要 二、引言 三、相关工作 四、Coovally AI模型训练与应用平台 五、方法 概述 综述&#xff1a;基于区域建议的检测 基于VehicleMAE的感知器 六、实验分析 数据集与评估指标 实现细节 属性预测模块预训练 与SOTA检测器的对比实验 消融实验 V…...

可视化图解算法:判断是否完全二叉树

1. 题目 描述 给定一个二叉树&#xff0c;确定他是否是一个完全二叉树。 完全二叉树的定义&#xff1a;若二叉树的深度为 h&#xff0c;除第 h 层外&#xff0c;其它各层的结点数都达到最大个数&#xff0c;第 h 层所有的叶子结点都连续集中在最左边&#xff0c;这就是完全二…...

对于C++中的STL,push_back()和emplace_back()有什么区别?

1.push_back()&#xff1a; 语法为&#xff1a;container.push_back()&#xff0c;接收一个值或一个对象的移动/复制副本&#xff1b; 在将对象添加或移动到容器的末尾前&#xff0c;需要先调用构造函数实例化对象&#xff0c;然后再执行移动或复制操作。 2.emplace_back()&a…...

小程序中的页面跳转

小程序中的页面跳转 在之前网页的学习中&#xff0c;我们往往采用超链接&#xff0c;或者定义方法、函数等方式来实现页面的跳转&#xff0c;但是微信小程序中没有超链接&#xff0c;那我们该如何实现呢&#xff1f;微信小程序的页面跳转包括两个&#xff0c;一个是tabBar页面…...

分享一款免费的AI IDE Trae,全新支持DeepSeek R1/V3、豆包大模型1.5自由切换,更可自定义专属AI模型

分享一款免费的AI IDE Trae&#xff0c;全新支持DeepSeek R1/V3、豆包大模型1.5自由切换,更可自定义专属AI模型,加入我的邀请一起拿好礼,转发给技术搭子还有机会赢取华为MatePad Air、雷蛇机械键盘、热门会员卡等丰厚奖品&#xff0c;即刻体验>>: https://juejin.cn/loy…...

美团优选小程序 mtgsig 分析 mtgsig1.2

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 部分python代码 openId a…...

Java中的多态与继承

Java中的多态与继承 开始学习Java中的多态及如何在多态方法调用中进行方法调用 多态——即对象根据其类型执行特定操作的能力——是Java代码灵活性的核心。四人组&#xff08;Gang Of Four&#xff09;创建的许多设计模式都依赖于某种形式的多态&#xff0c;包括命令模式。本文…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(12): ておき ます

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;12&#xff09;&#xff1a; ておき ます。 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰 2、知识点&#xff08;1&#xff09;&#xff5e;ておき ます。&#xff08;2&#x…...

MicroPython for esp32s3开发HX711称重模块指南

一、HX711模块基本介绍 一&#xff09;、核心功能 ‌24位高精度ADC‌ 专为称重传感器设计的模数转换芯片&#xff0c;支持20mV或40mV满幅差分输入内置128/64倍可编程增益放大器&#xff08;通道A&#xff09;及固定32倍增益&#xff08;通道B&#xff09; ‌集成化设计‌ 集成…...

智能机器人在物流行业的应用:效率提升与未来展望

随着全球电子商务的蓬勃发展&#xff0c;物流行业正面临着前所未有的挑战和机遇。传统的物流模式已经难以满足日益增长的市场需求&#xff0c;尤其是在效率、成本控制和精准配送方面。智能机器人技术的出现&#xff0c;为物流行业的转型升级提供了强大的动力。本文将探讨智能机…...

MiWi|Microchip开发的专有无线通信协议,适用于低功耗、短距离的无线个人局域网【无线通信小百科】

1、什么是MiWi MiWi&#xff08;Microchip Wireless&#xff09;是一种由 Microchip 公司开发的专有无线通信协议。 它基于 IEEE 802.15.4 标准&#xff0c;适用于低功耗、短距离的无线个人局域网&#xff08;WPAN&#xff0c;Wireless Personal Area Network&#xff09;。 M…...

分布式事务,事务失效,TC事务协调者

1. 概述 本方案书旨在解决分布式系统中事务一致性问题&#xff0c;重点阐述全局事务标识&#xff08;XID&#xff09;的传递与存储机制、事务协调者&#xff08;TC&#xff09;的设计与部署&#xff0c;以及分布式事务失效场景的应对策略。基于业界成熟框架&#xff08;如Seat…...

ESP32开发-作为TCP客户端发送数据到网络调试助手

​​代码&#xff08;作为TCP客户端&#xff09;​​ #include <SPI.h> #include <EthernetENC.h> // 使用EthernetENC库// 网络配置 byte mac[] {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // MAC地址 IPAddress ip(192, 168, 1, 100); // ESP32的IP IPAddr…...

halcon打开图形窗口

1、dev_open_window 参数如下&#xff1a; 1&#xff09;Row(输入参数) y方向上&#xff0c;图形窗口距离左上角顶端的像素个数 2&#xff09;Column(输入参数) x方向上&#xff0c;距离左上角左边的像素个数 3&#xff09;Width(输入参数) 图形窗口宽度 4&#xff09;He…...

LVGL -按键介绍 下

4 图标 4.1 内置图标 LVGL 提供了一个很方便的 图标字体 系统&#xff0c;它使用了 lv_label 来显示文本或图标。你可以选择 Font Awesome 或其他图标字体&#xff0c;并将其直接嵌入应用中。LVGL 内建图标字体&#xff08;如 LV_SYMBOL_*&#xff09;是可以改变大小的。通过…...

【默子速报】DeepSeek新模型 Prover-V2 报告解读

炸裂&#xff0c;太炸裂了&#xff0c;五一不放假是吧&#xff1f;&#xff01; 默子加班加点的肝解读&#xff01; 首先是&#xff0c;Deepseek今天下午显示毫无预兆的在HF上发布了最新的Prover-V2参数 直接让一群人瞬间热血沸腾&#xff0c;想要看看Deepseek又干了什么大事。…...

冰冰一号教程网--介绍采用vuepress搭建个人博客

文章说明 采用vuepress可以快速搭建个人网站&#xff0c;风格统一&#xff1b;采用GPT可以将博文转化为个人博客网站 冰冰一号教程网 访问地址 目前只支持到 2025年05月1号 22点 教程包括主流编程语言&#xff1a;Java、JavaScript、python、C语言、C、C# 教程讲义由GPT生成&am…...

借助电商 API 接口实现电商平台商品数据分析的详细步骤分享

在数字化商业浪潮中&#xff0c;电商平台积累了海量数据。如何从这些数据中挖掘有价值的信息&#xff0c;成为电商企业提升竞争力的关键。电商 API 接口在这一过程中发挥着核心作用&#xff0c;它为获取和分析商品数据提供了高效途径。本文将详细介绍借助电商 API 接口实现电商…...

32单片机——串口

1、通信 通信的方式可以分为多种&#xff1a; &#xff08;1&#xff09;按照数据传送方式可分为串行通信和并行通信&#xff1b; ①串行通信 基本特征&#xff1a;数据逐位顺序依次传输 优点&#xff1a;传输线少、布线成本低、灵活度高等优点&#xff0c;一般用于近距离人…...

6.应用层

6. 应用层 1. 概述 应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分 早期基于文本的应用&#xff08;电子邮件、远程登录、文件传输、新闻组&#xff09;20世纪90年代将因特网带入千家万户的万维…...

【鸿蒙HarmonyOS】一文详解华为的服务卡片

7.服务卡片 1.什么是卡片 Form Kit&#xff08;卡片开发服务&#xff09;提供一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到服务卡片&#xff08;以下简称“卡片”&#xff09;&#xff0c;以达到服务直达、减少跳转层级的体验效果。卡片常用于嵌入到其他应…...

深度卷积模型:案例研究

1 为什么要进行案例研究&#xff1f; 过去&#xff0c;计算机视觉中的大量研究都集中在如何将卷积层、池化层以及全连接层这些基本组件组合起来&#xff0c;形成有效的卷积神经网络。 找感觉的最好方法之一就是去看一些示例&#xff0c;就像很多人通过看别人的代码来学习编程一…...

BBR 的 RTT 公平性问题求解

如果 BBR 要跟 reno/cubic 公平&#xff0c;只能顾此失彼&#xff0c;没有任何变通方法&#xff0c;唯一的方法就是在放弃 reno/cubic&#xff0c;但前提你得保证 BBR 流之间是公平的。如果非要照顾 reno/cubic&#xff0c;那就必须要变成 reno/cubic&#xff0c;这就是 BBRv2/…...

SQL命令二:SQL 高级查询与特殊算法

引言 在掌握了 SQL 的基础操作和建表约束后&#xff0c;我们可以进一步探索 SQL 的高级查询功能和一些特殊算法。这些高级技巧能够帮助我们更高效地处理和分析数据&#xff0c;满足复杂的业务需求。 一、查询进阶 &#xff08;一&#xff09;简单查询 简单查询通过 select 语…...

Databend 产品月报(2025年4月)

很高兴为您带来 Databend 2025 年 4 月的最新更新、新功能和改进&#xff01;我们希望这些增强功能对您有所帮助&#xff0c;并期待您的反馈。 BendDeploy&#xff1a;安装 Databend 的新方式 BendDeploy 是由 Databend 开发的一款基于 Kubernetes 的平台&#xff0c;旨在简化…...