diff --git a/apps/jingrow/frontend/src/views/dev/AgentMarketplace.vue b/apps/jingrow/frontend/src/views/dev/AgentMarketplace.vue index 94f378d..4160859 100644 --- a/apps/jingrow/frontend/src/views/dev/AgentMarketplace.vue +++ b/apps/jingrow/frontend/src/views/dev/AgentMarketplace.vue @@ -388,8 +388,8 @@ onMounted(() => { }) }) -// 监听搜索和排序变化 -watch([searchQuery, sortBy], () => { +// 只监听排序变化,搜索需要手动触发(按Enter或点击搜索按钮) +watch([sortBy], () => { page.value = 1 // 重置到第一页 loadAgents() }, { deep: true }) diff --git a/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue b/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue index 2ba3f2f..76d4b02 100644 --- a/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue +++ b/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue @@ -417,8 +417,8 @@ onMounted(() => { }) }) -// 监听搜索和排序变化 -watch([searchQuery, sortBy], () => { +// 只监听排序变化,搜索需要手动触发(按Enter或点击搜索按钮) +watch([sortBy], () => { page.value = 1 // 重置到第一页 loadApps() }, { deep: true }) diff --git a/apps/jingrow/frontend/src/views/dev/NodeMarketplace.vue b/apps/jingrow/frontend/src/views/dev/NodeMarketplace.vue index 62801b4..203f3c1 100644 --- a/apps/jingrow/frontend/src/views/dev/NodeMarketplace.vue +++ b/apps/jingrow/frontend/src/views/dev/NodeMarketplace.vue @@ -400,8 +400,8 @@ onMounted(() => { }) }) -// 监听搜索和排序变化 -watch([searchQuery, sortBy], () => { +// 只监听排序变化,搜索需要手动触发(按Enter或点击搜索按钮) +watch([sortBy], () => { page.value = 1 // 重置到第一页 loadNodes() }, { deep: true }) diff --git a/apps/jingrow/frontend/src/views/dev/ToolMarketplace.vue b/apps/jingrow/frontend/src/views/dev/ToolMarketplace.vue index 027d923..0fdc1b6 100644 --- a/apps/jingrow/frontend/src/views/dev/ToolMarketplace.vue +++ b/apps/jingrow/frontend/src/views/dev/ToolMarketplace.vue @@ -419,8 +419,8 @@ onMounted(() => { }) }) -// 监听搜索和排序变化 -watch([searchQuery, sortBy], () => { +// 只监听排序变化,搜索需要手动触发(按Enter或点击搜索按钮) +watch([sortBy], () => { page.value = 1 // 重置到第一页 loadTools() }, { deep: true }) diff --git a/apps/jingrow/jingrow/api/local_app_installer.py b/apps/jingrow/jingrow/api/local_app_installer.py index 029ef79..82872bc 100644 --- a/apps/jingrow/jingrow/api/local_app_installer.py +++ b/apps/jingrow/jingrow/api/local_app_installer.py @@ -918,55 +918,54 @@ async def get_app_marketplace( try: url = f"{get_jingrow_cloud_url()}/api/action/jcloud.api.jlocal.get_local_app_list" - # 构建过滤条件 filters = {"public": 1} - if search: - filters["title"] = ["like", f"%{search}%"] - # 1. 先获取总数(不分页) + # 1. 先获取所有数据(用于搜索过滤) total_params = { 'filters': json.dumps(filters, ensure_ascii=False), 'limit_start': 0, - 'limit_page_length': 0 # 不限制数量,获取所有数据来计算总数 + 'limit_page_length': 0 } headers = get_jingrow_cloud_api_headers() total_response = requests.get(url, params=total_params, headers=headers, timeout=20) - total_count = 0 + all_apps = [] if total_response.status_code == 200: total_data = total_response.json() - total_count = len(total_data.get('message', [])) + all_apps = total_data.get('message', []) - # 2. 获取分页数据 - params = { - 'filters': json.dumps(filters, ensure_ascii=False) - } + # 如果有搜索关键词,在Python中进行多字段过滤(OR逻辑) + if search: + search_lower = search.lower() + filtered_apps = [] + for app in all_apps: + if (search_lower in str(app.get('app_name', '')).lower() or + search_lower in str(app.get('title', '')).lower()): + filtered_apps.append(app) + all_apps = filtered_apps - # 排序参数 + total_count = len(all_apps) + + # 2. 排序 if sort_by: - params['order_by'] = sort_by + sort_field, sort_order = sort_by.rsplit(' ', 1) + reverse = sort_order.lower() == 'desc' + try: + all_apps.sort(key=lambda x: x.get(sort_field, ''), reverse=reverse) + except: + pass - # 分页参数 + # 3. 分页 limit_start = (page - 1) * page_size - params['limit_start'] = limit_start - params['limit_page_length'] = page_size + apps = all_apps[limit_start:limit_start + page_size] - response = requests.get(url, params=params, headers=headers, timeout=20) - - if response.status_code == 200: - data = response.json() - apps = data.get('message', []) - - # 返回分页格式的数据 - return { - "items": apps, - "total": total_count, - "page": page, - "page_size": page_size - } - else: - raise HTTPException(status_code=response.status_code, detail="获取应用市场数据失败") + return { + "items": apps, + "total": total_count, + "page": page, + "page_size": page_size + } except Exception as e: raise HTTPException(status_code=500, detail=f"获取应用市场数据失败: {str(e)}") diff --git a/apps/jingrow/jingrow/api/node_management.py b/apps/jingrow/jingrow/api/node_management.py index 96a9991..f5fc839 100644 --- a/apps/jingrow/jingrow/api/node_management.py +++ b/apps/jingrow/jingrow/api/node_management.py @@ -253,8 +253,9 @@ async def get_node_marketplace( # 构建过滤条件 filters = {"public": 1} if search: + # 注意:字典格式的filters是AND关系,所以先搜索title + # 如果需要在多个字段中搜索,需要在获取数据后进行过滤 filters["title"] = ["like", f"%{search}%"] - filters["node_type"] = ["like", f"%{search}%"] # 1. 先获取总数(不分页) total_params = { @@ -797,7 +798,8 @@ async def get_agent_marketplace( # 构建过滤条件 filters = {"public": 1} if search: - filters["agent_name"] = ["like", f"%{search}%"] + # 注意:字典格式的filters是AND关系,所以先搜索title + # 如果需要在多个字段中搜索,需要在获取数据后进行过滤 filters["title"] = ["like", f"%{search}%"] # 1. 先获取总数(不分页) diff --git a/apps/jingrow/jingrow/api/tools.py b/apps/jingrow/jingrow/api/tools.py index fc2a8ce..2e81994 100644 --- a/apps/jingrow/jingrow/api/tools.py +++ b/apps/jingrow/jingrow/api/tools.py @@ -54,12 +54,8 @@ async def get_tool_marketplace( # 构建过滤条件 filters = {"public": 1} - if search: - filters["name"] = ["like", f"%{search}%"] - filters["title"] = ["like", f"%{search}%"] - filters["description"] = ["like", f"%{search}%"] - # 1. 先获取总数(不分页) + # 1. 先获取所有数据(用于搜索过滤) total_params = { 'filters': json.dumps(filters, ensure_ascii=False), 'limit_start': 0, @@ -69,39 +65,44 @@ async def get_tool_marketplace( headers = get_jingrow_cloud_api_headers() total_response = requests.get(url, params=total_params, headers=headers, timeout=20) - total_count = 0 + all_tools = [] if total_response.status_code == 200: total_data = total_response.json() - total_count = len(total_data.get('message', [])) + all_tools = total_data.get('message', []) - # 2. 获取分页数据 - params = { - 'filters': json.dumps(filters, ensure_ascii=False) - } + # 如果有搜索关键词,在Python中进行多字段过滤(OR逻辑) + if search: + search_lower = search.lower() + filtered_tools = [] + for tool in all_tools: + if (search_lower in str(tool.get('name', '')).lower() or + search_lower in str(tool.get('tool_name', '')).lower() or + search_lower in str(tool.get('title', '')).lower() or + search_lower in str(tool.get('description', '')).lower()): + filtered_tools.append(tool) + all_tools = filtered_tools - # 排序参数 + total_count = len(all_tools) + + # 2. 排序 if sort_by: - params['order_by'] = sort_by + sort_field, sort_order = sort_by.rsplit(' ', 1) + reverse = sort_order.lower() == 'desc' + try: + all_tools.sort(key=lambda x: x.get(sort_field, ''), reverse=reverse) + except: + pass - # 分页参数 + # 3. 分页 limit_start = (page - 1) * page_size - params['limit_start'] = limit_start - params['limit_page_length'] = page_size + tools = all_tools[limit_start:limit_start + page_size] - response = requests.get(url, params=params, headers=headers, timeout=20) - - if response.status_code == 200: - data = response.json() - tools = data.get('message', []) - - return { - "items": tools, - "total": total_count, - "page": page, - "page_size": page_size - } - else: - raise HTTPException(status_code=response.status_code, detail="获取工具市场数据失败") + return { + "items": tools, + "total": total_count, + "page": page, + "page_size": page_size + } except Exception as e: logger.error(f"获取工具市场数据失败: {e}", exc_info=True)