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 && (
- 每页显示: + 每页