【商城实战(11)】解锁商品搜索与筛选功能,提升用户购物体验
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。
目录
- 一、前端实现:搭建搜索与筛选交互界面
- 1.1 移动前端(uniapp 实现)
- 1.2 PC 前端(Element Plus 实现)
- 二、后端接口开发:构建数据查询桥梁
- 2.1 接口设计与规划
- 2.2 SQL 语句实现基础查询
- 2.3 MyBatis - plus 动态 SQL 优化
- 三、全文搜索技术应用:提升搜索效能
- 3.1 MySQL 全文索引
- 3.1.1 创建全文索引
- 3.1.2 使用 MATCH AGAINST 语句进行全文搜索
- 3.1.3 原理和优势分析
- 3.2 Elasticsearch 应用
- 3.2.1 数据索引到 Elasticsearch
- 3.2.2 使用 Elasticsearch 进行搜索
- 使用 match 查询进行全文搜索
- 使用 bool 查询进行多条件筛选
- 3.2.3 优势分析
一、前端实现:搭建搜索与筛选交互界面
在商城系统中,商品搜索与筛选功能是提升用户购物体验的关键环节。前端作为用户直接交互的界面,其实现的好坏直接影响用户的操作便捷性和满意度。接下来,我们将分别介绍如何在移动前端使用 uniapp,以及在 PC 前端使用 Element Plus 来实现商品搜索框及筛选条件栏。
1.1 移动前端(uniapp 实现)
uniapp 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到 iOS、Android、Web(响应式)、以及各种小程序(微信 / 支付宝 / 百度 / 头条 / QQ / 钉钉)等多个平台。
首先,在 uniapp 项目中创建搜索与筛选页面。在页面的 template 部分,我们使用uni-search-bar组件来创建搜索框,使用view和picker等组件来构建筛选条件栏。以下是核心代码示例:
<template><view class="container"><!-- 搜索框 --><uni-search-bar:show-action="false"placeholder="搜索商品"@input="handleSearchInput"></uni-search-bar><!-- 筛选条件栏 --><view class="filter"><view class="filter-item" @click="toggleFilter('category')"><text>分类</text><text>{{ selectedCategory }}</text><view class="arrow"></view></view><view class="filter-item" @click="toggleFilter('price')"><text>价格</text><text>{{ priceRange }}</text><view class="arrow"></view></view><!-- 更多筛选条件可依此结构添加 --></view><!-- 筛选条件弹出层 --><viewclass="filter-popup"v-if="filterVisible"><view v-if="filterType === 'category'"><pickermode="selector":range="categoryList"@change="handleCategoryChange"><view class="picker-item">选择分类</view></picker></view><view v-if="filterType === 'price'"><pickermode="range":range="priceRanges"@change="handlePriceChange"><view class="picker-item">选择价格范围</view></picker></view></view></view>
</template><script>
export default {data() {return {searchText: '',filterVisible: false,filterType: '',selectedCategory: '全部',categoryList: ['全部', '电子产品', '服装', '食品'],priceRange: '全部',priceRanges: [['全部', '0-100', '100-500', '500以上']]};},methods: {handleSearchInput(e) {this.searchText = e.detail.value;// 这里可以添加发送搜索请求的逻辑},toggleFilter(type) {this.filterType = type;this.filterVisible = true;},handleCategoryChange(e) {this.selectedCategory = this.categoryList[e.detail.value];this.filterVisible = false;// 这里可以添加根据分类筛选商品的逻辑},handlePriceChange(e) {this.priceRange = this.priceRanges[e.detail.value];this.filterVisible = false;// 这里可以添加根据价格筛选商品的逻辑}}
};
</script><style scoped>
.container {padding: 20rpx;
}
.filter {display: flex;justify-content: space-around;margin-top: 20rpx;
}
.filter-item {display: flex;align-items: center;
}
.arrow {width: 0;height: 0;border-left: 6rpx solid transparent;border-right: 6rpx solid transparent;border-top: 6rpx solid #000;margin-left: 10rpx;
}
.filter-popup {position: fixed;bottom: 0;left: 0;right: 0;background-color: #fff;padding: 20rpx;
}
.picker-item {padding: 15rpx 0;
}
</style>
代码逻辑分析:
- uni-search-bar组件用于创建搜索框,@input事件绑定handleSearchInput方法,当用户输入内容时,将输入值存储到searchText变量中,后续可用于发送搜索请求。
- filter类的view用于包裹筛选条件栏,每个筛选条件项通过点击事件toggleFilter来控制筛选条件弹出层的显示,并根据点击的条件类型设置filterType。
- filter-popup类的view是筛选条件弹出层,根据filterType的值来决定显示不同的筛选内容,如分类选择器或价格范围选择器。
- picker组件用于实现具体的筛选选择功能,通过@change事件绑定相应的处理方法,如handleCategoryChange和handlePriceChange,在方法中更新筛选条件并隐藏弹出层,同时可添加筛选逻辑。
1.2 PC 前端(Element Plus 实现)
Element Plus 是一款基于 Vue 3.0 的桌面端组件库,提供了丰富的组件和功能,方便开发者快速构建美观、高效的 PC 端界面。
在 PC 前端使用 Element Plus 实现商品搜索与筛选功能,我们可以利用el-input组件创建搜索框,使用el-dropdown和el-select等组件实现筛选条件栏。以下是代码示例:
<template><div class="search-filter-container"><!-- 搜索框 --><el-inputv-model="searchText"placeholder="搜索商品"clearable@input="handleSearchInput"></el-input><!-- 筛选条件栏 --><el-dropdown trigger="click"><span class="el-dropdown-link">分类 <i class="el-icon-arrow-down el-icon--right"></i></span><el-dropdown-menu slot="dropdown"><el-dropdown-itemv-for="(category, index) in categoryList":key="index"@click="handleCategoryFilter(category)">{{ category }}</el-dropdown-item></el-dropdown-menu></el-dropdown><el-dropdown trigger="click"><span class="el-dropdown-link">价格 <i class="el-icon-arrow-down el-icon--right"></i></span><el-dropdown-menu slot="dropdown"><el-dropdown-itemv-for="(range, index) in priceRanges":key="index"@click="handlePriceFilter(range)">{{ range }}</el-dropdown-item></el-dropdown-menu></el-dropdown><!-- 更多筛选条件可依此结构添加 --></div>
</template><script setup>
import { ref } from 'vue';const searchText = ref('');
const categoryList = ref(['全部', '电子产品', '服装', '食品']);
const priceRanges = ref(['全部', '0-100', '100-500', '500以上']);const handleSearchInput = (value) => {searchText.value = value;// 这里可以添加发送搜索请求的逻辑
};const handleCategoryFilter = (category) => {// 这里可以添加根据分类筛选商品的逻辑console.log(`筛选分类: ${category}`);
};const handlePriceFilter = (range) => {// 这里可以添加根据价格筛选商品的逻辑console.log(`筛选价格范围: ${range}`);
};
</script><style scoped>
.search-filter-container {display: flex;align-items: center;margin-bottom: 20px;
}
.search-filter-container .el-input {width: 300px;margin-right: 20px;
}
.el-dropdown-link {cursor: pointer;margin-right: 20px;
}
</style>
代码解释:
- el-input组件创建了搜索框,v-model绑定searchText变量,实现输入值的双向绑定,@input事件触发handleSearchInput方法,用于处理搜索逻辑。
- el-dropdown组件结合el-dropdown-menu和el-dropdown-item实现了筛选条件的下拉菜单。例如,通过点击 “分类” 下拉菜单,用户可以选择不同的商品分类,点击事件handleCategoryFilter用于处理分类筛选逻辑。
- 同样,“价格” 筛选条件也是通过类似的结构实现,点击不同的价格范围选项,触发handlePriceFilter方法来处理价格筛选逻辑。
二、后端接口开发:构建数据查询桥梁
前端界面搭建完成后,需要后端接口提供数据支持。后端接口负责接收前端传递的搜索和筛选条件,与数据库进行交互,并返回符合条件的商品数据。
2.1 接口设计与规划
我们使用 Spring Boot 来构建后端接口。接口设计如下:
- 请求方式:使用 GET 请求,符合 RESTful 风格,方便前端调用和数据获取。
- 接口路径:/api/products/search。
- 参数定义:
-
- keyword:字符串类型,用于模糊搜索商品名称,可为空。
-
- category:字符串类型,筛选商品分类,可为空。
-
- minPrice:浮点数类型,筛选商品的最低价格,默认为 0。
-
- maxPrice:浮点数类型,筛选商品的最高价格,默认为一个较大值(如 999999)。
-
- pageNum:整数类型,当前页码,默认为 1。
-
- pageSize:整数类型,每页显示的商品数量,默认为 10。
- 返回数据结构:返回一个包含商品列表和总记录数的 JSON 对象。例如:
{"total": 100,"products": [{"id": 1,"name": "商品1","category": "电子产品","price": 199.99,"description": "这是商品1的描述"},// 更多商品数据]
}
2.2 SQL 语句实现基础查询
在数据库中,商品信息存储在products表中。以下是使用 SQL 语句实现商品搜索与筛选的示例:
-- 模糊搜索商品名称并进行多条件筛选
SELECT * FROM products
WHERE (name LIKE '%?%' OR? IS NULL)AND (category =? OR? IS NULL)AND price BETWEEN? AND?
LIMIT?,?;
解释:
- name LIKE '%?%'实现模糊搜索,?为前端传递的keyword参数。
- (category =? OR? IS NULL)实现分类筛选,如果category参数为空则不进行分类筛选。
- price BETWEEN? AND?实现价格范围筛选。
- LIMIT?,?用于分页,第一个?为(pageNum - 1) * pageSize,第二个?为pageSize。
2.3 MyBatis - plus 动态 SQL 优化
MyBatis - plus 是一个 MyBatis 的增强工具,简化了 SQL 语句的编写和操作。结合 MyBatis - plus 的动态 SQL 功能,我们可以更灵活地构建查询逻辑。
首先,在pom.xml文件中添加 MyBatis - plus 依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>最新版本</version>
</dependency>
然后,定义商品实体类Product和对应的 Mapper 接口ProductMapper。
在ProductMapper.xml文件中,使用 MyBatis - plus 的动态 SQL 标签实现动态查询:
<select id="searchProducts" resultType="Product">SELECT * FROM products<where><if test="keyword!= null and keyword!= ''">name LIKE concat('%', #{keyword}, '%')</if><if test="category!= null and category!= ''">AND category = #{category}</if><if test="minPrice!= null">AND price >= #{minPrice}</if><if test="maxPrice!= null">AND price <= #{maxPrice}</if></where>LIMIT #{(pageNum - 1) * pageSize}, #{pageSize}
</select>
在 Mapper 接口中定义方法:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface ProductMapper extends BaseMapper<Product> {List<Product> searchProducts(@Param("keyword") String keyword,@Param("category") String category,@Param("minPrice") Double minPrice,@Param("maxPrice") Double maxPrice,@Param("pageNum") Integer pageNum,@Param("pageSize") Integer pageSize);
}
在 Service 层调用 Mapper 方法:
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;@Service
public class ProductService {@Resourceprivate ProductMapper productMapper;public IPage<Product> searchProducts(String keyword,String category,Double minPrice,Double maxPrice,Integer pageNum,Integer pageSize) {Page<Product> page = new Page<>(pageNum, pageSize);List<Product> products = productMapper.searchProducts(keyword, category, minPrice, maxPrice, pageNum, pageSize);page.setRecords(products);// 这里可以添加查询总记录数的逻辑并设置到page中return page;}
}
动态 SQL 在优化查询方面的优势主要体现在:
- 灵活性:根据不同的业务需求和前端传递的参数,动态生成 SQL 语句,避免了编写大量重复的 SQL 代码。例如,当用户只进行搜索而不筛选分类时,不会生成分类筛选的 SQL 片段,提高了查询的针对性。
- 可维护性:将 SQL 语句和 Java 代码分离,使得代码结构更加清晰。当查询逻辑发生变化时,只需要修改 XML 文件中的 SQL 语句,而不需要修改 Java 代码,降低了维护成本。
- 可读性:通过使用等标签,使 SQL 语句的逻辑更加直观,易于理解和调试。
三、全文搜索技术应用:提升搜索效能
随着商城业务的增长和商品数据量的不断增大,传统的 SQL 查询在搜索性能和准确性方面可能会遇到瓶颈。为了提升搜索体验,引入全文搜索技术是一种有效的解决方案。下面将介绍两种常见的全文搜索技术:MySQL 全文索引和 elasticsearch。
3.1 MySQL 全文索引
MySQL 全文索引是一种特殊类型的索引,它允许在文本数据中进行高效的搜索操作。通过为文本数据中的单词和词组创建索引,用户可以快速查找到包含特定词汇的记录。
3.1.1 创建全文索引
在 MySQL 中,并非所有存储引擎都支持全文索引,常用的支持全文索引的存储引擎是 InnoDB(从 MySQL 5.6 版本开始支持)和 MyISAM 。
- 创建表时添加全文索引:
CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255),description TEXT,FULLTEXT (name, description)
) ENGINE=InnoDB;
上述代码在products表的name和description字段上创建了全文索引。
- 在已存在的表上添加全文索引:
ALTER TABLE products ADD FULLTEXT (name, description);
此语句为已存在的products表的name和description字段添加全文索引。
3.1.2 使用 MATCH AGAINST 语句进行全文搜索
MySQL 使用MATCH … AGAINST语法进行全文搜索。例如,要查找name或description字段中包含 “手机” 的商品记录,可以使用以下查询:
SELECT * FROM products
WHERE MATCH (name, description) AGAINST ('手机');
这是自然语言模式的搜索,也是默认模式。在自然语言模式下,MySQL 会根据每个单词在整个集合中出现的频率以及它们在给定文档中出现的频率来计算相关性,搜索结果会按照相关性由高到低排序。
另外,MATCH … AGAINST还支持布尔模式,布尔模式提供了更复杂的搜索功能,允许使用操作符如+(必须存在)、-(必须不存在)、*(通配符)等。例如,要查询name字段中必须包含 “苹果” 且不能包含 “华为” 的商品:
SELECT * FROM products
WHERE MATCH (name) AGAINST ('+苹果 -华为' IN BOOLEAN MODE);
3.1.3 原理和优势分析
MySQL 全文索引的原理是通过倒排索引实现的。倒排索引在辅助表中存储了单词与单词在文档中所在位置之间的映射,这样在搜索时可以快速定位到包含特定单词的文档。其优势主要体现在:
- 快速定位:对于大规模文本数据的搜索,能够快速定位到包含关键词的记录,大大提高搜索效率。例如在一个拥有数百万商品记录的商城数据库中,使用全文索引可以在短时间内找到相关商品。
- 语义理解:自然语言模式下,能够根据单词的频率和分布计算相关性,返回更符合用户意图的结果,提升搜索的准确性 。例如用户搜索 “运动鞋”,相关性高的包含 “运动鞋” 的商品会排在前面。
3.2 Elasticsearch 应用
Elasticsearch 是一个基于 Lucene 的开源分布式搜索引擎,它提供了高扩展性、高可用性和高性能的搜索解决方案,在商品搜索中有着广泛的应用。
3.2.1 数据索引到 Elasticsearch
首先,需要将商城的商品数据索引到 Elasticsearch 中。可以使用 Elasticsearch 提供的 REST API 或各种客户端库(如 Java 的 Elasticsearch High - Level REST Client)来实现数据的索引。
以 Java 的 Elasticsearch High - Level REST Client 为例,假设商品实体类为 Product
,索引名为 products
,以下是将商品数据索引到 Elasticsearch 的示例代码:
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;import java.io.IOException;class Product {private int id;private String name;private String description;private double price;private String category;public Product(int id, String name, String description, double price, String category) {this.id = id;this.name = name;this.description = description;this.price = price;this.category = category;}public int getId() {return id;}public String getName() {return name;}public String getDescription() {return description;}public double getPrice() {return price;}public String getCategory() {return category;}
}public class ElasticsearchIndexer {private static final String INDEX_NAME = "products";public static void main(String[] args) throws IOException {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));Product product = new Product(1, "iPhone 14", "A great smartphone", 999.99, "Electronics");IndexRequest request = new IndexRequest(INDEX_NAME).id(String.valueOf(product.getId())).source("{\"name\":\"" + product.getName() + "\",\"description\":\"" + product.getDescription() + "\",\"price\":" + product.getPrice() + ",\"category\":\"" + product.getCategory() + "\"}", XContentType.JSON);IndexResponse response = client.index(request, RequestOptions.DEFAULT);System.out.println(response.getResult());client.close();}
}
上述代码创建了一个 RestHighLevelClient
客户端,然后构建了一个 IndexRequest
请求,将商品数据以 JSON 格式存储到 Elasticsearch 的 products
索引中。
3.2.2 使用 Elasticsearch 进行搜索
Elasticsearch 提供了丰富的查询语法来满足不同的搜索需求。以下是使用 Java 代码实现不同搜索需求的示例:
使用 match 查询进行全文搜索
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;import java.io.IOException;public class ElasticsearchSearchMatch {private static final String INDEX_NAME = "products";public static void main(String[] args) throws IOException {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 创建 match 查询MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", "手机");// 构建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(matchQuery);SearchRequest searchRequest = new SearchRequest(INDEX_NAME);searchRequest.source(searchSourceBuilder);// 执行搜索SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);// 处理搜索结果System.out.println(searchResponse);client.close();}
}
这个查询会在 products
索引的 name
字段中搜索包含 “手机” 的文档。
使用 bool 查询进行多条件筛选
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;import java.io.IOException;public class ElasticsearchSearchBool {private static final String INDEX_NAME = "products";public static void main(String[] args) throws IOException {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 创建 bool 查询BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 添加 must 子查询MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", "手机");TermQueryBuilder termQuery = QueryBuilders.termQuery("category", "电子产品");boolQuery.must(matchQuery);boolQuery.must(termQuery);// 添加 filter 子查询RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("price").gte(500).lte(1000);boolQuery.filter(rangeQuery);// 构建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(boolQuery);SearchRequest searchRequest = new SearchRequest(INDEX_NAME);searchRequest.source(searchSourceBuilder);// 执行搜索SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);// 处理搜索结果System.out.println(searchResponse);client.close();}
}
这个代码实现了搜索 “电子产品” 分类下价格在 500 到 1000 之间且名称包含 “手机” 的商品。
3.2.3 优势分析
Elasticsearch 相较于传统数据库搜索,在性能和功能上具有显著优势:
- 分布式架构:Elasticsearch 采用分布式架构,能够轻松应对大规模数据的存储和搜索需求。可以通过添加节点来扩展集群,提高搜索性能和可用性,适用于数据量不断增长的商城业务。
- 强大的查询功能:提供了丰富的查询语法和灵活的查询组合方式,能够实现复杂的搜索逻辑,如模糊搜索、多条件筛选、短语匹配、高亮显示等,满足用户多样化的搜索需求。
- 实时搜索:Elasticsearch 能够近乎实时地更新索引,保证搜索结果的及时性。当商品数据发生变化时,能够快速反映在搜索结果中,提升用户体验。
相关文章:
【商城实战(11)】解锁商品搜索与筛选功能,提升用户购物体验
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Android AudioFlinger(五)—— 揭开AudioMixer面纱
前言: 在 Android 音频系统中,AudioMixer 是音频框架中一个关键的组件,用于处理多路音频流的混音操作。它主要存在于音频回放路径中,是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候,提到了一个函数pr…...
HTML-05NPM使用踩坑
2025-03-04-NPM使用踩坑 本文讲述了一个苦逼程序员在使用NPM的时候突然来了一记nmp login天雷,然后一番折腾之后,终究还是没有解决npm的问题😞😞😞,最终使用cnpm完美解决的故事。 文章目录 2025-03-04-NPM使用踩坑[toc…...
并发编程——累加器
目录 1 AtomicLong 1.1 核心功能 1.2 实现原理: (1)基于 Unsafe 的底层操作 (2) volatile字段的内存可见性 (3)CAS 操作与 ABA 问题 1.3 性能分析 1.4 使用场景 2 LongAdder 核心设计原理 1 分段存储 2 分散更新策略 3.处理高竞…...
LeetCode - 28 找出字符串中第一个匹配项的下标
题目来源 28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode) 题目解析 暴力解法 本题如果采用暴力解法的话,可以定义两个指针 i,j,其中 i 指针用于扫描 S(haystack)串,j 指针…...
人机交互革命:从触屏到脑波的13维战争
人机交互革命:从触屏到脑波的13维战争 一、交互维度大爆炸:重新定义人机沟通边界 当ChatGPT开始解析你的微表情,当Neuralink芯片能读取皮层信号,人机交互已突破【键鼠】的次元壁。我们正经历人类史上最大规模的感官革命ÿ…...
如何查看Elastic-Job在Zookeeper中的注册信息
目录 使用zkCli.sh脚本 1. 连接ZooKeeper 2. 查看根目录 3. 查看具体作业的注册信息 4. 退出ZooKeeper客户端 使用ZooInspector工具 1.下载并安装ZooInspector: 2.连接到Zookeeper服务器: 3.浏览服务节点: 4.查看服务实例数据: 注…...
【数据库系统概论】事务
一、事务的定义 1.定义: 事务是数据库管理系统中的一个逻辑工作单元,它由一组操作组成,这些操作是数据库的增删查改的这种一些类的操作,这些操作要么全部成功,要么全部失败。逻辑工作单元是指在数据库中执行的一组操…...
FPGA 配置原理
用户编程控制的FPGA 是通过加载比特位流配置内部的存储单元实现的。该存储单元就是所谓的配置单元,它必须在器件上电后进行配置,从而设置查找表(LUT)的属性、连线方式、IOB 电压标准和其它的用户设计。 1.配置帧 以Xilinx 公司的…...
《DeepSeek MoE架构下,动态专家路由优化全解析》
在人工智能飞速发展的当下,模型架构的创新与优化始终是推动技术进步的关键力量。DeepSeek的混合专家模型(MoE)架构,以其独特的设计理念和卓越的性能表现,在大模型领域崭露头角。而其中的动态专家路由优化技术ÿ…...
ORA-01861一次奇怪的字符串格式匹配问题
客户的一个生产库服务器挂了,还好有容灾数据库,在把生产库切换到容灾库后,大部分的业务都恢复了,但是有一个上传数据的应用报错: ORA-01861:文字与格式字符串不匹配 这个报错呢以前遇到过好几次,基本都是date类型和字符串类型匹配的问题, 一般就是字段需要date类型的数据,但是…...
基于Spring Boot的校园失物招领系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
nlp进阶
1 Rnn RNN(Recurrent Neural Network),中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构段计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出. 单层网络结构 在循环 rnn处理的过程 rnn类别 n - n n - 1 使用sigmoid 或者softmax处理 应用在分类中…...
不同类型光谱相机的技术差异比较
一、波段数量与连续性 多光谱相机 波段数:通常4-9个离散波段,光谱范围集中于400-1000nm。 数据特征:光谱呈阶梯状,无法连续覆盖,适用于中等精度需求场景(如植被分类)。 高光谱相机…...
【Bert系列模型】
目录 一、BERT模型介绍 1.1 BERT简介 1.2 BERT的架构 1.2.1 Embedding模块 1.2.2 双向Transformer模块 1.2.3 预微调模块 1.3 BERT的预训练任务 1.3.1 Masked Language Model (MLM) 1.3.2 Next Sentence Prediction (NSP) 1.4 预训练与微调的关系 1.5 小结 二、BERT…...
Oxidized收集H3C交换机网络配置报错,not matching configured prompt (?-mix:^(<CD>)$)
背景:问题如上标题,H3C所有交换机配置的model都是comware 解决方案: 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…...
LeetCode 哈希章节
简单 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...
基于Ollama安装deepseek-r1模型搭建本地知识库(Dify、MaxKb、Open-WebUi、AnythingLLM、RAGFlow、FastGPT)
大模型 安装Ollama使用win系统安装使用sh脚本安装使用docker安装 下载大模型搭建WebUI工具和本地知识库Docker安装Dify配置本地知识库 Docker安装MaxKb配置本地知识库 Docker安装Open-WebUi配置本地知识库 Docker安装AnythingLLM配置本地知识库 Docker安装RAGFlow配置本地知识库…...
学习前置知识第二十天
学习前置知识第二十天 今天要做什么? 1:二进制 2:进制转换关系 3:二进制反汇编 4:常见字符编码 5:什么是编码和解码 6:编码表 一:二进制概述 为什么计算机只能读懂二进制?原因是因为计算机是需要电的,电路设计只…...
面试准备——云相册项目(1)基础
项目概述 云相册项目旨在为用户提供便捷的照片存储、管理和访问服务。通过客户端与服务器的配合,实现照片的上传、下载以及一些基本的命令交互功能,方便用户在不同设备上随时查看和管理自己的相册。 技术要点 编程语言与环境:使用 C 语言开…...
c语言程序设计--数组里面考察最多的一个知识点-考研冲刺复试面试问答题。
数组 关于数组的知识脑海里面先有一个大概,知道定义和存储方式 目录 数组 1、数组是什么? 2、strlen和sizeof的区别是什么? 3、数组名是什么? 1、数组是什么? 定义:数组是一组相同类型元素的集合。数…...
Json工具(一)- Jackson(续)
5、Jackson常用注解 JsonProperty 自定义属性在序列化和反序列化过程中所对应的JSON字段的名称,还可以指定是否序列化和反序列化。属性如下: value:设置属性的名称。一般当JSON串中的key与对象中的属性名称不一致,比如分别采用了下划线命名与…...
MySQL-事务
事务 事务,一般指的是数据库事务,事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 事务具有四个特性,即我们常说的ACID特性: 原子性 指事务是一个不可分割的工作单位,事务中的操作…...
课题推荐——无人机在UWB环境下基于TOA/TDOA/AOA的室内定位与精度对比
随着无人机在工业检测、仓储物流、应急救援等室内场景的广泛应用,高精度室内定位技术成为关键支撑。超宽带(UWB)技术凭借其高时间分辨率、强抗多径能力等优势,成为室内定位的主流方案。然而,不同的定位方法(…...
Qt6.8.2创建WebAssmebly项目使用FFmpeg资源
Qt6新出了WebAssmebly功能,可以将C写的软件到浏览器中运行,最近一段时间正在研究这方便内容,普通的控件响应都能实现,今天主要为大家分享如何将FFmpeg中的功能应用到浏览器中。 开发环境:window11,Qt6.8.2…...
【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比
1. 开发方式 1.1 传统 CSS 手写 CSS:你需要手动编写 CSS 规则,定义类名、ID 或元素选择器,并为每个元素编写样式。 分离式开发:HTML 和 CSS 通常是分离的,HTML 中通过类名或 ID 引用 CSS 文件中的样式。 示例&#…...
Server-Sent Events
Server-Sent Events (SSE) 是一种允许服务器向客户端推送实时更新的技术。 1. 创建 SSE 连接 export default {data() {return {eventSource: null,};},onLoad() {this.initSSE();},methods: {initSSE() {// 创建 SSE 连接this.eventSource new EventSource(https://api/xxxx…...
(十 九)趣学设计模式 之 中介者模式!
目录 一、 啥是中介者模式?二、 为什么要用中介者模式?三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
k8s概念及k8s集群部署(Centos7)
Centos7部署k8s集群 部署之前,先简单说下k8s是个啥: 一、k8s简介: k8s,全称:kubernetes,它可以看作是一个分布式系统支撑平台。k8s的作用: 1、故障自愈: k8s这个玩意可以监控容器…...
山东省网络安全技能大赛历年真题 山东网络安全创意大赛
刚参加完比赛,总结一波。 第一题:签到题 下载完成之后发现是个.exe文件 杂项万年套路步骤,用winhex打开,搜索flag,找到,提交。。。 第二题:qiu咪 发现是一张flag.png。。万年套路 用winhex打开。啥也没发现…...
数字后端培训实战项目六大典型后端实现案例
Q1:请教一个问题,cts.sdc和func.sdc在innovus用如何切换?在flow哪一步切换输入cts.sdc?哪一步切换到func.sdc,具体如何操作? 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的?针对时…...
Redis网络模型
redis为什么快 1.主要原因是因为redis是基于内存操作的,比起直接操作磁盘速度快好几倍 2.基于内存的数据库瓶颈主要是在网络io这一块,redis网络模型采用io多路复用技术能够高效的处理并发连接。 3.redis使用单线程执行命令,可以避免上下文…...
RangeError: Radix must be an integer between 2 and 36
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
题海拾贝:P9241 [蓝桥杯 2023 省 B] 飞机降落
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞,关注! 1、题…...
机器学习数学基础:38.统计学模型变量
统计学模型变量类型详解教程 一、外生变量(Exogenous Variable) (一)定义与别名 外生变量是模型中不受其他变量影响的独立变量,通常充当自变量。其常见的别名有: 外部变量(External Variabl…...
FPGA标准库-Open Logic
在现代技术发展的浪潮中,开源项目已经成为了推动技术创新和发展的核心力量。无论是人工智能、区块链、云计算,还是传统的嵌入式开发、操作系统,开源项目都在其中扮演着至关重要的角色。它们不仅促进了技术的快速迭代,也为全球开发…...
Git 批量合并 Commit 并且保留之前的 Commit 快速实现的思路
文章目录 需求Rebase / Pick / squashVim 的快速全局字符串替换 需求 我想把如下的提交 commit,变成一个 Commit,并且合并这些 Commit 的消息到一个节点 Rebase / Pick / squash 我合并到 5e59217 这个hash 上,这样合并后会保留两个 Commit…...
Jackson 详解
目录 前言 Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介…...
03 HarmonyOS Next仪表盘案例详解(二):进阶篇
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…...
【QT】-易错点笔记-2025-2-7
1,QList<phy_simulator*> pList;为空不能append()追加,要先new,再用 QList<phy_simulator> pList为空时,确实不能调用 append() 方法。原因很简单,QList 是一个类对象,在 C++ 中,指针本身并不代表它指向的对象。因此,当你有一个指向 QList<phy_simulato…...
嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)
目录 一、根文件系统的原理与重要性 二、根文件系统的构成 2.1. 基本目录结构 2.2. 核心组件 2.3. 设备驱动 2.4. 网络工具和协议 2.5. 调试工具 三、根文件系统的制作方法 四、根文件系统的测试 五、构建根文件系统的关键技术 5.1. 最小化构建工具 5.2. 关键配置文…...
electron + vue3 + vite 主进程到渲染进程的单向通信
用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目:https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程(单向) 以Electron官方文档给出的”主进程主动触发动作,发送内容给渲…...
基于Python实现的智能旅游推荐系统(Django)
基于Python实现的智能旅游推荐系统(Django) 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat 系统功能实现 总体设计 系统实现 系统首页模块 统首页页面主要包括首页,旅游资讯,景点信息…...
分布式存储—— HBase数据模型 详解
目录 1.3 HBase数据模型 1.3.1 两类数据模型 1.3.2 数据模型的重要概念 1.3.3 数据模型的操作 1.3.4 数据模型的特殊属性 1.3.5 CAP原理与最终一致性 1.3.6 小结 本文章参考、总结于学校教材课本《HBase开发与应用》 1.3 HBase数据模型 在开始学习HBase之前非常…...
使用AI整理知识点--WPF动画核心知识
一、WPF动画基础 1、动画本质 通过随时间改变依赖属性值实现视觉效果(如位置、透明度、颜色等)。 依赖属性必须支持 DependencyProperty,且需是可动画的(如 Double, Color, Point 等)。 2、动画三要素 起始值 (Fr…...
计算光学成像与光学计算概论
计算光学成像所涉及研究的内容非常广泛,虽然计算光学成像的研究内容是发散的,但目的都是一致的:如何让相机记录到客观实物更丰富的信息,延伸并扩展人眼的视觉感知。总的来说,计算光学成像现阶段已经取得了很多令人振奋…...
100天精通Python(爬虫篇)——第115天:爬虫在线小工具_Curl转python爬虫代码工具(快速构建初始爬虫代码)
文章目录 一、curl是什么?二、爬虫在线小工具(牛逼puls)三、实战操作 一、curl是什么? 基本概念:curl 支持多种协议,如 HTTP、HTTPS、FTP、SFTP 等,可用于从服务器获取数据或向服务器发送数据&a…...
点云软件VeloView开发环境搭建与编译
官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…...
PHP配置虚拟主机
虚拟主机: 不是真实存在的主机, 因为一台电脑理论上讲只能作为一个网站: 事实上,一个网站是一个文件夹. 在本地开发中,通过虚拟主机配置可以实现多域名独立访问不同项目目录(如 www.project1.test 和 www.project2.test),以 ”XAM…...
笔记四:C语言中的文件和文件操作
Faye:只要有正确的伴奏,什么都能变成好旋律。 ---------《寻找天堂》 目录 一、文件介绍 1.1程序文件 1.2 数据文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2.文件的打开和关闭 2.3 文件读取结束的判定 三、 文件的顺序读写 3.1 顺序读写…...