From e25ca3d1d3ca856aed71c34beb473b18b471c4a8 Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 10:10:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=90=9C=E7=B4=A2=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0-=E4=BB=8E=E5=89=8D=E7=AB=AF=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=90=8E=E7=AB=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/controller/AgentController.java | 11 +++++ .../modules/agent/service/AgentService.java | 10 +++++ .../agent/service/impl/AgentServiceImpl.java | 39 ++++++++++++++++++ .../modules/device/service/DeviceService.java | 9 ++++ .../service/impl/DeviceServiceImpl.java | 8 ++++ main/manager-web/src/apis/module/agent.js | 20 +++++++++ main/manager-web/src/components/HeaderBar.vue | 14 +------ main/manager-web/src/views/home.vue | 41 +++++++++---------- 8 files changed, 118 insertions(+), 34 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java index 0052c7cc..4eb53a65 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java @@ -271,4 +271,15 @@ public class AgentController { .body(audioData); } + @GetMapping("/search") + @Operation(summary = "搜索智能体") + @RequiresPermissions("sys:role:normal") + public Result> searchAgent( + @RequestParam("keyword") String keyword, + @RequestParam(value = "searchType", defaultValue = "name") String searchType) { + UserDetail user = SecurityUser.getUser(); + List agents = agentService.searchAgent(keyword, searchType, user.getId()); + return new Result>().ok(agents); + } + } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java index a9d4e5bb..6db9caaa 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java @@ -98,4 +98,14 @@ public interface AgentService extends BaseService { * @return 创建的智能体ID */ String createAgent(AgentCreateDTO dto); + + /** + * 搜索智能体 + * + * @param keyword 搜索关键词 + * @param searchType 搜索类型:name(按名称搜索)或mac(按MAC地址搜索) + * @param userId 用户ID + * @return 智能体列表 + */ + List searchAgent(String keyword, String searchType, Long userId); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index 65e842fd..04c902a0 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -478,4 +478,43 @@ public class AgentServiceImpl extends BaseServiceImpl imp agentPluginMappingService.saveBatch(toInsert); return entity.getId(); } + + @Override + public List searchAgent(String keyword, String searchType, Long userId) { + if (StringUtils.isBlank(keyword)) { + return new ArrayList<>(); + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + + if ("mac".equals(searchType)) { + // 按MAC地址搜索:先搜索设备,再获取对应的智能体 + List devices = deviceService.searchDevicesByMacAddress(keyword, userId); + + if (devices.isEmpty()) { + return new ArrayList<>(); + } + + // 获取设备对应的智能体ID列表 + List agentIds = devices.stream() + .map(DeviceEntity::getAgentId) + .distinct() + .collect(Collectors.toList()); + + if (agentIds.isEmpty()) { + return new ArrayList<>(); + } + + // 查询智能体 + queryWrapper.in("id", agentIds); + } else { + // 按名称搜索 + queryWrapper.like("agent_name", keyword); + } + + // 执行查询 + List agentEntities = baseDao.selectList(queryWrapper); + return ConvertUtils.sourceToTarget(agentEntities, AgentDTO.class); + } } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java index 5b56161f..f4debba9 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java @@ -108,4 +108,13 @@ public interface DeviceService extends BaseService { */ String generateWebSocketToken(String clientId, String username) throws Exception; + /** + * 根据MAC地址搜索设备 + * + * @param macAddress MAC地址关键词 + * @param userId 用户ID + * @return 设备列表 + */ + List searchDevicesByMacAddress(String macAddress, Long userId); + } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java index 5c807645..ea0d20eb 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java @@ -496,6 +496,14 @@ public class DeviceServiceImpl extends BaseServiceImpl redisUtils.delete(RedisKeys.getAgentDeviceCountById(dto.getAgentId())); } + @Override + public List searchDevicesByMacAddress(String macAddress, Long userId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("mac_address", macAddress); + wrapper.eq("user_id", userId); + return deviceDao.selectList(wrapper); + } + /** * 生成MQTT密码签名 * diff --git a/main/manager-web/src/apis/module/agent.js b/main/manager-web/src/apis/module/agent.js index 4a76514c..e10d9c77 100644 --- a/main/manager-web/src/apis/module/agent.js +++ b/main/manager-web/src/apis/module/agent.js @@ -382,4 +382,24 @@ export default { }); }).send(); }, + + // 搜索智能体 + searchAgent(keyword, searchType, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/agent/search`) + .method('GET') + .data({ + keyword: keyword, + searchType: searchType // searchType: 'name' 或 'mac' + }) + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail(() => { + RequestService.reAjaxFun(() => { + this.searchAgent(keyword, searchType, callback); + }); + }).send(); + }, } diff --git a/main/manager-web/src/components/HeaderBar.vue b/main/manager-web/src/components/HeaderBar.vue index add7e221..c661f6fc 100644 --- a/main/manager-web/src/components/HeaderBar.vue +++ b/main/manager-web/src/components/HeaderBar.vue @@ -408,18 +408,8 @@ export default { // 保存搜索历史 this.saveSearchHistory(searchValue); - try { - // 创建不区分大小写的正则表达式 - const regex = new RegExp(searchValue, "i"); - // 触发搜索事件,将正则表达式传递给父组件 - this.$emit("search", regex); - } catch (error) { - console.error("正则表达式创建失败:", error); - this.$message.error({ - message: this.$t("message.error"), - showClose: true, - }); - } + // 触发搜索事件,将搜索关键词传递给父组件 + this.$emit("search", searchValue); // 搜索完成后让输入框失去焦点,从而触发blur事件隐藏搜索历史 if (this.$refs.searchInput) { diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index d88a44ac..e4e8db46 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -119,34 +119,31 @@ export default { handleDeviceManage() { this.$router.push('/device-management'); }, - handleSearch(regex) { + handleSearch(keyword) { this.isSearching = true; - this.searchRegex = regex; - this.applySearchFilter(); + this.isLoading = true; + // 检测MAC地址格式:包含4个冒号 + const isMac = /(:.*?){4}/.test(keyword); + const searchType = isMac ? 'mac' : 'name'; + Api.agent.searchAgent(keyword, searchType, ({ data }) => { + if (data?.data) { + this.devices = data.data.map(item => ({ + ...item, + agentId: item.id + })); + } + this.isLoading = false; + }, (error) => { + console.error('搜索智能体失败:', error); + this.isLoading = false; + this.$message.error(this.$t('message.searchFailed')); + }); }, handleSearchReset() { this.isSearching = false; - this.searchRegex = null; - this.devices = [...this.originalDevices]; + this.fetchAgentList(); }, - applySearchFilter() { - if (!this.isSearching || !this.searchRegex) { - this.devices = [...this.originalDevices]; - return; - } - this.devices = this.originalDevices.filter(device => { - // 搜索智能体名称 - if (this.searchRegex.test(device.agentName)) { - return true; - } - // 搜索关联设备的MAC地址 - if (device.macAddresses && device.macAddresses.length > 0) { - return device.macAddresses.some(macAddress => this.searchRegex.test(macAddress)); - } - return false; - }); - }, // 搜索更新智能体列表 handleSearchResult(filteredList) { this.devices = filteredList; // 更新设备列表