From 90aa401059e883a883f4e8109d76872d86f9f596 Mon Sep 17 00:00:00 2001
From: imeepos
Date: Thu, 24 Jul 2025 16:45:57 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=9B=B8=E4=BC=BC?=
=?UTF-8?q?=E5=BA=A6=E6=A3=80=E7=B4=A2=E5=B7=A5=E5=85=B7=E4=BA=8B=E4=BB=B6?=
=?UTF-8?q?=E5=86=92=E6=B3=A1=E9=97=AE=E9=A2=98=E5=92=8CRust=E7=BC=96?=
=?UTF-8?q?=E8=AF=91=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 修复SimilaritySearchCard中外部链接按钮点击时触发卡片选择的事件冒泡问题
- 增强外部链接按钮事件处理,添加preventDefault和stopPropagation
- 改进卡片点击事件处理,检查点击目标避免按钮触发卡片选择
- 修复outfit_search_commands.rs中的lifetime错误,重构描述字段解析逻辑
- 移除相关性阈值过滤逻辑,返回所有搜索结果
- 优化相似度检索工具UI布局和详情模态框功能
- 添加详细的搜索结果展示和外部链接处理功能
---
.../commands/outfit_search_commands.rs | 34 +--
.../similarity/SimilaritySearchCard.tsx | 18 +-
.../similarity/SimilaritySearchResults.tsx | 11 +-
.../src/pages/tools/SimilaritySearchTool.tsx | 214 ++++++++++++++----
apps/desktop/src/types/similaritySearch.ts | 2 +
5 files changed, 213 insertions(+), 66 deletions(-)
diff --git a/apps/desktop/src-tauri/src/presentation/commands/outfit_search_commands.rs b/apps/desktop/src-tauri/src/presentation/commands/outfit_search_commands.rs
index 8fb2025..4da2916 100644
--- a/apps/desktop/src-tauri/src/presentation/commands/outfit_search_commands.rs
+++ b/apps/desktop/src-tauri/src/presentation/commands/outfit_search_commands.rs
@@ -594,14 +594,7 @@ fn convert_vertex_response_to_search_results(
// 应用相关性阈值过滤
let threshold = request.config.relevance_threshold.to_value();
- if search_result.relevance_score >= threshold {
- results.push(search_result);
- } else {
- eprintln!(
- "结果被过滤: 评分 {:.2} < 阈值 {:.2}",
- search_result.relevance_score, threshold
- );
- }
+ results.push(search_result);
} else {
eprintln!("解析搜索结果失败");
}
@@ -752,11 +745,26 @@ fn parse_vertex_product_info(value: &serde_json::Value) -> Result = styles_array.iter()
+ .filter_map(|v| v.as_str())
+ .map(|s| s.to_string())
+ .collect();
+ if !styles.is_empty() {
+ styles.join("、")
+ } else {
+ "时尚单品".to_string()
+ }
+ } else {
+ "时尚单品".to_string()
+ }
+ } else {
+ "时尚单品".to_string()
+ };
let color_pattern = value
.get("color_pattern")
diff --git a/apps/desktop/src/components/similarity/SimilaritySearchCard.tsx b/apps/desktop/src/components/similarity/SimilaritySearchCard.tsx
index 1e418d8..29c13d8 100644
--- a/apps/desktop/src/components/similarity/SimilaritySearchCard.tsx
+++ b/apps/desktop/src/components/similarity/SimilaritySearchCard.tsx
@@ -15,6 +15,7 @@ import SimilaritySearchService from '../../services/similaritySearchService';
export const SimilaritySearchCard: React.FC = ({
result,
onSelect,
+ onExternalLinkClick,
showScore = true,
compact = false,
}) => {
@@ -22,7 +23,13 @@ export const SimilaritySearchCard: React.FC = ({
const [imageError, setImageError] = useState(false);
// 处理卡片点击
- const handleCardClick = useCallback(() => {
+ const handleCardClick = useCallback((e: React.MouseEvent) => {
+ // 如果点击的是按钮或其子元素,不触发卡片选择
+ const target = e.target as HTMLElement;
+ if (target.closest('button')) {
+ return;
+ }
+
if (onSelect) {
onSelect(result);
}
@@ -30,11 +37,16 @@ export const SimilaritySearchCard: React.FC = ({
// 处理外部链接点击
const handleExternalClick = useCallback((e: React.MouseEvent) => {
+ e.preventDefault();
e.stopPropagation();
if (result.image_url) {
- window.open(result.image_url, '_blank', 'noopener,noreferrer');
+ if (onExternalLinkClick) {
+ onExternalLinkClick(result.image_url);
+ } else {
+ window.open(result.image_url, '_blank', 'noopener,noreferrer');
+ }
}
- }, [result.image_url]);
+ }, [result.image_url, onExternalLinkClick]);
// 处理图片加载
const handleImageLoad = useCallback(() => {
diff --git a/apps/desktop/src/components/similarity/SimilaritySearchResults.tsx b/apps/desktop/src/components/similarity/SimilaritySearchResults.tsx
index d7e9b8d..6cda394 100644
--- a/apps/desktop/src/components/similarity/SimilaritySearchResults.tsx
+++ b/apps/desktop/src/components/similarity/SimilaritySearchResults.tsx
@@ -26,6 +26,7 @@ export const SimilaritySearchResults: React.FC = (
onPageChange,
onPageSizeChange,
onResultSelect,
+ onExternalLinkClick,
}) => {
// 计算分页信息
const totalPages = SimilaritySearchService.getTotalPages(totalResults, maxResultsPerPage);
@@ -164,21 +165,17 @@ export const SimilaritySearchResults: React.FC = (
-
-
-
- 按相关性排序
-
{/* 结果网格 */}
-
+
{results.map((result, index) => (
@@ -197,7 +194,7 @@ export const SimilaritySearchResults: React.FC
= (
{onPageSizeChange && (
-
每页显示:
+
每页