From d10ba456d70e0a7c5970c80f79906b79d9ec571e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=91=E9=9B=A8?= <2375294554@qq.com> Date: Mon, 31 Mar 2025 15:26:46 +0800 Subject: [PATCH 01/66] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E5=88=A0=E9=99=A4=E7=94=A8=E6=88=B7=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E7=BC=BA=E5=B0=91=E5=AF=B9=E8=AF=9D=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20--AdminController.java=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=B0=83=E7=94=A8=E7=9A=84=E6=96=B9=E6=B3=95=E5=90=8D?= =?UTF-8?q?=E5=AD=97=20--AgentService.java=20=E6=B7=BB=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E7=94=A8=E6=88=B7id=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E4=BD=93=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=20--AgentServiceImpl.java=20=E5=AE=9E=E7=8E=B0=E4=BA=86?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=B9=E6=B3=95=20--DeviceService.java?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=8C=87=E5=AE=9A=E7=94=A8=E6=88=B7?= =?UTF-8?q?id=E8=AE=BE=E5=A4=87=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=20--DeviceServiceImpl.java=20=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=BA=86=E5=88=A0=E9=99=A4=E6=96=B9=E6=B3=95=20--SysU?= =?UTF-8?q?serService.java=20=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=9A=84=E6=96=B9=E6=B3=95=E5=90=8D=E5=AD=97=20--SysU?= =?UTF-8?q?serServiceImpl.java=20=E5=AE=8C=E6=88=90=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/agent/service/AgentService.java | 6 ++++++ .../agent/service/impl/AgentServiceImpl.java | 10 ++++++++++ .../modules/device/service/DeviceService.java | 8 +++++++- .../device/service/impl/DeviceServiceImpl.java | 8 ++++++++ .../modules/sys/controller/AdminController.java | 2 +- .../modules/sys/service/SysUserService.java | 6 +++++- .../sys/service/impl/SysUserServiceImpl.java | 17 +++++++++++++---- 7 files changed, 50 insertions(+), 7 deletions(-) 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 da958e4c..7d5285e8 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 @@ -22,4 +22,10 @@ public interface AgentService extends BaseService { * 获取智能体详情 */ AgentEntity getAgentById(String id); + + /** + * 删除这个用户的所有 + * @param userId + */ + void deleteAgentByUserId(String userId); } \ No newline at end of file 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 8e73c003..40579cee 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 @@ -4,16 +4,19 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.transaction.annotation.Transactional; import xiaozhi.common.page.PageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.modules.agent.dao.AgentDao; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.agent.service.AgentService; +import xiaozhi.modules.device.entity.DeviceEntity; @Service public class AgentServiceImpl extends BaseServiceImpl implements AgentService { @@ -62,4 +65,11 @@ public class AgentServiceImpl extends BaseServiceImpl imp return super.insert(entity); } + + @Override + public void deleteAgentByUserId(String userId) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("user_id", userId); + baseDao.delete(wrapper); + } } \ No newline at end of file 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 bc26f649..5f91bb2e 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 @@ -26,7 +26,7 @@ public interface DeviceService { DeviceEntity bindDevice(DeviceBindDTO deviceHeader); /** - * 获取用户设备列表 + * 获取用户指定智能体的设备列表, */ List getUserDevices(Long userId, String agentId); @@ -39,4 +39,10 @@ public interface DeviceService { * 设备激活 */ Boolean deviceActivation(String activationCode); + + /** + * 删除此用户的所有设备 + * @param userId 用户id + */ + void deleteByUserId(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 4fd63826..685536c6 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 @@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import cn.hutool.core.util.RandomUtil; +import org.springframework.transaction.annotation.Transactional; import xiaozhi.common.exception.RenException; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.user.UserDetail; @@ -197,6 +198,13 @@ public class DeviceServiceImpl extends BaseServiceImpl baseDao.delete(wrapper); } + @Override + public void deleteByUserId(Long userId) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("user_id", userId); + baseDao.delete(wrapper); + } + private DeviceReportRespDTO.ServerTime buildServerTime() { DeviceReportRespDTO.ServerTime serverTime = new DeviceReportRespDTO.ServerTime(); TimeZone tz = TimeZone.getDefault(); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java index ee551400..9e811237 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java @@ -70,7 +70,7 @@ public class AdminController { @Operation(summary = "用户删除") @RequiresPermissions("sys:role:superAdmin") public Result delete(@PathVariable Long id) { - sysUserService.delete(new Long[] { id }); + sysUserService.deleteById( id ); return new Result<>(); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java index 261fbf96..1b9ac9bc 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java @@ -19,7 +19,11 @@ public interface SysUserService extends BaseService { void save(SysUserDTO dto); - void delete(Long[] ids); + /** + * 删除指定用户,且有关联的数据设备和智能体 + * @param ids + */ + void deleteById(Long ids); /** * 验证是否允许修改密码更改 diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java index 71d507c6..f705e5fa 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java @@ -1,6 +1,5 @@ package xiaozhi.modules.sys.service.impl; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,6 +21,8 @@ import xiaozhi.common.exception.RenException; import xiaozhi.common.page.PageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.utils.ConvertUtils; +import xiaozhi.modules.agent.service.AgentService; +import xiaozhi.modules.device.service.DeviceService; import xiaozhi.modules.security.password.PasswordUtils; import xiaozhi.modules.sys.dao.SysUserDao; import xiaozhi.modules.sys.dto.AdminPageUserDTO; @@ -40,6 +41,10 @@ import xiaozhi.modules.sys.vo.AdminPageUserVO; public class SysUserServiceImpl extends BaseServiceImpl implements SysUserService { private final SysUserDao sysUserDao; + private final DeviceService deviceService; + + private final AgentService agentService; + @Override public SysUserDTO getByUsername(String username) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -87,10 +92,14 @@ public class SysUserServiceImpl extends BaseServiceImpl Date: Mon, 31 Mar 2025 16:30:56 +0800 Subject: [PATCH 02/66] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20--AdminPageUserDTO.java=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=9A=84dto=E7=9A=84=E8=AF=B4=E6=98=8E=20--AdminPageU?= =?UTF-8?q?serVO.java=20=E6=B7=BB=E5=8A=A0=E4=BA=86=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AE=B5=20--DeviceService.java=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=95=B0=E9=87=8F=E5=AE=9A=E4=B9=89=20--DeviceService?= =?UTF-8?q?Impl.java=20=E5=AE=9E=E7=8E=B0=E6=9F=A5=E8=AF=A2=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=AE=BE=E5=A4=87=E6=96=B9=E6=B3=95=20--SysUserServic?= =?UTF-8?q?eImpl.java=20=E5=AE=8C=E5=96=84=E5=88=86=E9=A1=B5=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=EF=BC=8C=E6=9F=A5=E8=AF=A2=E5=87=BA=E6=AF=8F=E4=B8=AA?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9A=84=E8=AE=BE=E5=A4=87=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E5=92=8C=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/xiaozhi/modules/device/service/DeviceService.java | 7 +++++++ .../modules/device/service/impl/DeviceServiceImpl.java | 7 +++++++ .../java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java | 2 +- .../modules/sys/service/impl/SysUserServiceImpl.java | 6 ++++-- .../main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java | 3 +++ 5 files changed, 22 insertions(+), 3 deletions(-) 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 5f91bb2e..a1574c8d 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 @@ -45,4 +45,11 @@ public interface DeviceService { * @param userId 用户id */ void deleteByUserId(Long userId); + + /** + * 获取指定用户的设备数量 + * @param userId 用户id + * @return 设备数量 + */ + Long selectCountByUserId(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 685536c6..38801ca7 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 @@ -205,6 +205,13 @@ public class DeviceServiceImpl extends BaseServiceImpl baseDao.delete(wrapper); } + @Override + public Long selectCountByUserId(Long userId) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("user_id", userId); + return baseDao.selectCount(wrapper); + } + private DeviceReportRespDTO.ServerTime buildServerTime() { DeviceReportRespDTO.ServerTime serverTime = new DeviceReportRespDTO.ServerTime(); TimeZone tz = TimeZone.getDefault(); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java index 7de3843a..4e158ca4 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java @@ -10,7 +10,7 @@ import lombok.Data; * @since 2025-3-21 */ @Data -@Schema(description = "音色分页参数") +@Schema(description = "管理员分页用户的参数DTO") public class AdminPageUserDTO { @Schema(description = "手机号码") diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java index f705e5fa..043144c4 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java @@ -161,12 +161,14 @@ public class SysUserServiceImpl extends BaseServiceImpl() // 必须按照手机号码查找 .eq(StringUtils.isNotBlank(dto.getMobile()), "username", dto.getMobile())); + // 循环处理page获取回来的数据,返回需要的字段 List list = page.getRecords().stream().map(user -> { AdminPageUserVO adminPageUserVO = new AdminPageUserVO(); adminPageUserVO.setUserid(user.getId().toString()); adminPageUserVO.setMobile(user.getUsername()); - // TODO 2. 等设备功能写好,获取对应数据 - adminPageUserVO.setDeviceCount("0"); + String deviceCount = deviceService.selectCountByUserId(user.getId()).toString(); + adminPageUserVO.setDeviceCount(deviceCount); + adminPageUserVO.setStatus(user.getStatus().toString()); return adminPageUserVO; }).toList(); return new PageData<>(list, page.getTotal()); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java index b7a399c2..7b845edf 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java @@ -20,4 +20,7 @@ public class AdminPageUserVO { @Schema(description = "用户id") private String userid; + + @Schema(description = "用户状态") + private String status; } From ee17d9416a321a2fdb0d1c9315c1e1ddaf50e32c Mon Sep 17 00:00:00 2001 From: funsugar <44894230+funsugar@users.noreply.github.com> Date: Tue, 1 Apr 2025 17:27:58 +0800 Subject: [PATCH 03/66] Update util.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复根据IP地址获取城市地址出错的问题 --- main/xiaozhi-server/core/utils/util.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/main/xiaozhi-server/core/utils/util.py b/main/xiaozhi-server/core/utils/util.py index b361bff3..764ce689 100644 --- a/main/xiaozhi-server/core/utils/util.py +++ b/main/xiaozhi-server/core/utils/util.py @@ -67,11 +67,13 @@ def is_private_ip(ip_addr): def get_ip_info(ip_addr): try: - url = "https://whois.pconline.com.cn/ipJson.jsp?json=true" + url = f"https://whois.pconline.com.cn/ipJson.jsp?json=true&ip={ip_addr}" resp = requests.get(url).json() ip_info = { - "city": resp.get("city") + "city": resp.get("city"), + "region": resp.get("region"), + "addr": resp.get("addr") } return ip_info except Exception as e: @@ -182,4 +184,4 @@ def extract_json_from_string(input_string): match = re.search(pattern, input_string) if match: return match.group(1) # 返回提取的 JSON 字符串 - return None \ No newline at end of file + return None From 132174568fe5263999d99d2e30b9c68e903ca0cb Mon Sep 17 00:00:00 2001 From: JoeyZhou Date: Tue, 1 Apr 2025 22:47:15 +0800 Subject: [PATCH 04/66] =?UTF-8?q?=E4=BC=98=E5=8C=96vad=EF=BC=8C=E9=87=87?= =?UTF-8?q?=E7=94=A8bytearray=E6=9B=BF=E6=8D=A2byte=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=8B=BC=E6=8E=A5=E6=95=88?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/core/connection.py | 4 ++-- main/xiaozhi-server/core/utils/vad.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/main/xiaozhi-server/core/connection.py b/main/xiaozhi-server/core/connection.py index 98cf5c5c..32819159 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -66,7 +66,7 @@ class ConnectionHandler: self.intent = _intent # vad相关变量 - self.client_audio_buffer = bytes() + self.client_audio_buffer = bytearray() self.client_have_voice = False self.client_have_voice_last_time = 0.0 self.client_no_voice_last_time = 0.0 @@ -616,7 +616,7 @@ class ConnectionHandler: # q.queue.put(None) def reset_vad_states(self): - self.client_audio_buffer = bytes() + self.client_audio_buffer = bytearray() self.client_have_voice = False self.client_have_voice_last_time = 0 self.client_voice_stop = False diff --git a/main/xiaozhi-server/core/utils/vad.py b/main/xiaozhi-server/core/utils/vad.py index ef782281..2079b354 100644 --- a/main/xiaozhi-server/core/utils/vad.py +++ b/main/xiaozhi-server/core/utils/vad.py @@ -31,7 +31,7 @@ class SileroVAD(VAD): def is_vad(self, conn, opus_packet): try: pcm_frame = self.decoder.decode(opus_packet, 960) - conn.client_audio_buffer += pcm_frame # 将新数据加入缓冲区 + conn.client_audio_buffer.extend(pcm_frame) # 将新数据加入缓冲区 # 处理缓冲区中的完整帧(每次处理512采样点) client_have_voice = False From 4c0d55d2e62188b4bec98e618aa772f7153c9aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=91=E9=9B=A8?= <2375294554@qq.com> Date: Wed, 2 Apr 2025 15:59:18 +0800 Subject: [PATCH 05/66] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=B1=82=E5=AE=8C=E5=96=84=E7=9A=84=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E8=AE=BE=E5=A4=87=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=20--AdminController.java=20=E5=AE=8C=E5=96=84=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=85=A8=E9=83=A8=E8=AE=BE=E5=A4=87=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=20--DateUtils.java=20=E7=BC=96=E5=86=99=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E8=BF=94=E5=9B=9E=E7=AE=80=E7=9F=AD=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E7=9A=84=E6=96=B9=E6=B3=95=EF=BC=8C=E5=A6=82?= =?UTF-8?q?=E5=88=9A=E5=88=9A=EF=BC=8C=E5=87=A0=E5=88=86=E9=92=9F=E5=89=8D?= =?UTF-8?q?=20--DevicePageUserDTO.java=20=E5=AE=9A=E4=B9=89=E4=BA=86?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E4=BB=80=E4=B9=88=E6=9F=A5=E6=89=BE=E5=8F=82?= =?UTF-8?q?=E6=95=B0=20--DeviceService.java=20=E5=AE=9A=E4=B9=89=E4=BA=86?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E6=96=B9=E6=B3=95=20--DeviceServiceImpl.java?= =?UTF-8?q?=20=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=88=86=E9=A1=B5=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=85=A8=E9=83=A8=E8=AE=BE=E5=A4=87=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20--ExtendPageData.java=20=E6=89=A9=E5=B1=95=E7=9A=84?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=AF=B9=E8=B1=A1=EF=BC=8C=E5=A4=9A=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E4=B8=80=E4=B8=AA=E9=A1=B5=E6=95=B0=20--UserShowDevic?= =?UTF-8?q?eListVO.java=20=E5=AE=9A=E4=B9=89=E4=BA=86=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E8=AE=BE=E5=A4=87=E6=AF=8F=E4=B8=AA=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E7=9A=84=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xiaozhi/common/page/ExtendPageData.java | 38 +++++++++++++++ .../java/xiaozhi/common/utils/DateUtils.java | 38 +++++++++++++++ .../modules/device/dto/DevicePageUserDTO.java | 24 ++++++++++ .../modules/device/service/DeviceService.java | 11 +++++ .../service/impl/DeviceServiceImpl.java | 46 +++++++++++++++++-- .../device/vo/UserShowDeviceListVO.java | 31 +++++++++++++ .../sys/controller/AdminController.java | 16 +++++-- 7 files changed, 197 insertions(+), 7 deletions(-) create mode 100644 main/manager-api/src/main/java/xiaozhi/common/page/ExtendPageData.java create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/device/vo/UserShowDeviceListVO.java diff --git a/main/manager-api/src/main/java/xiaozhi/common/page/ExtendPageData.java b/main/manager-api/src/main/java/xiaozhi/common/page/ExtendPageData.java new file mode 100644 index 00000000..a838baf5 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/common/page/ExtendPageData.java @@ -0,0 +1,38 @@ +package xiaozhi.common.page; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 扩展的分页对象 + * @author zjy + * @since 2025-4-2 + */ +@Data +@Schema(description = "分页数据") +public class ExtendPageData implements Serializable { + @Schema(description = "总记录数") + private int totalCount; + + @Schema(description = "页数") + private int totalPage; + + @Schema(description = "列表数据") + private List list; + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + * @param page 页数 + */ + public ExtendPageData(List list, long total, long page) { + this.list = list; + this.totalCount = (int) total; + this.totalPage = (int) page; + } +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/DateUtils.java b/main/manager-api/src/main/java/xiaozhi/common/utils/DateUtils.java index 9e5ef3e1..bfa7afed 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/utils/DateUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/DateUtils.java @@ -2,6 +2,9 @@ package xiaozhi.common.utils; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.Date; /** @@ -60,4 +63,39 @@ public class DateUtils { return null; } + /** + * 获取简短的时间字符串:10秒前返回刚刚,多少秒前,几小时前,超过一周返回年月日时分秒 + * @param date + * @return + */ + public static String getShortTime(Date date) { + if (date == null) { + return null; + } + // 将 Date 转换为 Instant + LocalDateTime localDateTime = date.toInstant() + // 获取系统默认时区 + .atZone(ZoneId.systemDefault()) + // 转换为 LocalDateTime + .toLocalDateTime(); + // 当前时间 + LocalDateTime now = LocalDateTime.now(); + // 时间差,单位为秒 + long secondsBetween = ChronoUnit.SECONDS.between(localDateTime, now); + + if (secondsBetween <= 10) { + return "刚刚"; + } else if (secondsBetween < 60) { + return secondsBetween + "秒前"; + } else if (secondsBetween < 60 * 60) { + return secondsBetween / 60 + "分钟前"; + } else if (secondsBetween < 86400) { + return secondsBetween / 3600 + "小时前"; + } else if (secondsBetween < 604800) { + return secondsBetween / 86400 + "天前"; + } else { + // 超过一周,显示完整日期时间 + return format(date,DATE_TIME_PATTERN); + } + } } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java new file mode 100644 index 00000000..40e67445 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java @@ -0,0 +1,24 @@ +package xiaozhi.modules.device.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 查询所有设备的DTO + * + * @author zjy + * @since 2025-3-21 + */ +@Data +@Schema(description = "查询所有设备的DTO") +public class DevicePageUserDTO { + + @Schema(description = "设备关键词") + private String keywords; + + @Schema(description = "页数") + private String page; + + @Schema(description = "显示列数") + private String limit; +} 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 a1574c8d..1d8b2970 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 @@ -2,10 +2,13 @@ package xiaozhi.modules.device.service; import java.util.List; +import xiaozhi.common.page.ExtendPageData; import xiaozhi.modules.device.dto.DeviceBindDTO; +import xiaozhi.modules.device.dto.DevicePageUserDTO; import xiaozhi.modules.device.dto.DeviceReportReqDTO; import xiaozhi.modules.device.dto.DeviceReportRespDTO; import xiaozhi.modules.device.entity.DeviceEntity; +import xiaozhi.modules.device.vo.UserShowDeviceListVO; public interface DeviceService { @@ -52,4 +55,12 @@ public interface DeviceService { * @return 设备数量 */ Long selectCountByUserId(Long userId); + + /** + * 分页获取全部设备信息 + * + * @param dto 分页查找参数 + * @return 用户列表分页数据 + */ + ExtendPageData page(DevicePageUserDTO dto); } \ 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 38801ca7..06b64d9e 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 @@ -8,6 +8,7 @@ import java.util.Map; import java.util.TimeZone; import java.util.concurrent.TimeUnit; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; @@ -18,33 +19,43 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import cn.hutool.core.util.RandomUtil; -import org.springframework.transaction.annotation.Transactional; +import xiaozhi.common.constant.Constant; import xiaozhi.common.exception.RenException; +import xiaozhi.common.page.ExtendPageData; +import xiaozhi.common.page.PageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.user.UserDetail; import xiaozhi.common.utils.ConvertUtils; +import xiaozhi.common.utils.DateUtils; import xiaozhi.modules.device.dao.DeviceDao; import xiaozhi.modules.device.dto.DeviceBindDTO; +import xiaozhi.modules.device.dto.DevicePageUserDTO; import xiaozhi.modules.device.dto.DeviceReportReqDTO; import xiaozhi.modules.device.dto.DeviceReportRespDTO; import xiaozhi.modules.device.entity.DeviceEntity; import xiaozhi.modules.device.service.DeviceService; +import xiaozhi.modules.device.vo.UserShowDeviceListVO; import xiaozhi.modules.security.user.SecurityUser; +import xiaozhi.modules.sys.service.SysUserService; @Service public class DeviceServiceImpl extends BaseServiceImpl implements DeviceService { private final DeviceDao deviceDao; + private final SysUserService sysUserService; + private final String frontedUrl; + private final RedisTemplate redisTemplate; // 添加构造函数来初始化 deviceMapper - public DeviceServiceImpl(DeviceDao deviceDao, - @Value("${app.fronted-url:http://localhost:8001}") String frontedUrl, - RedisTemplate redisTemplate) { + public DeviceServiceImpl(DeviceDao deviceDao, SysUserService sysUserService, + @Value("${app.fronted-url:http://localhost:8001}") String frontedUrl, + RedisTemplate redisTemplate) { this.deviceDao = deviceDao; + this.sysUserService = sysUserService; this.frontedUrl = frontedUrl; this.redisTemplate = redisTemplate; } @@ -212,6 +223,33 @@ public class DeviceServiceImpl extends BaseServiceImpl return baseDao.selectCount(wrapper); } + @Override + public ExtendPageData page(DevicePageUserDTO dto) { + Map params = new HashMap(); + params.put(Constant.PAGE, dto.getPage()); + params.put(Constant.LIMIT, dto.getLimit()); + IPage page = baseDao.selectPage( + getPage(params, "sort", true), + // 定义查询条件 + new QueryWrapper() + // 必须设备关键词查找 + .like(StringUtils.isNotBlank(dto.getKeywords()), "alias", dto.getKeywords())); + // 循环处理page获取回来的数据,返回需要的字段 + List list = page.getRecords().stream().map(device -> { + UserShowDeviceListVO vo = ConvertUtils.sourceToTarget(device, UserShowDeviceListVO.class); + // 把最后修改的时间,改为简短描述的时间 + vo.setRecentChatTime(DateUtils.getShortTime(device.getUpdateDate())); + // 获取用户名 + String username = sysUserService.getByUserId(device.getUserId()).getUsername(); + vo.setBindUserName(username); + vo.setDeviceType(device.getBoard()); + return vo; + }).toList(); + //计算页数 + long num = page.getTotal() / Long.parseLong(dto.getPage()); + return new ExtendPageData<>(list, page.getTotal(), num); + } + private DeviceReportRespDTO.ServerTime buildServerTime() { DeviceReportRespDTO.ServerTime serverTime = new DeviceReportRespDTO.ServerTime(); TimeZone tz = TimeZone.getDefault(); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/vo/UserShowDeviceListVO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/vo/UserShowDeviceListVO.java new file mode 100644 index 00000000..e3a5d8fd --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/vo/UserShowDeviceListVO.java @@ -0,0 +1,31 @@ +package xiaozhi.modules.device.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "用户显示设备列表VO") +public class UserShowDeviceListVO { + + @Schema(description = "app版本") + private String appVersion; + + @Schema(description = "绑定用户名称") + private String bindUserName; + + @Schema(description = "设备型号") + private String deviceType; + + @Schema(description = "设备唯一标识符") + private String id; + + @Schema(description = "mac地址") + private String macAddress; + + @Schema(description = "开启OTA") + private Integer otaUpgrade; + + @Schema(description = "最近对话时间") + private String recentChatTime; + +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java index 9e811237..5eb48fde 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java @@ -17,9 +17,13 @@ import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import xiaozhi.common.constant.Constant; +import xiaozhi.common.page.ExtendPageData; import xiaozhi.common.page.PageData; import xiaozhi.common.utils.Result; import xiaozhi.common.validator.ValidatorUtils; +import xiaozhi.modules.device.dto.DevicePageUserDTO; +import xiaozhi.modules.device.service.DeviceService; +import xiaozhi.modules.device.vo.UserShowDeviceListVO; import xiaozhi.modules.sys.dto.AdminPageUserDTO; import xiaozhi.modules.sys.service.SysUserService; import xiaozhi.modules.sys.vo.AdminPageUserVO; @@ -37,6 +41,8 @@ import xiaozhi.modules.sys.vo.AdminPageUserVO; public class AdminController { private final SysUserService sysUserService; + private final DeviceService deviceService; + @GetMapping("/users") @Operation(summary = "分页查找用户") @RequiresPermissions("sys:role:superAdmin") @@ -82,9 +88,13 @@ public class AdminController { @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true), @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true), }) - public Result pageDevice( + public Result> pageDevice( @Parameter(hidden = true) @RequestParam Map params) { - // TODO 等设备功能模块写好 - return new Result().error(600, "等设备功能模块写好"); + DevicePageUserDTO dto = new DevicePageUserDTO(); + dto.setKeywords((String) params.get("keywords")); + dto.setLimit((String) params.get(Constant.LIMIT)); + dto.setPage((String) params.get(Constant.PAGE)); + ExtendPageData page = deviceService.page(dto); + return new Result>().ok(page); } } From 2fb7281d078a71ef809abeada940f52d2392a619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=91=E9=9B=A8?= <2375294554@qq.com> Date: Wed, 2 Apr 2025 16:03:46 +0800 Subject: [PATCH 06/66] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=B1=82=E5=88=86=E9=A1=B5=E8=8E=B7=E5=8F=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=8E=A5=E5=8F=A3=E6=94=B9=E5=9B=9E=E4=BD=BF=E7=94=A8?= =?UTF-8?q?ExtendPageData=E3=80=82=E7=AC=A6=E5=90=88=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=9A=E4=B9=89=20--AdminController.java?= =?UTF-8?q?=20--SysUserService.java=20--SysUserServiceImpl.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xiaozhi/modules/sys/controller/AdminController.java | 6 +++--- .../java/xiaozhi/modules/sys/service/SysUserService.java | 4 ++-- .../modules/sys/service/impl/SysUserServiceImpl.java | 8 +++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java index 5eb48fde..917ae82d 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java @@ -51,7 +51,7 @@ public class AdminController { @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true), @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true), }) - public Result> pageUser( + public Result> pageUser( @Parameter(hidden = true) @RequestParam Map params) { AdminPageUserDTO dto = new AdminPageUserDTO(); dto.setMobile((String) params.get("mobile")); @@ -59,8 +59,8 @@ public class AdminController { dto.setPage((String) params.get("pages")); ValidatorUtils.validateEntity(dto); - PageData page = sysUserService.page(dto); - return new Result>().ok(page); + ExtendPageData page = sysUserService.page(dto); + return new Result>().ok(page); } @PutMapping("/users/{id}") diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java index 1b9ac9bc..dbdf06f0 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java @@ -1,6 +1,6 @@ package xiaozhi.modules.sys.service; -import xiaozhi.common.page.PageData; +import xiaozhi.common.page.ExtendPageData; import xiaozhi.common.service.BaseService; import xiaozhi.modules.sys.dto.AdminPageUserDTO; import xiaozhi.modules.sys.dto.PasswordDTO; @@ -55,5 +55,5 @@ public interface SysUserService extends BaseService { * @param dto 分页查找参数 * @return 用户列表分页数据 */ - PageData page(AdminPageUserDTO dto); + ExtendPageData page(AdminPageUserDTO dto); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java index 043144c4..2335c7e1 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java @@ -18,7 +18,7 @@ import lombok.AllArgsConstructor; import xiaozhi.common.constant.Constant; import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.exception.RenException; -import xiaozhi.common.page.PageData; +import xiaozhi.common.page.ExtendPageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.utils.ConvertUtils; import xiaozhi.modules.agent.service.AgentService; @@ -151,7 +151,7 @@ public class SysUserServiceImpl extends BaseServiceImpl page(AdminPageUserDTO dto) { + public ExtendPageData page(AdminPageUserDTO dto) { Map params = new HashMap(); params.put(Constant.PAGE, dto.getPage()); params.put(Constant.LIMIT, dto.getLimit()); @@ -171,7 +171,9 @@ public class SysUserServiceImpl extends BaseServiceImpl(list, page.getTotal()); + //计算页数 + long num = page.getTotal() / Long.parseLong(dto.getPage()); + return new ExtendPageData<>(list, page.getTotal(),num); } private boolean isStrongPassword(String password) { From 17b5308515a9ff611de4eca0f2eb3f37e758718f Mon Sep 17 00:00:00 2001 From: devspadeboy Date: Wed, 2 Apr 2025 22:51:35 +0800 Subject: [PATCH 07/66] =?UTF-8?q?=E4=B8=BAxiaozhi-server=E7=9A=84requirmen?= =?UTF-8?q?ts.txt=E6=96=87=E4=BB=B6=E6=B7=BB=E5=8A=A0PySocks=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因: requests 经过socks代理访问网络的时候需要依赖第三方package, 对应PySocks包。否则会出现"Missing dependencies for SOCKS support."的错误。 参考连接: https://requests.readthedocs.io/en/latest/user/advanced/#socks --- main/xiaozhi-server/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/main/xiaozhi-server/requirements.txt b/main/xiaozhi-server/requirements.txt index a4c60aa5..66128cff 100755 --- a/main/xiaozhi-server/requirements.txt +++ b/main/xiaozhi-server/requirements.txt @@ -24,3 +24,4 @@ modelscope==1.23.2 sherpa_onnx==1.11.0 mcp==1.4.1 cnlunar==0.2.0 +PySocks==1.7.1 From fbdfd8df693070cb20673a93f3df0ab607ac15bf Mon Sep 17 00:00:00 2001 From: CGD <3030332422@qq.com> Date: Wed, 2 Apr 2025 23:52:13 +0800 Subject: [PATCH 08/66] =?UTF-8?q?=E5=AE=8C=E6=88=90"=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE=E5=88=97=E8=A1=A8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/views/ModelConfig.vue | 47 ++++++++++++++++------ 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/main/manager-web/src/views/ModelConfig.vue b/main/manager-web/src/views/ModelConfig.vue index 3345fb2c..29d0251a 100644 --- a/main/manager-web/src/views/ModelConfig.vue +++ b/main/manager-web/src/views/ModelConfig.vue @@ -63,12 +63,18 @@ - - - + + + + + @@ -128,6 +134,7 @@ import HeaderBar from "@/components/HeaderBar.vue"; import ModelEditDialog from "@/components/ModelEditDialog.vue"; import TtsModel from "@/components/TtsModel.vue"; import AddModelDialog from "@/components/AddModelDialog.vue"; +import ModelApi from "@/apis/module/model"; export default { components: { HeaderBar, ModelEditDialog, TtsModel, AddModelDialog }, @@ -139,19 +146,19 @@ export default { editDialogVisible: false, editModelData: {}, ttsDialogVisible: false, - modelList: [ - { code: 'DeepSeek', candidateName: '深度求索', isApplied: true, supplier: '硅基流动' }, - { code: 'SmartAssist', candidateName: '智能助手', isApplied: false, supplier: '智脑科技' }, - { code: 'CogEngine', candidateName: '认知引擎', isApplied: true, supplier: '云智科技' }, - ], + modelList: [], currentPage: 1, - pageSize: 4, - total: 20, + pageSize: 5, + total: 0, selectedModels: [], isAllSelected: false }; }, + created() { + this.loadData(); + }, + computed: { pageCount() { return Math.ceil(this.total / this.pageSize); @@ -281,8 +288,24 @@ export default { this.currentPage = page; this.loadData(); }, + + // 获取模型配置列表 loadData() { - console.log('加载数据,当前页:', this.currentPage); + const params = { + modelType: this.activeTab, + modelName: this.search, + page: this.currentPage, + limit: this.pageSize + }; + + ModelApi.getModelList(params, ({data}) => { + if (data.code === 0) { + this.modelList = data.data.list; + this.total = data.data.total; + } else { + this.$message.error(data.msg || '获取模型列表失败'); + } + }); } }, }; From 14be24a5154411dad7d58f5e9e7e379d9a101b00 Mon Sep 17 00:00:00 2001 From: CGD <3030332422@qq.com> Date: Thu, 3 Apr 2025 08:24:47 +0800 Subject: [PATCH 09/66] =?UTF-8?q?=E5=AE=8C=E6=88=90=E2=80=9C=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E2=80=9D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/views/ModelConfig.vue | 18 +++++++++++++++++- main/manager-web/src/views/roleConfig.vue | 8 ++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/main/manager-web/src/views/ModelConfig.vue b/main/manager-web/src/views/ModelConfig.vue index 29d0251a..e92df918 100644 --- a/main/manager-web/src/views/ModelConfig.vue +++ b/main/manager-web/src/views/ModelConfig.vue @@ -46,7 +46,7 @@
-

大语言模型(LLM)

+

{{ modelTypeText }}

添加 @@ -160,6 +160,20 @@ export default { }, computed: { + + modelTypeText() { + const map = { + vad: '语言活动检测模型(VAD)', + asr: '语音识别模型(ASR)', + llm: '大语言模型(LLM)', + intent: '意图识别模型(Intent)', + tts: '语音合成模型(TTS)', + memory: '记忆模型(Memory)' + } + return map[this.activeTab] || '模型配置' + }, + + pageCount() { return Math.ceil(this.total / this.pageSize); }, @@ -189,6 +203,8 @@ export default { }, handleMenuSelect(index) { this.activeTab = index; + this.currentPage = 1; + this.loadData(); }, handleSearch() { console.log('查询:', this.search); diff --git a/main/manager-web/src/views/roleConfig.vue b/main/manager-web/src/views/roleConfig.vue index cc01e046..d8e3c56a 100644 --- a/main/manager-web/src/views/roleConfig.vue +++ b/main/manager-web/src/views/roleConfig.vue @@ -127,10 +127,10 @@ export default { models: [ {label: '大语言模型(LLM)', key: 'llmModelId'}, {label: '语音识别(ASR)', key: 'asrModelId'}, - {label: '语音活动检测模型(VAD)', key: 'vadModelId'}, - {label: '语音合成模型(TTS)', key: 'ttsModelId'}, - {label: '意图识别模型(Intent)', key: 'intentModelId'}, - {label: '记忆模型(Memory)', key: 'memModelId'} + {label: '语音活动检测(VAD)', key: 'vadModelId'}, + {label: '语音合成(TTS)', key: 'ttsModelId'}, + {label: '意图识别(Intent)', key: 'intentModelId'}, + {label: '记忆(Memory)', key: 'memModelId'} ], templates: ['湾湾小何', '星际游子', '英语老师', '好奇男孩', '汪汪队长'], loadingTemplate: false From 083e7071f00aa3c4274556d1a9f4be6d295c952e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=91=E9=9B=A8?= <2375294554@qq.com> Date: Thu, 3 Apr 2025 09:41:14 +0800 Subject: [PATCH 10/66] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=92=8C=E8=AE=BE=E5=A4=87=E6=A8=A1=E5=9D=97=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E5=BC=95=E7=94=A8=EF=BC=8C=E6=8A=8A=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=A8=A1=E5=9D=97=E5=B8=B8=E7=94=A8=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=8A=BD=E5=87=BA=E4=B8=80=E4=B8=AA=E5=B7=A5=E5=85=B7=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E5=90=8E=E8=AE=BE=E5=A4=87=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E7=94=A8=E6=88=B7=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=8C=E7=9B=B4=E6=8E=A5=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=EF=BC=8C=E9=81=BF=E5=85=8D=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E5=BC=95=E7=94=A8=20--DeviceServiceImpl.java=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87=E6=A8=A1=E5=9D=97=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=A8=E6=88=B7=E5=90=8D=E7=9A=84=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8=E7=94=A8=E6=88=B7=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=20--SysUserService.java=20=E6=96=B0=E5=BB=BA=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=B7=A5=E5=85=B7=E7=B1=BB=EF=BC=8C=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E4=BA=86=E8=B5=8B=E5=80=BC=E7=94=A8=E6=88=B7=E5=90=8D=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20--SysUserServiceImpl.java=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=EF=BC=8C=E9=87=8D=E5=86=99=E4=BA=86?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=E7=94=A8=E6=88=B7=E5=90=8D=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DeviceServiceImpl.java | 14 +++++----- .../sys/service/SysUserUtilService.java | 19 ++++++++++++++ .../service/impl/SysUserUtilServiceImpl.java | 26 +++++++++++++++++++ 3 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserUtilService.java create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java 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 06b64d9e..f94038b8 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 @@ -22,7 +22,6 @@ import cn.hutool.core.util.RandomUtil; import xiaozhi.common.constant.Constant; import xiaozhi.common.exception.RenException; import xiaozhi.common.page.ExtendPageData; -import xiaozhi.common.page.PageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.user.UserDetail; import xiaozhi.common.utils.ConvertUtils; @@ -36,14 +35,14 @@ import xiaozhi.modules.device.entity.DeviceEntity; import xiaozhi.modules.device.service.DeviceService; import xiaozhi.modules.device.vo.UserShowDeviceListVO; import xiaozhi.modules.security.user.SecurityUser; -import xiaozhi.modules.sys.service.SysUserService; +import xiaozhi.modules.sys.service.SysUserUtilService; @Service public class DeviceServiceImpl extends BaseServiceImpl implements DeviceService { private final DeviceDao deviceDao; - private final SysUserService sysUserService; + private final SysUserUtilService sysUserUtilService; private final String frontedUrl; @@ -51,11 +50,11 @@ public class DeviceServiceImpl extends BaseServiceImpl private final RedisTemplate redisTemplate; // 添加构造函数来初始化 deviceMapper - public DeviceServiceImpl(DeviceDao deviceDao, SysUserService sysUserService, + public DeviceServiceImpl(DeviceDao deviceDao, SysUserUtilService sysUserUtilService, @Value("${app.fronted-url:http://localhost:8001}") String frontedUrl, RedisTemplate redisTemplate) { this.deviceDao = deviceDao; - this.sysUserService = sysUserService; + this.sysUserUtilService = sysUserUtilService; this.frontedUrl = frontedUrl; this.redisTemplate = redisTemplate; } @@ -239,9 +238,8 @@ public class DeviceServiceImpl extends BaseServiceImpl UserShowDeviceListVO vo = ConvertUtils.sourceToTarget(device, UserShowDeviceListVO.class); // 把最后修改的时间,改为简短描述的时间 vo.setRecentChatTime(DateUtils.getShortTime(device.getUpdateDate())); - // 获取用户名 - String username = sysUserService.getByUserId(device.getUserId()).getUsername(); - vo.setBindUserName(username); + sysUserUtilService.assignUsername(device.getUserId(), + vo::setBindUserName); vo.setDeviceType(device.getBoard()); return vo; }).toList(); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserUtilService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserUtilService.java new file mode 100644 index 00000000..0fa3fc4a --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserUtilService.java @@ -0,0 +1,19 @@ +package xiaozhi.modules.sys.service; + + +import java.util.function.Consumer; + +/** + * 定义一个系统用户工具类,避免和用户模块循环依赖 + * 如用户和设备互相依赖,用户需要获取所有设备,设备又需要获取每个设备的用户名 + * @author zjy + * @since 2025-4-2 + */ +public interface SysUserUtilService { + /** + * 赋值用户名 + * @param userId 用户id + * @param setter 赋值方法 + */ + void assignUsername( Long userId, Consumer setter); +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java new file mode 100644 index 00000000..513da17b --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java @@ -0,0 +1,26 @@ +package xiaozhi.modules.sys.service.impl; + +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import xiaozhi.common.redis.RedisUtils; +import xiaozhi.common.service.impl.BaseServiceImpl; +import xiaozhi.modules.sys.dao.SysUserDao; +import xiaozhi.modules.sys.entity.SysUserEntity; +import xiaozhi.modules.sys.service.SysUserUtilService; + +import java.util.function.Consumer; + +@Service +@AllArgsConstructor +public class SysUserUtilServiceImpl extends BaseServiceImpl implements SysUserUtilService { + + private RedisUtils redisUtils; + + @Override + public void assignUsername(Long userId, Consumer setter) { + SysUserEntity entity = baseDao.selectById(userId); + if (entity != null) { + setter.accept(entity.getUsername()); + } + } +} From 06e4834e2746676d32a7d7f137d120c100187324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=91=E9=9B=A8?= <2375294554@qq.com> Date: Thu, 3 Apr 2025 09:49:39 +0800 Subject: [PATCH 11/66] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9A=84=E5=90=8D=E7=A7=B0=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20--RedisKeys.java=20=E8=AE=BE=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=96=B0key=20--SysUserUtilServiceImpl.java=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=B5=8B=E5=80=BC=E7=94=A8=E6=88=B7=E5=90=8D=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E6=8A=8A=E7=94=A8=E6=88=B7=E5=90=8D?= =?UTF-8?q?=E6=9A=82=E5=AD=98=E5=9C=A8redis=E3=80=82=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=9A=84=E4=B8=8D=E9=9C=80=E8=A6=81=E9=A2=91?= =?UTF-8?q?=E7=B9=81=E5=8E=BB=E6=95=B0=E6=8D=AE=E5=BA=93=E6=9F=A5=E6=89=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/xiaozhi/common/redis/RedisKeys.java | 9 +++++++++ .../sys/service/impl/SysUserUtilServiceImpl.java | 15 ++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/common/redis/RedisKeys.java b/main/manager-api/src/main/java/xiaozhi/common/redis/RedisKeys.java index 21121fd7..d71040e0 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/redis/RedisKeys.java +++ b/main/manager-api/src/main/java/xiaozhi/common/redis/RedisKeys.java @@ -26,4 +26,13 @@ public class RedisKeys { public static String getDeviceCaptchaKey(String captcha) { return "sys:device:captcha:" + captcha; } + + /** + * 用户id的Key + */ + public static String getUserIdKey(Long userid) { + return "sys:username:id:" + userid; + } + + } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java index 513da17b..8fd0351a 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserUtilServiceImpl.java @@ -2,6 +2,7 @@ package xiaozhi.modules.sys.service.impl; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import xiaozhi.common.redis.RedisKeys; import xiaozhi.common.redis.RedisUtils; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.modules.sys.dao.SysUserDao; @@ -18,9 +19,17 @@ public class SysUserUtilServiceImpl extends BaseServiceImpl setter) { - SysUserEntity entity = baseDao.selectById(userId); - if (entity != null) { - setter.accept(entity.getUsername()); + String userIdKey = RedisKeys.getUserIdKey(userId); + String username = redisUtils.get(userIdKey).toString(); + if(username != null){ + setter.accept(username); + }else { + SysUserEntity entity = baseDao.selectById(userId); + if (entity != null) { + username = entity.getUsername(); + redisUtils.set(userIdKey,username,10); + setter.accept(username); + } } } } From e474a2114ccda4e5eaa75f736c1fe4c721cee4e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=91=E9=9B=A8?= <2375294554@qq.com> Date: Thu, 3 Apr 2025 10:16:47 +0800 Subject: [PATCH 12/66] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=AA=8C=E8=AF=81=20--AdminController.java=20--AdminP?= =?UTF-8?q?ageUserDTO.java=20--DevicePageUserDTO.java=20=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=AA=8C=E8=AF=81=E8=AF=B4=E6=98=8E=20--vali?= =?UTF-8?q?dation.properties=20--validation=5Fen=5FUS.properties=20--valid?= =?UTF-8?q?ation=5Fzh=5FCN.properties=20--validation=5Fzh=5FTW.properties?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/xiaozhi/modules/device/dto/DevicePageUserDTO.java | 3 +++ .../java/xiaozhi/modules/sys/controller/AdminController.java | 5 +++-- .../main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java | 3 +++ .../src/main/resources/i18n/validation.properties | 2 ++ .../src/main/resources/i18n/validation_en_US.properties | 2 ++ .../src/main/resources/i18n/validation_zh_CN.properties | 2 ++ .../src/main/resources/i18n/validation_zh_TW.properties | 2 ++ 7 files changed, 17 insertions(+), 2 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java index 40e67445..26bccbfd 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DevicePageUserDTO.java @@ -1,6 +1,7 @@ package xiaozhi.modules.device.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; import lombok.Data; /** @@ -17,8 +18,10 @@ public class DevicePageUserDTO { private String keywords; @Schema(description = "页数") + @Min(value = 0, message = "{page.number}") private String page; @Schema(description = "显示列数") + @Min(value = 0, message = "{limit.number}") private String limit; } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java index 917ae82d..93eb0b3c 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java @@ -57,7 +57,7 @@ public class AdminController { dto.setMobile((String) params.get("mobile")); dto.setLimit((String) params.get(Constant.LIMIT)); dto.setPage((String) params.get("pages")); - + ValidatorUtils.validateEntity(dto); ValidatorUtils.validateEntity(dto); ExtendPageData page = sysUserService.page(dto); return new Result>().ok(page); @@ -76,7 +76,7 @@ public class AdminController { @Operation(summary = "用户删除") @RequiresPermissions("sys:role:superAdmin") public Result delete(@PathVariable Long id) { - sysUserService.deleteById( id ); + sysUserService.deleteById(id); return new Result<>(); } @@ -94,6 +94,7 @@ public class AdminController { dto.setKeywords((String) params.get("keywords")); dto.setLimit((String) params.get(Constant.LIMIT)); dto.setPage((String) params.get(Constant.PAGE)); + ValidatorUtils.validateEntity(dto); ExtendPageData page = deviceService.page(dto); return new Result>().ok(page); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java index 4e158ca4..a9d960a1 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java @@ -1,6 +1,7 @@ package xiaozhi.modules.sys.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; import lombok.Data; /** @@ -17,8 +18,10 @@ public class AdminPageUserDTO { private String mobile; @Schema(description = "页数") + @Min(value = 0, message = "{sort.number}") private String page; @Schema(description = "显示列数") + @Min(value = 0, message = "{sort.number}") private String limit; } diff --git a/main/manager-api/src/main/resources/i18n/validation.properties b/main/manager-api/src/main/resources/i18n/validation.properties index e7452e47..008f2a03 100644 --- a/main/manager-api/src/main/resources/i18n/validation.properties +++ b/main/manager-api/src/main/resources/i18n/validation.properties @@ -3,6 +3,8 @@ id.require=ID\u4E0D\u80FD\u4E3A\u7A7A id.null=ID\u5FC5\u987B\u4E3A\u7A7A sort.number=\u6392\u5E8F\u503C\u4E0D\u80FD\u5C0F\u4E8E0 +page.number=\u9875\u6570\u4E0D\u80FD\u5C0F\u4E8E0 +limit.number=\u5217\u6570\u4E0D\u80FD\u5C0F\u4E8E0 sysdict.type.require=\u5B57\u5178\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A sysdict.name.require=\u5B57\u5178\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A diff --git a/main/manager-api/src/main/resources/i18n/validation_en_US.properties b/main/manager-api/src/main/resources/i18n/validation_en_US.properties index 37bebf18..2840d605 100644 --- a/main/manager-api/src/main/resources/i18n/validation_en_US.properties +++ b/main/manager-api/src/main/resources/i18n/validation_en_US.properties @@ -3,6 +3,8 @@ id.require=ID can not be empty id.null=ID has to be empty sort.number=The sort value cannot be less than 0 +page.number=The page value cannot be less than 0 +limit.number=The limit value cannot be less than 0 sysdict.type.require=The dictionary type cannot be empty sysdict.name.require=The dictionary name cannot be empty diff --git a/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties b/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties index 41bf1e69..c86aded7 100644 --- a/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties +++ b/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties @@ -3,6 +3,8 @@ id.require=ID\u4E0D\u80FD\u4E3A\u7A7A id.null=ID\u5FC5\u987B\u4E3A\u7A7A sort.number=\u6392\u5E8F\u503C\u4E0D\u80FD\u5C0F\u4E8E0 +page.number=\u9801\u6578\u4E0D\u80FD\u5C0F\u4E8E0 +limit.number=\u5217\u6578\u4E0D\u80FD\u5C0F\u4E8E0 sysdict.type.require=\u5B57\u5178\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A sysdict.name.require=\u5B57\u5178\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A diff --git a/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties b/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties index 9241c97a..23c59eef 100644 --- a/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties +++ b/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties @@ -3,6 +3,8 @@ id.require=ID\u4E0D\u80FD\u4E3A\u7A7A id.null=ID\u5FC5\u987B\u4E3A\u7A7A sort.number=\u6392\u5E8F\u503C\u4E0D\u80FD\u5C0F\u4E8E0 +page.number=\u9875\u6570\u4E0D\u80FD\u5C0F\u4E8E0 +limit.number=\u5217\u6570\u4E0D\u80FD\u5C0F\u4E8E0 sysdict.type.require=\u5B57\u5178\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A sysdict.name.require=\u5B57\u5178\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A From 4ea27cbdc2519018fa251ab22569be4affb06dfe Mon Sep 17 00:00:00 2001 From: CGD <3030332422@qq.com> Date: Thu, 3 Apr 2025 10:47:31 +0800 Subject: [PATCH 13/66] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E2=80=9C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E5=9E=8B=E2=80=9D=E5=BC=B9=E6=A1=86?= =?UTF-8?q?=E7=9A=84=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ModelEditDialog.vue | 308 +++++++++++++----- main/manager-web/src/views/ModelConfig.vue | 2 - 2 files changed, 219 insertions(+), 91 deletions(-) diff --git a/main/manager-web/src/components/ModelEditDialog.vue b/main/manager-web/src/components/ModelEditDialog.vue index 09e5570c..4aea1027 100644 --- a/main/manager-web/src/components/ModelEditDialog.vue +++ b/main/manager-web/src/components/ModelEditDialog.vue @@ -1,78 +1,84 @@ @@ -121,39 +127,163 @@ export default { diff --git a/main/manager-web/src/views/ModelConfig.vue b/main/manager-web/src/views/ModelConfig.vue index e92df918..751cc0fe 100644 --- a/main/manager-web/src/views/ModelConfig.vue +++ b/main/manager-web/src/views/ModelConfig.vue @@ -676,7 +676,6 @@ export default { margin-top: 15px; /* 导航按钮样式 (首页、上一页、下一页) */ - .pagination-btn:first-child, .pagination-btn:nth-child(2), .pagination-btn:nth-last-child(2) { @@ -702,7 +701,6 @@ export default { } /* 数字按钮样式 */ - .pagination-btn:not(:first-child):not(:nth-child(2)):not(:nth-last-child(2)) { min-width: 28px; height: 32px; From 5b28cf6c663258d6314461d1e524e959b3c0cad4 Mon Sep 17 00:00:00 2001 From: CGD <3030332422@qq.com> Date: Thu, 3 Apr 2025 14:31:57 +0800 Subject: [PATCH 14/66] =?UTF-8?q?=E5=AE=8C=E6=88=90=E2=80=9C=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=A8=A1=E5=9E=8B=E4=BE=9B=E5=BA=94=E5=99=A8=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E2=80=9D=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/apis/module/model.js | 17 +++ .../src/components/AddModelDialog.vue | 111 ++++++------------ 2 files changed, 54 insertions(+), 74 deletions(-) diff --git a/main/manager-web/src/apis/module/model.js b/main/manager-web/src/apis/module/model.js index 2534bb5a..28df13de 100644 --- a/main/manager-web/src/apis/module/model.js +++ b/main/manager-web/src/apis/module/model.js @@ -26,5 +26,22 @@ export default { }) }).send() }, + // 获取模型供应器列表 + getModelProviders(modelType, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/models/${modelType}/provideTypes`) + .method('GET') + .success((res) => { + RequestService.clearRequestTime() + callback(res.data?.data || []) + }) + .fail((err) => { + console.error('获取供应器列表失败:', err) + this.$message.error('获取供应器列表失败') + RequestService.reAjaxFun(() => { + this.getModelProviders(modelType, callback) + }) + }).send() + } } diff --git a/main/manager-web/src/components/AddModelDialog.vue b/main/manager-web/src/components/AddModelDialog.vue index 074be175..ed59057e 100644 --- a/main/manager-web/src/components/AddModelDialog.vue +++ b/main/manager-web/src/components/AddModelDialog.vue @@ -1,13 +1,5 @@ \ No newline at end of file From a230fc6aaa97a268e7fb53dba318d80d78eac09d Mon Sep 17 00:00:00 2001 From: Ran_Chen <1908198662@qq.com> Date: Thu, 3 Apr 2025 18:00:23 +0800 Subject: [PATCH 17/66] =?UTF-8?q?ota=E6=8E=A5=E5=8F=A3=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/apis/module/ota.js | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 main/manager-web/src/apis/module/ota.js diff --git a/main/manager-web/src/apis/module/ota.js b/main/manager-web/src/apis/module/ota.js new file mode 100644 index 00000000..fbc76421 --- /dev/null +++ b/main/manager-web/src/apis/module/ota.js @@ -0,0 +1,54 @@ +import RequestService from '../httpRequest' +import {getServiceUrl} from '../api' + +export default { + /** + * 设备激活接口 + * @param {string} code 激活码 + * @param {function} callback 回调函数 + */ + activateDevice(code, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/ota/activation`) + .method('GET') + .query({code}) + .success((res) => { + RequestService.clearRequestTime() + callback(res) + }) + .fail((err) => { + console.error('设备激活失败:', err) + RequestService.reAjaxFun(() => { + this.activateDevice(code, callback) + }) + }).send() + }, + + /** + * 检查OTA版本和设备激活状态 + * @param {object} deviceInfo 设备信息对象 + * @param {string} deviceId 设备唯一标识 + * @param {string} clientId 客户端标识 + * @param {function} callback 回调函数 + */ + checkOtaVersion(deviceInfo, deviceId, clientId, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/ota`) + .method('POST') + .header({ + 'Device-Id': deviceId, + 'Client-Id': clientId + }) + .data(deviceInfo) + .success((res) => { + RequestService.clearRequestTime() + callback(res) + }) + .fail((err) => { + console.error('检查OTA版本失败:', err) + RequestService.reAjaxFun(() => { + this.checkOtaVersion(deviceInfo, deviceId, clientId, callback) + }) + }).send() + } +} \ No newline at end of file From b2262d062ca6d502e7dc6f68cc8ebfd9340f8e2f Mon Sep 17 00:00:00 2001 From: huangjunsen0406 <951434130@qq.com> Date: Fri, 4 Apr 2025 16:42:07 +0800 Subject: [PATCH 18/66] =?UTF-8?q?fix:=20:bug:=20=E4=BF=AE=E5=A4=8Dtest=5Fp?= =?UTF-8?q?age.html=20=E6=92=AD=E6=94=BE=E5=BC=82=E5=B8=B8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/test/test_page.html | 592 +++++++++++++++--------- 1 file changed, 381 insertions(+), 211 deletions(-) diff --git a/main/xiaozhi-server/test/test_page.html b/main/xiaozhi-server/test/test_page.html index 63f9f90e..2735fb5a 100644 --- a/main/xiaozhi-server/test/test_page.html +++ b/main/xiaozhi-server/test/test_page.html @@ -452,6 +452,16 @@ let audioBuffers = []; // 用于存储接收到的所有音频数据 let totalAudioSize = 0; // 跟踪累积的音频大小 + let audioBufferQueue = []; // 存储接收到的音频包 + let isAudioBuffering = false; // 是否正在缓冲音频 + let isAudioPlaying = false; // 是否正在播放音频 + const BUFFER_THRESHOLD = 3; // 缓冲包数量阈值,至少累积3个包再开始播放 + const MIN_AUDIO_DURATION = 0.1; // 最小音频长度(秒),小于这个长度的音频会被合并 + let streamingContext = null; // 音频流上下文 + const SAMPLE_RATE = 16000; // 采样率 + const CHANNELS = 1; // 声道数 + const FRAME_SIZE = 960; // 帧大小 + // DOM元素 const connectButton = document.getElementById('connectButton'); const serverUrlInput = document.getElementById('serverUrl'); @@ -526,221 +536,360 @@ conversationDiv.scrollTop = conversationDiv.scrollHeight; } - // 播放Opus音频数据 - function playOpusData(opusBuffers) { - if (!opusBuffers || opusBuffers.length === 0) { - log('无效的Opus数据,无法播放', 'warning'); - return; - } - if (isPlaying) { - // 已经在播放,加入队列 - audioQueue.push(opusBuffers); - log(`音频添加到队列,当前队列长度: ${audioQueue.length}`, 'debug'); - return; - } - - isPlaying = true; - - try { - // 确保音频上下文存在 - if (!audioContext) { - audioContext = new (window.AudioContext || window.webkitAudioContext)({ - sampleRate: 16000 - }); - log('创建音频上下文,采样率: 16000Hz', 'debug'); + // 开始音频缓冲过程 + function startAudioBuffering() { + if (isAudioBuffering || isAudioPlaying) return; + + isAudioBuffering = true; + log("开始音频缓冲...", 'info'); + + // 先尝试初始化解码器,以便在播放时已准备好 + initOpusDecoder().catch(error => { + log(`预初始化Opus解码器失败: ${error.message}`, 'warning'); + // 继续缓冲,我们会在播放时再次尝试初始化 + }); + + // 设置超时,如果在一定时间内没有收集到足够的音频包,就开始播放 + setTimeout(() => { + if (isAudioBuffering && audioBufferQueue.length > 0) { + log(`缓冲超时,当前缓冲包数: ${audioBufferQueue.length},开始播放`, 'info'); + playBufferedAudio(); } - - // 确保解码器已初始化 - if (!opusDecoder) { - try { - // 检查ModuleInstance是否存在(本地库导出的全局变量) - if (typeof window.ModuleInstance === 'undefined') { - if (typeof Module !== 'undefined') { - // 尝试使用全局Module - window.ModuleInstance = Module; - log('使用全局Module作为ModuleInstance', 'info'); - } else { - throw new Error('Opus库未加载,ModuleInstance和Module对象都不存在'); - } - } - - // 初始化Opus解码器 - 16kHz采样率,单声道 - opusDecoder = { - channels: 1, - rate: 16000, - frameSize: 960, // 60ms @ 16kHz = 60 * 16 = 960 samples - frameDuration: 60, // 60ms帧时长 - module: window.ModuleInstance, // 保存模块实例的引用 - - // 使用ModuleInstance提供的函数来解码 - decode_float: function (opusData) { - try { - const mod = this.module; // 简写引用 - - // 打印输入数据的大小 - log(`正在解码Opus数据,大小: ${opusData.length}字节`, 'debug'); - - // 为输入数据分配内存 - const inputPtr = mod._malloc(opusData.length); - mod.HEAPU8.set(opusData, inputPtr); - - // 为输出PCM数据分配内存 (每个样本为float) - const pcmSamples = this.frameSize; - const pcmPtr = mod._malloc(pcmSamples * 4); // 4字节/float - - // 创建解码器实例 - const decoderSize = mod._opus_decoder_get_size(this.channels); - log(`Opus解码器大小: ${decoderSize}字节`, 'debug'); - - const decoderPtr = mod._malloc(decoderSize); - const err = mod._opus_decoder_init(decoderPtr, this.rate, this.channels); - - if (err < 0) { - throw new Error(`Opus解码器初始化失败: ${err}`); - } - - // 解码音频帧 - const samplesDecoded = mod._opus_decode_float( - decoderPtr, - inputPtr, - opusData.length, - pcmPtr, - this.frameSize, - 0 // 不使用FEC - ); - - if (samplesDecoded < 0) { - throw new Error(`Opus解码失败,错误码: ${samplesDecoded}`); - } - - log(`解码成功,获得${samplesDecoded}个PCM样本`, 'debug'); - - // 从内存中复制PCM数据 - const pcmData = new Float32Array(samplesDecoded); - for (let i = 0; i < samplesDecoded; i++) { - pcmData[i] = mod.HEAPF32[pcmPtr / 4 + i]; - } - - // 释放内存 - mod._free(inputPtr); - mod._free(pcmPtr); - mod._free(decoderPtr); - - return pcmData; - } catch (err) { - log(`解码过程中出错: ${err.message}`, 'error'); - return new Float32Array(0); - } - } - }; - - log('Opus解码器初始化成功', 'success'); - } catch (err) { - log(`Opus解码器初始化失败: ${err.message},尝试使用简单播放`, 'error'); - // 回退到简单播放 - simpleFallbackPlay(opusBuffers); - isPlaying = false; - return; - } - } - - // 解码所有Opus帧 - let pcmData = []; - let successCount = 0; - - for (let i = 0; i < opusBuffers.length; i++) { - try { - const opusBuffer = opusBuffers[i]; - // 确保这是Uint8Array - const opusArray = opusBuffer instanceof Uint8Array ? - opusBuffer : new Uint8Array(opusBuffer); - - // 解码Opus帧为PCM数据 - const decoded = opusDecoder.decode_float(opusArray); - if (decoded && decoded.length > 0) { - pcmData.push(decoded); - successCount++; - } - } catch (error) { - log(`Opus帧 #${i + 1} 解码错误: ${error.message}`, 'error'); - } - } - - log(`解码完成,成功: ${successCount}/${opusBuffers.length} 帧`, 'debug'); - - if (pcmData.length === 0) { - log('没有成功解码的帧,尝试使用简单播放', 'warning'); - simpleFallbackPlay(opusBuffers); - isPlaying = false; + }, 300); // 300ms超时 + + // 监控缓冲进度 + const bufferCheckInterval = setInterval(() => { + if (!isAudioBuffering) { + clearInterval(bufferCheckInterval); return; } - - // 连接所有PCM数据 - const totalSamples = pcmData.reduce((acc, arr) => acc + arr.length, 0); - log(`总共解码出 ${totalSamples} 个PCM样本`, 'debug'); - - const combinedPCM = new Float32Array(totalSamples); - - let offset = 0; - for (const buffer of pcmData) { - combinedPCM.set(buffer, offset); - offset += buffer.length; + + // 当累积了足够的音频包,开始播放 + if (audioBufferQueue.length >= BUFFER_THRESHOLD) { + clearInterval(bufferCheckInterval); + log(`已缓冲 ${audioBufferQueue.length} 个音频包,开始播放`, 'info'); + playBufferedAudio(); } - - // 使用Web Audio API播放PCM数据 - const audioBuffer = audioContext.createBuffer(1, combinedPCM.length, 16000); - audioBuffer.getChannelData(0).set(combinedPCM); - - const source = audioContext.createBufferSource(); - source.buffer = audioBuffer; - source.connect(audioContext.destination); - - source.onended = () => { - isPlaying = false; - log('音频播放完成', 'debug'); - - // 播放队列中的下一个 - if (audioQueue.length > 0) { - const nextBuffers = audioQueue.shift(); - playOpusData(nextBuffers); - } - }; - - source.start(); - log(`开始播放PCM音频,时长: ${(combinedPCM.length / 16000).toFixed(2)}秒`, 'debug'); - - } catch (error) { - log(`播放Opus音频错误: ${error.message},尝试使用简单播放`, 'error'); - simpleFallbackPlay(opusBuffers); - isPlaying = false; - } + }, 50); } - // 简单播放回退方案 - function simpleFallbackPlay(opusBuffers) { - try { - log('使用简单播放回退方案', 'warning'); - - // 创建一个简单的"滴"声作为反馈 - if (audioContext) { - const oscillator = audioContext.createOscillator(); - oscillator.type = 'sine'; - oscillator.frequency.setValueAtTime(440, audioContext.currentTime); // A4音 - - const gainNode = audioContext.createGain(); - gainNode.gain.setValueAtTime(0.1, audioContext.currentTime); // 设置音量为0.1 - - oscillator.connect(gainNode); - gainNode.connect(audioContext.destination); - - oscillator.start(); - oscillator.stop(audioContext.currentTime + 0.2); // 播放0.2秒 - - log('播放提示音作为音频播放失败的反馈', 'info'); + // 播放已缓冲的音频 + function playBufferedAudio() { + if (isAudioPlaying || audioBufferQueue.length === 0) return; + + isAudioPlaying = true; + isAudioBuffering = false; + + // 确保Opus解码器已初始化 + const initDecoderAndPlay = async () => { + try { + // 确保音频上下文存在 + if (!audioContext) { + audioContext = new (window.AudioContext || window.webkitAudioContext)({ + sampleRate: SAMPLE_RATE + }); + log('创建音频上下文,采样率: ' + SAMPLE_RATE + 'Hz', 'debug'); + } + + // 确保解码器已初始化 + if (!opusDecoder) { + log('初始化Opus解码器...', 'info'); + try { + opusDecoder = await initOpusDecoder(); + if (!opusDecoder) { + throw new Error('解码器初始化失败'); + } + log('Opus解码器初始化成功', 'success'); + } catch (error) { + log('Opus解码器初始化失败: ' + error.message, 'error'); + isAudioPlaying = false; + return; + } + } + + // 创建流式播放上下文 + if (!streamingContext) { + streamingContext = { + queue: [], // 已解码的PCM队列 + playing: false, // 是否正在播放 + endOfStream: false, // 是否收到结束信号 + source: null, // 当前音频源 + totalSamples: 0, // 累积的总样本数 + lastPlayTime: 0, // 上次播放的时间戳 + + // 将Opus数据解码为PCM + decodeOpusFrames: async function(opusFrames) { + if (!opusDecoder) { + log('Opus解码器未初始化,无法解码', 'error'); + return; + } + + let decodedSamples = []; + + for (const frame of opusFrames) { + try { + // 使用Opus解码器解码 + const frameData = opusDecoder.decode(frame); + if (frameData && frameData.length > 0) { + // 转换为Float32 + const floatData = convertInt16ToFloat32(frameData); + decodedSamples.push(...floatData); + } + } catch (error) { + log("Opus解码失败: " + error.message, 'error'); + } + } + + if (decodedSamples.length > 0) { + // 添加到解码队列 + this.queue.push(...decodedSamples); + this.totalSamples += decodedSamples.length; + + // 如果累积了至少0.2秒的音频,开始播放 + const minSamples = SAMPLE_RATE * MIN_AUDIO_DURATION; + if (!this.playing && this.queue.length >= minSamples) { + this.startPlaying(); + } + } else { + log('没有成功解码的样本', 'warning'); + } + }, + + // 开始播放音频 + startPlaying: function() { + if (this.playing || this.queue.length === 0) return; + + this.playing = true; + + // 创建新的音频缓冲区 + const minPlaySamples = Math.min(this.queue.length, SAMPLE_RATE); // 最多播放1秒 + const currentSamples = this.queue.splice(0, minPlaySamples); + + const audioBuffer = audioContext.createBuffer(CHANNELS, currentSamples.length, SAMPLE_RATE); + audioBuffer.copyToChannel(new Float32Array(currentSamples), 0); + + // 创建音频源 + this.source = audioContext.createBufferSource(); + this.source.buffer = audioBuffer; + + // 创建增益节点用于平滑过渡 + const gainNode = audioContext.createGain(); + + // 应用淡入淡出效果避免爆音 + const fadeDuration = 0.02; // 20毫秒 + gainNode.gain.setValueAtTime(0, audioContext.currentTime); + gainNode.gain.linearRampToValueAtTime(1, audioContext.currentTime + fadeDuration); + + const duration = audioBuffer.duration; + if (duration > fadeDuration * 2) { + gainNode.gain.setValueAtTime(1, audioContext.currentTime + duration - fadeDuration); + gainNode.gain.linearRampToValueAtTime(0, audioContext.currentTime + duration); + } + + // 连接节点并开始播放 + this.source.connect(gainNode); + gainNode.connect(audioContext.destination); + + this.lastPlayTime = audioContext.currentTime; + log(`开始播放 ${currentSamples.length} 个样本,约 ${(currentSamples.length / SAMPLE_RATE).toFixed(2)} 秒`, 'info'); + + // 播放结束后的处理 + this.source.onended = () => { + this.source = null; + this.playing = false; + + // 如果队列中还有数据或者缓冲区有新数据,继续播放 + if (this.queue.length > 0) { + setTimeout(() => this.startPlaying(), 10); + } else if (audioBufferQueue.length > 0) { + // 缓冲区有新数据,进行解码 + const frames = [...audioBufferQueue]; + audioBufferQueue = []; + this.decodeOpusFrames(frames); + } else if (this.endOfStream) { + // 流已结束且没有更多数据 + log("音频播放完成", 'info'); + isAudioPlaying = false; + streamingContext = null; + } else { + // 等待更多数据 + setTimeout(() => { + // 如果仍然没有新数据,但有更多的包到达 + if (this.queue.length === 0 && audioBufferQueue.length > 0) { + const frames = [...audioBufferQueue]; + audioBufferQueue = []; + this.decodeOpusFrames(frames); + } else if (this.queue.length === 0 && audioBufferQueue.length === 0) { + // 真的没有更多数据了 + log("音频播放完成 (超时)", 'info'); + isAudioPlaying = false; + streamingContext = null; + } + }, 500); // 500ms超时 + } + }; + + this.source.start(); + } + }; + } + + // 开始处理缓冲的数据 + const frames = [...audioBufferQueue]; + audioBufferQueue = []; // 清空缓冲队列 + + // 解码并播放 + await streamingContext.decodeOpusFrames(frames); + + } catch (error) { + log(`播放已缓冲的音频出错: ${error.message}`, 'error'); + isAudioPlaying = false; + streamingContext = null; } + }; + + // 执行初始化和播放 + initDecoderAndPlay(); + } + + // 将Int16音频数据转换为Float32音频数据 + function convertInt16ToFloat32(int16Data) { + const float32Data = new Float32Array(int16Data.length); + for (let i = 0; i < int16Data.length; i++) { + // 将[-32768,32767]范围转换为[-1,1] + float32Data[i] = int16Data[i] / (int16Data[i] < 0 ? 0x8000 : 0x7FFF); + } + return float32Data; + } + + // 初始化Opus解码器 - 确保完全初始化完成后才返回 + async function initOpusDecoder() { + if (opusDecoder) return opusDecoder; // 已经初始化 + + try { + // 检查ModuleInstance是否存在 + if (typeof window.ModuleInstance === 'undefined') { + if (typeof Module !== 'undefined') { + // 使用全局Module作为ModuleInstance + window.ModuleInstance = Module; + log('使用全局Module作为ModuleInstance', 'info'); + } else { + throw new Error('Opus库未加载,ModuleInstance和Module对象都不存在'); + } + } + + const mod = window.ModuleInstance; + + // 创建解码器对象 + opusDecoder = { + channels: CHANNELS, + rate: SAMPLE_RATE, + frameSize: FRAME_SIZE, + module: mod, + decoderPtr: null, // 初始为null + + // 初始化解码器 + init: function() { + if (this.decoderPtr) return true; // 已经初始化 + + // 获取解码器大小 + const decoderSize = mod._opus_decoder_get_size(this.channels); + log(`Opus解码器大小: ${decoderSize}字节`, 'debug'); + + // 分配内存 + this.decoderPtr = mod._malloc(decoderSize); + if (!this.decoderPtr) { + throw new Error("无法分配解码器内存"); + } + + // 初始化解码器 + const err = mod._opus_decoder_init( + this.decoderPtr, + this.rate, + this.channels + ); + + if (err < 0) { + this.destroy(); // 清理资源 + throw new Error(`Opus解码器初始化失败: ${err}`); + } + + log("Opus解码器初始化成功", 'success'); + return true; + }, + + // 解码方法 + decode: function(opusData) { + if (!this.decoderPtr) { + if (!this.init()) { + throw new Error("解码器未初始化且无法初始化"); + } + } + + try { + const mod = this.module; + + // 为Opus数据分配内存 + const opusPtr = mod._malloc(opusData.length); + mod.HEAPU8.set(opusData, opusPtr); + + // 为PCM输出分配内存 + const pcmPtr = mod._malloc(this.frameSize * 2); // Int16 = 2字节 + + // 解码 + const decodedSamples = mod._opus_decode( + this.decoderPtr, + opusPtr, + opusData.length, + pcmPtr, + this.frameSize, + 0 // 不使用FEC + ); + + if (decodedSamples < 0) { + mod._free(opusPtr); + mod._free(pcmPtr); + throw new Error(`Opus解码失败: ${decodedSamples}`); + } + + // 复制解码后的数据 + const decodedData = new Int16Array(decodedSamples); + for (let i = 0; i < decodedSamples; i++) { + decodedData[i] = mod.HEAP16[(pcmPtr >> 1) + i]; + } + + // 释放内存 + mod._free(opusPtr); + mod._free(pcmPtr); + + return decodedData; + } catch (error) { + log(`Opus解码错误: ${error.message}`, 'error'); + return new Int16Array(0); + } + }, + + // 销毁方法 + destroy: function() { + if (this.decoderPtr) { + this.module._free(this.decoderPtr); + this.decoderPtr = null; + } + } + }; + + // 初始化解码器 + if (!opusDecoder.init()) { + throw new Error("Opus解码器初始化失败"); + } + + return opusDecoder; + } catch (error) { - log(`简单播放回退方案也失败: ${error.message}`, 'error'); + log(`Opus解码器初始化失败: ${error.message}`, 'error'); + opusDecoder = null; // 重置为null,以便下次重试 + throw error; } } @@ -1481,6 +1630,14 @@ // 初始化Opus编码器 initOpusEncoder(); + + // 预加载Opus解码器 + log('预加载Opus解码器...', 'info'); + initOpusDecoder().then(() => { + log('Opus解码器预加载成功', 'success'); + }).catch(error => { + log(`Opus解码器预加载失败: ${error.message},将在需要时重试`, 'warning'); + }); } // PCM录音处理器代码 - 会被注入到AudioWorklet中 @@ -1647,7 +1804,6 @@ let audioProcessor = null; let audioProcessorType = null; let audioSource = null; - let pcmBuffers = []; // 处理PCM缓冲数据 let pcmDataBuffer = new Int16Array(); @@ -1895,7 +2051,6 @@ } } - // 处理二进制消息 async function handleBinaryMessage(data) { try { let arrayBuffer; @@ -1917,10 +2072,25 @@ const opusData = new Uint8Array(arrayBuffer); if (opusData.length > 0) { - // 播放Opus音频 - playOpusData([opusData]); + // 将数据添加到缓冲队列 + audioBufferQueue.push(opusData); + + // 如果收到的是第一个音频包,开始缓冲过程 + if (audioBufferQueue.length === 1 && !isAudioBuffering && !isAudioPlaying) { + startAudioBuffering(); + } } else { - log('收到空音频数据帧', 'warning'); + log('收到空音频数据帧,可能是结束标志', 'warning'); + + // 如果缓冲队列中有数据且没有在播放,立即开始播放 + if (audioBufferQueue.length > 0 && !isAudioPlaying) { + playBufferedAudio(); + } + + // 如果正在播放,发送结束信号 + if (isAudioPlaying && streamingContext) { + streamingContext.endOfStream = true; + } } } catch (error) { log(`处理二进制消息出错: ${error.message}`, 'error'); From d36210ad6bb21e14c6161807b02cf0178fbd890f Mon Sep 17 00:00:00 2001 From: huangjunsen0406 <951434130@qq.com> Date: Fri, 4 Apr 2025 16:42:45 +0800 Subject: [PATCH 19/66] =?UTF-8?q?feat(test):=20:sparkles:=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9Eopus=E6=9C=AC=E5=9C=B0=E5=BD=95=E5=88=B6=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/test/opus_test/app.js | 670 +++++++++++++++++++ main/xiaozhi-server/test/opus_test/test.html | 464 +++++++++++++ 2 files changed, 1134 insertions(+) create mode 100644 main/xiaozhi-server/test/opus_test/app.js create mode 100644 main/xiaozhi-server/test/opus_test/test.html diff --git a/main/xiaozhi-server/test/opus_test/app.js b/main/xiaozhi-server/test/opus_test/app.js new file mode 100644 index 00000000..9e56f997 --- /dev/null +++ b/main/xiaozhi-server/test/opus_test/app.js @@ -0,0 +1,670 @@ +const SAMPLE_RATE = 16000; +const CHANNELS = 1; +const FRAME_SIZE = 960; // 对应于60ms帧大小 (16000Hz * 0.06s = 960 samples) +const OPUS_APPLICATION = 2049; // OPUS_APPLICATION_AUDIO +const BUFFER_SIZE = 4096; + +let audioContext = new (window.AudioContext || window.webkitAudioContext)({ sampleRate: SAMPLE_RATE }); +let mediaStream, mediaSource, audioProcessor; +let recordedPcmData = []; // 存储原始PCM数据 +let recordedOpusData = []; // 存储Opus编码后的数据 +let opusEncoder, opusDecoder; +let isRecording = false; + +const startButton = document.getElementById("start"); +const stopButton = document.getElementById("stop"); +const playButton = document.getElementById("play"); +const statusLabel = document.getElementById("status"); + +startButton.addEventListener("click", startRecording); +stopButton.addEventListener("click", stopRecording); +playButton.addEventListener("click", playRecording); + +// 初始化Opus编码器与解码器 +async function initOpus() { + if (typeof window.ModuleInstance === 'undefined') { + if (typeof Module !== 'undefined') { + // 尝试使用全局Module + window.ModuleInstance = Module; + console.log('使用全局Module作为ModuleInstance'); + } else { + console.error("Opus库未加载,ModuleInstance和Module对象都不存在"); + return false; + } + } + + try { + const mod = window.ModuleInstance; + + // 创建编码器 + opusEncoder = { + channels: CHANNELS, + sampleRate: SAMPLE_RATE, + frameSize: FRAME_SIZE, + maxPacketSize: 4000, + module: mod, + + // 初始化编码器 + init: function() { + // 获取编码器大小 + const encoderSize = mod._opus_encoder_get_size(this.channels); + console.log(`Opus编码器大小: ${encoderSize}字节`); + + // 分配内存 + this.encoderPtr = mod._malloc(encoderSize); + if (!this.encoderPtr) { + throw new Error("无法分配编码器内存"); + } + + // 初始化编码器 + const err = mod._opus_encoder_init( + this.encoderPtr, + this.sampleRate, + this.channels, + OPUS_APPLICATION + ); + + if (err < 0) { + throw new Error(`Opus编码器初始化失败: ${err}`); + } + + return true; + }, + + // 编码方法 + encode: function(pcmData) { + const mod = this.module; + + // 为PCM数据分配内存 + const pcmPtr = mod._malloc(pcmData.length * 2); // Int16 = 2字节 + + // 将数据复制到WASM内存 + for (let i = 0; i < pcmData.length; i++) { + mod.HEAP16[(pcmPtr >> 1) + i] = pcmData[i]; + } + + // 为Opus编码数据分配内存 + const maxEncodedSize = this.maxPacketSize; + const encodedPtr = mod._malloc(maxEncodedSize); + + // 编码 + const encodedBytes = mod._opus_encode( + this.encoderPtr, + pcmPtr, + this.frameSize, + encodedPtr, + maxEncodedSize + ); + + if (encodedBytes < 0) { + mod._free(pcmPtr); + mod._free(encodedPtr); + throw new Error(`Opus编码失败: ${encodedBytes}`); + } + + // 复制编码后的数据 + const encodedData = new Uint8Array(encodedBytes); + for (let i = 0; i < encodedBytes; i++) { + encodedData[i] = mod.HEAPU8[encodedPtr + i]; + } + + // 释放内存 + mod._free(pcmPtr); + mod._free(encodedPtr); + + return encodedData; + }, + + // 销毁方法 + destroy: function() { + if (this.encoderPtr) { + this.module._free(this.encoderPtr); + this.encoderPtr = null; + } + } + }; + + // 创建解码器 + opusDecoder = { + channels: CHANNELS, + rate: SAMPLE_RATE, + frameSize: FRAME_SIZE, + module: mod, + + // 初始化解码器 + init: function() { + // 获取解码器大小 + const decoderSize = mod._opus_decoder_get_size(this.channels); + console.log(`Opus解码器大小: ${decoderSize}字节`); + + // 分配内存 + this.decoderPtr = mod._malloc(decoderSize); + if (!this.decoderPtr) { + throw new Error("无法分配解码器内存"); + } + + // 初始化解码器 + const err = mod._opus_decoder_init( + this.decoderPtr, + this.rate, + this.channels + ); + + if (err < 0) { + throw new Error(`Opus解码器初始化失败: ${err}`); + } + + return true; + }, + + // 解码方法 + decode: function(opusData) { + const mod = this.module; + + // 为Opus数据分配内存 + const opusPtr = mod._malloc(opusData.length); + mod.HEAPU8.set(opusData, opusPtr); + + // 为PCM输出分配内存 + const pcmPtr = mod._malloc(this.frameSize * 2); // Int16 = 2字节 + + // 解码 + const decodedSamples = mod._opus_decode( + this.decoderPtr, + opusPtr, + opusData.length, + pcmPtr, + this.frameSize, + 0 // 不使用FEC + ); + + if (decodedSamples < 0) { + mod._free(opusPtr); + mod._free(pcmPtr); + throw new Error(`Opus解码失败: ${decodedSamples}`); + } + + // 复制解码后的数据 + const decodedData = new Int16Array(decodedSamples); + for (let i = 0; i < decodedSamples; i++) { + decodedData[i] = mod.HEAP16[(pcmPtr >> 1) + i]; + } + + // 释放内存 + mod._free(opusPtr); + mod._free(pcmPtr); + + return decodedData; + }, + + // 销毁方法 + destroy: function() { + if (this.decoderPtr) { + this.module._free(this.decoderPtr); + this.decoderPtr = null; + } + } + }; + + // 初始化编码器和解码器 + if (opusEncoder.init() && opusDecoder.init()) { + console.log("Opus 编码器和解码器初始化成功。"); + return true; + } else { + console.error("Opus 初始化失败"); + return false; + } + } catch (error) { + console.error("Opus 初始化失败:", error); + return false; + } +} + +// 将Float32音频数据转换为Int16音频数据 +function convertFloat32ToInt16(float32Data) { + const int16Data = new Int16Array(float32Data.length); + for (let i = 0; i < float32Data.length; i++) { + // 将[-1,1]范围转换为[-32768,32767] + const s = Math.max(-1, Math.min(1, float32Data[i])); + int16Data[i] = s < 0 ? s * 0x8000 : s * 0x7FFF; + } + return int16Data; +} + +// 将Int16音频数据转换为Float32音频数据 +function convertInt16ToFloat32(int16Data) { + const float32Data = new Float32Array(int16Data.length); + for (let i = 0; i < int16Data.length; i++) { + // 将[-32768,32767]范围转换为[-1,1] + float32Data[i] = int16Data[i] / (int16Data[i] < 0 ? 0x8000 : 0x7FFF); + } + return float32Data; +} + +function startRecording() { + if (isRecording) return; + + // 确保有权限并且AudioContext是活跃的 + if (audioContext.state === 'suspended') { + audioContext.resume().then(() => { + console.log("AudioContext已恢复"); + continueStartRecording(); + }).catch(err => { + console.error("恢复AudioContext失败:", err); + statusLabel.textContent = "无法激活音频上下文,请再次点击"; + }); + } else { + continueStartRecording(); + } +} + +// 实际开始录音的逻辑 +function continueStartRecording() { + // 重置录音数据 + recordedPcmData = []; + recordedOpusData = []; + window.audioDataBuffer = new Int16Array(0); // 重置缓冲区 + + // 初始化Opus + initOpus().then(success => { + if (!success) { + statusLabel.textContent = "Opus初始化失败"; + return; + } + + console.log("开始录音,参数:", { + sampleRate: SAMPLE_RATE, + channels: CHANNELS, + frameSize: FRAME_SIZE, + bufferSize: BUFFER_SIZE + }); + + // 请求麦克风权限 + navigator.mediaDevices.getUserMedia({ + audio: { + sampleRate: SAMPLE_RATE, + channelCount: CHANNELS, + echoCancellation: true, + noiseSuppression: true, + autoGainControl: true + } + }) + .then(stream => { + console.log("获取到麦克风流,实际参数:", stream.getAudioTracks()[0].getSettings()); + + // 检查流是否有效 + if (!stream || !stream.getAudioTracks().length || !stream.getAudioTracks()[0].enabled) { + throw new Error("获取到的音频流无效"); + } + + mediaStream = stream; + mediaSource = audioContext.createMediaStreamSource(stream); + + // 创建ScriptProcessor(虽然已弃用,但兼容性好) + // 在降级到ScriptProcessor之前尝试使用AudioWorklet + createAudioProcessor().then(processor => { + if (processor) { + console.log("使用AudioWorklet处理音频"); + audioProcessor = processor; + // 连接音频处理链 + mediaSource.connect(audioProcessor); + audioProcessor.connect(audioContext.destination); + } else { + console.log("回退到ScriptProcessor"); + // 创建ScriptProcessor节点 + audioProcessor = audioContext.createScriptProcessor(BUFFER_SIZE, CHANNELS, CHANNELS); + + // 处理音频数据 + audioProcessor.onaudioprocess = processAudioData; + + // 连接音频处理链 + mediaSource.connect(audioProcessor); + audioProcessor.connect(audioContext.destination); + } + + // 更新UI + isRecording = true; + statusLabel.textContent = "录音中..."; + startButton.disabled = true; + stopButton.disabled = false; + playButton.disabled = true; + }).catch(error => { + console.error("创建音频处理器失败:", error); + statusLabel.textContent = "创建音频处理器失败"; + }); + }) + .catch(error => { + console.error("获取麦克风失败:", error); + statusLabel.textContent = "获取麦克风失败: " + error.message; + }); + }); +} + +// 创建AudioWorklet处理器 +async function createAudioProcessor() { + try { + // 尝试使用更现代的AudioWorklet API + if ('AudioWorklet' in window && 'AudioWorkletNode' in window) { + // 定义AudioWorklet处理器代码 + const workletCode = ` + class OpusRecorderProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.buffers = []; + this.frameSize = ${FRAME_SIZE}; + this.buffer = new Float32Array(this.frameSize); + this.bufferIndex = 0; + this.isRecording = false; + + this.port.onmessage = (event) => { + if (event.data.command === 'start') { + this.isRecording = true; + } else if (event.data.command === 'stop') { + this.isRecording = false; + // 发送最后的缓冲区 + if (this.bufferIndex > 0) { + const finalBuffer = this.buffer.slice(0, this.bufferIndex); + this.port.postMessage({ buffer: finalBuffer }); + } + } + }; + } + + process(inputs, outputs) { + if (!this.isRecording) return true; + + // 获取输入数据 + const input = inputs[0][0]; // mono channel + if (!input || input.length === 0) return true; + + // 将输入数据添加到缓冲区 + for (let i = 0; i < input.length; i++) { + this.buffer[this.bufferIndex++] = input[i]; + + // 当缓冲区填满时,发送给主线程 + if (this.bufferIndex >= this.frameSize) { + this.port.postMessage({ buffer: this.buffer.slice() }); + this.bufferIndex = 0; + } + } + + return true; + } + } + + registerProcessor('opus-recorder-processor', OpusRecorderProcessor); + `; + + // 创建Blob URL + const blob = new Blob([workletCode], { type: 'application/javascript' }); + const url = URL.createObjectURL(blob); + + // 加载AudioWorklet模块 + await audioContext.audioWorklet.addModule(url); + + // 创建AudioWorkletNode + const workletNode = new AudioWorkletNode(audioContext, 'opus-recorder-processor'); + + // 处理从AudioWorklet接收的消息 + workletNode.port.onmessage = (event) => { + if (event.data.buffer) { + // 使用与ScriptProcessor相同的处理逻辑 + processAudioData({ + inputBuffer: { + getChannelData: () => event.data.buffer + } + }); + } + }; + + // 启动录音 + workletNode.port.postMessage({ command: 'start' }); + + // 保存停止函数 + workletNode.stopRecording = () => { + workletNode.port.postMessage({ command: 'stop' }); + }; + + console.log("AudioWorklet 音频处理器创建成功"); + return workletNode; + } + } catch (error) { + console.error("创建AudioWorklet失败,将使用ScriptProcessor:", error); + } + + // 如果AudioWorklet不可用或失败,返回null以便回退到ScriptProcessor + return null; +} + +// 处理音频数据 +function processAudioData(e) { + // 获取输入缓冲区 + const inputBuffer = e.inputBuffer; + + // 获取第一个通道的Float32数据 + const inputData = inputBuffer.getChannelData(0); + + // 添加调试信息 + const nonZeroCount = Array.from(inputData).filter(x => Math.abs(x) > 0.001).length; + console.log(`接收到音频数据: ${inputData.length} 个样本, 非零样本数: ${nonZeroCount}`); + + // 如果全是0,可能是麦克风没有正确获取声音 + if (nonZeroCount < 5) { + console.warn("警告: 检测到大量静音样本,请检查麦克风是否正常工作"); + // 继续处理,以防有些样本确实是静音 + } + + // 存储PCM数据用于调试 + recordedPcmData.push(new Float32Array(inputData)); + + // 转换为Int16数据供Opus编码 + const int16Data = convertFloat32ToInt16(inputData); + + // 如果收集到的数据不是FRAME_SIZE的整数倍,需要进行处理 + // 创建静态缓冲区来存储不足一帧的数据 + if (!window.audioDataBuffer) { + window.audioDataBuffer = new Int16Array(0); + } + + // 合并之前缓存的数据和新数据 + const combinedData = new Int16Array(window.audioDataBuffer.length + int16Data.length); + combinedData.set(window.audioDataBuffer); + combinedData.set(int16Data, window.audioDataBuffer.length); + + // 处理完整帧 + const frameCount = Math.floor(combinedData.length / FRAME_SIZE); + console.log(`可编码的完整帧数: ${frameCount}, 缓冲区总大小: ${combinedData.length}`); + + for (let i = 0; i < frameCount; i++) { + const frameData = combinedData.subarray(i * FRAME_SIZE, (i + 1) * FRAME_SIZE); + + try { + console.log(`编码第 ${i+1}/${frameCount} 帧, 帧大小: ${frameData.length}`); + const encodedData = opusEncoder.encode(frameData); + if (encodedData) { + console.log(`编码成功: ${encodedData.length} 字节`); + recordedOpusData.push(encodedData); + } + } catch (error) { + console.error(`Opus编码帧 ${i+1} 失败:`, error); + } + } + + // 保存剩余不足一帧的数据 + const remainingSamples = combinedData.length % FRAME_SIZE; + if (remainingSamples > 0) { + window.audioDataBuffer = combinedData.subarray(frameCount * FRAME_SIZE); + console.log(`保留 ${remainingSamples} 个样本到下一次处理`); + } else { + window.audioDataBuffer = new Int16Array(0); + } +} + +function stopRecording() { + if (!isRecording) return; + + // 处理剩余的缓冲数据 + if (window.audioDataBuffer && window.audioDataBuffer.length > 0) { + console.log(`停止录音,处理剩余的 ${window.audioDataBuffer.length} 个样本`); + // 如果剩余数据不足一帧,可以通过补零的方式凑成一帧 + if (window.audioDataBuffer.length < FRAME_SIZE) { + const paddedFrame = new Int16Array(FRAME_SIZE); + paddedFrame.set(window.audioDataBuffer); + // 剩余部分填充为0 + for (let i = window.audioDataBuffer.length; i < FRAME_SIZE; i++) { + paddedFrame[i] = 0; + } + try { + console.log(`编码最后一帧(补零): ${paddedFrame.length} 样本`); + const encodedData = opusEncoder.encode(paddedFrame); + if (encodedData) { + recordedOpusData.push(encodedData); + } + } catch (error) { + console.error("最后一帧Opus编码失败:", error); + } + } else { + // 如果数据超过一帧,按正常流程处理 + processAudioData({ + inputBuffer: { + getChannelData: () => convertInt16ToFloat32(window.audioDataBuffer) + } + }); + } + window.audioDataBuffer = null; + } + + // 如果使用的是AudioWorklet,调用其特定的停止方法 + if (audioProcessor && typeof audioProcessor.stopRecording === 'function') { + audioProcessor.stopRecording(); + } + + // 停止麦克风 + if (mediaStream) { + mediaStream.getTracks().forEach(track => track.stop()); + } + + // 断开音频处理链 + if (audioProcessor) { + try { + audioProcessor.disconnect(); + if (mediaSource) mediaSource.disconnect(); + } catch (error) { + console.warn("断开音频处理链时出错:", error); + } + } + + // 更新UI + isRecording = false; + statusLabel.textContent = "已停止录音,收集了 " + recordedOpusData.length + " 帧Opus数据"; + startButton.disabled = false; + stopButton.disabled = true; + playButton.disabled = recordedOpusData.length === 0; + + console.log("录制完成:", + "PCM帧数:", recordedPcmData.length, + "Opus帧数:", recordedOpusData.length); +} + +function playRecording() { + if (!recordedOpusData.length) { + statusLabel.textContent = "没有可播放的录音"; + return; + } + + // 将所有Opus数据解码为PCM + let allDecodedData = []; + + for (const opusData of recordedOpusData) { + try { + // 解码为Int16数据 + const decodedData = opusDecoder.decode(opusData); + + if (decodedData && decodedData.length > 0) { + // 将Int16数据转换为Float32 + const float32Data = convertInt16ToFloat32(decodedData); + + // 添加到总解码数据中 + allDecodedData.push(...float32Data); + } + } catch (error) { + console.error("Opus解码失败:", error); + } + } + + // 如果没有解码出数据,返回 + if (allDecodedData.length === 0) { + statusLabel.textContent = "解码失败,无法播放"; + return; + } + + // 创建音频缓冲区 + const audioBuffer = audioContext.createBuffer(CHANNELS, allDecodedData.length, SAMPLE_RATE); + audioBuffer.copyToChannel(new Float32Array(allDecodedData), 0); + + // 创建音频源并播放 + const source = audioContext.createBufferSource(); + source.buffer = audioBuffer; + source.connect(audioContext.destination); + source.start(); + + // 更新UI + statusLabel.textContent = "正在播放..."; + playButton.disabled = true; + + // 播放结束后恢复UI + source.onended = () => { + statusLabel.textContent = "播放完毕"; + playButton.disabled = false; + }; +} + +// 模拟服务端返回的Opus数据进行解码播放 +function playOpusFromServer(opusData) { + // 这个函数展示如何处理服务端返回的opus数据 + // opusData应该是一个包含opus帧的数组 + + if (!opusDecoder) { + initOpus().then(success => { + if (success) { + decodeAndPlayOpusData(opusData); + } else { + statusLabel.textContent = "Opus解码器初始化失败"; + } + }); + } else { + decodeAndPlayOpusData(opusData); + } +} + +function decodeAndPlayOpusData(opusData) { + let allDecodedData = []; + + for (const frame of opusData) { + try { + const decodedData = opusDecoder.decode(frame); + if (decodedData && decodedData.length > 0) { + const float32Data = convertInt16ToFloat32(decodedData); + allDecodedData.push(...float32Data); + } + } catch (error) { + console.error("服务端Opus数据解码失败:", error); + } + } + + if (allDecodedData.length === 0) { + statusLabel.textContent = "服务端数据解码失败"; + return; + } + + const audioBuffer = audioContext.createBuffer(CHANNELS, allDecodedData.length, SAMPLE_RATE); + audioBuffer.copyToChannel(new Float32Array(allDecodedData), 0); + + const source = audioContext.createBufferSource(); + source.buffer = audioBuffer; + source.connect(audioContext.destination); + source.start(); + + statusLabel.textContent = "正在播放服务端数据..."; + source.onended = () => statusLabel.textContent = "服务端数据播放完毕"; +} diff --git a/main/xiaozhi-server/test/opus_test/test.html b/main/xiaozhi-server/test/opus_test/test.html new file mode 100644 index 00000000..77d5c73b --- /dev/null +++ b/main/xiaozhi-server/test/opus_test/test.html @@ -0,0 +1,464 @@ + + + + + Opus 编解码测试 + + + +
+

Opus 编解码录音播放测试

+ +
正在加载Opus库...
+ +
+ + +

+ + + +

录音状态: 待机,正在初始化...

+ +
+ +
+
+ + + + + + + From a6f9f0d88c28d1f7dafd4ccaa8f74915e6f04fe4 Mon Sep 17 00:00:00 2001 From: huangjunsen0406 <951434130@qq.com> Date: Fri, 4 Apr 2025 16:43:14 +0800 Subject: [PATCH 20/66] =?UTF-8?q?feat(test):=20:sparkles:=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=AE=80=E5=8C=96=E7=89=88=E7=BD=91=E9=A1=B5=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/abbreviated_version/app.js | 1250 +++++++++++++++++ .../test/abbreviated_version/test.html | 503 +++++++ 2 files changed, 1753 insertions(+) create mode 100644 main/xiaozhi-server/test/abbreviated_version/app.js create mode 100644 main/xiaozhi-server/test/abbreviated_version/test.html diff --git a/main/xiaozhi-server/test/abbreviated_version/app.js b/main/xiaozhi-server/test/abbreviated_version/app.js new file mode 100644 index 00000000..59b75625 --- /dev/null +++ b/main/xiaozhi-server/test/abbreviated_version/app.js @@ -0,0 +1,1250 @@ +const SAMPLE_RATE = 16000; +const CHANNELS = 1; +const FRAME_SIZE = 960; // 对应于60ms帧大小 (16000Hz * 0.06s = 960 samples) +const OPUS_APPLICATION = 2049; // OPUS_APPLICATION_AUDIO +const BUFFER_SIZE = 4096; + +// WebSocket相关变量 +let websocket = null; +let isConnected = false; + +let audioContext = new (window.AudioContext || window.webkitAudioContext)({ sampleRate: SAMPLE_RATE }); +let mediaStream, mediaSource, audioProcessor; +let recordedPcmData = []; // 存储原始PCM数据 +let recordedOpusData = []; // 存储Opus编码后的数据 +let opusEncoder, opusDecoder; +let isRecording = false; + +const startButton = document.getElementById("start"); +const stopButton = document.getElementById("stop"); +const playButton = document.getElementById("play"); +const statusLabel = document.getElementById("status"); + +// 添加WebSocket界面元素引用 +const connectButton = document.getElementById("connectButton") || document.createElement("button"); +const serverUrlInput = document.getElementById("serverUrl") || document.createElement("input"); +const connectionStatus = document.getElementById("connectionStatus") || document.createElement("span"); +const sendTextButton = document.getElementById("sendTextButton") || document.createElement("button"); +const messageInput = document.getElementById("messageInput") || document.createElement("input"); +const conversationDiv = document.getElementById("conversation") || document.createElement("div"); + +// 添加连接和发送事件监听 +if(connectButton.id === "connectButton") { + connectButton.addEventListener("click", connectToServer); +} +if(sendTextButton.id === "sendTextButton") { + sendTextButton.addEventListener("click", sendTextMessage); +} + +startButton.addEventListener("click", startRecording); +stopButton.addEventListener("click", stopRecording); +playButton.addEventListener("click", playRecording); + +// 音频缓冲和播放管理 +let audioBufferQueue = []; // 存储接收到的音频包 +let isAudioBuffering = false; // 是否正在缓冲音频 +let isAudioPlaying = false; // 是否正在播放音频 +const BUFFER_THRESHOLD = 3; // 缓冲包数量阈值,至少累积5个包再开始播放 +const MIN_AUDIO_DURATION = 0.1; // 最小音频长度(秒),小于这个长度的音频会被合并 +let streamingContext = null; // 音频流上下文 + +// 初始化Opus编码器与解码器 +async function initOpus() { + if (typeof window.ModuleInstance === 'undefined') { + if (typeof Module !== 'undefined') { + // 尝试使用全局Module + window.ModuleInstance = Module; + console.log('使用全局Module作为ModuleInstance'); + } else { + console.error("Opus库未加载,ModuleInstance和Module对象都不存在"); + return false; + } + } + + try { + const mod = window.ModuleInstance; + + // 创建编码器 + opusEncoder = { + channels: CHANNELS, + sampleRate: SAMPLE_RATE, + frameSize: FRAME_SIZE, + maxPacketSize: 4000, + module: mod, + + // 初始化编码器 + init: function() { + // 获取编码器大小 + const encoderSize = mod._opus_encoder_get_size(this.channels); + console.log(`Opus编码器大小: ${encoderSize}字节`); + + // 分配内存 + this.encoderPtr = mod._malloc(encoderSize); + if (!this.encoderPtr) { + throw new Error("无法分配编码器内存"); + } + + // 初始化编码器 + const err = mod._opus_encoder_init( + this.encoderPtr, + this.sampleRate, + this.channels, + OPUS_APPLICATION + ); + + if (err < 0) { + throw new Error(`Opus编码器初始化失败: ${err}`); + } + + return true; + }, + + // 编码方法 + encode: function(pcmData) { + const mod = this.module; + + // 为PCM数据分配内存 + const pcmPtr = mod._malloc(pcmData.length * 2); // Int16 = 2字节 + + // 将数据复制到WASM内存 + for (let i = 0; i < pcmData.length; i++) { + mod.HEAP16[(pcmPtr >> 1) + i] = pcmData[i]; + } + + // 为Opus编码数据分配内存 + const maxEncodedSize = this.maxPacketSize; + const encodedPtr = mod._malloc(maxEncodedSize); + + // 编码 + const encodedBytes = mod._opus_encode( + this.encoderPtr, + pcmPtr, + this.frameSize, + encodedPtr, + maxEncodedSize + ); + + if (encodedBytes < 0) { + mod._free(pcmPtr); + mod._free(encodedPtr); + throw new Error(`Opus编码失败: ${encodedBytes}`); + } + + // 复制编码后的数据 + const encodedData = new Uint8Array(encodedBytes); + for (let i = 0; i < encodedBytes; i++) { + encodedData[i] = mod.HEAPU8[encodedPtr + i]; + } + + // 释放内存 + mod._free(pcmPtr); + mod._free(encodedPtr); + + return encodedData; + }, + + // 销毁方法 + destroy: function() { + if (this.encoderPtr) { + this.module._free(this.encoderPtr); + this.encoderPtr = null; + } + } + }; + + // 创建解码器 + opusDecoder = { + channels: CHANNELS, + rate: SAMPLE_RATE, + frameSize: FRAME_SIZE, + module: mod, + + // 初始化解码器 + init: function() { + // 获取解码器大小 + const decoderSize = mod._opus_decoder_get_size(this.channels); + console.log(`Opus解码器大小: ${decoderSize}字节`); + + // 分配内存 + this.decoderPtr = mod._malloc(decoderSize); + if (!this.decoderPtr) { + throw new Error("无法分配解码器内存"); + } + + // 初始化解码器 + const err = mod._opus_decoder_init( + this.decoderPtr, + this.rate, + this.channels + ); + + if (err < 0) { + throw new Error(`Opus解码器初始化失败: ${err}`); + } + + return true; + }, + + // 解码方法 + decode: function(opusData) { + const mod = this.module; + + // 为Opus数据分配内存 + const opusPtr = mod._malloc(opusData.length); + mod.HEAPU8.set(opusData, opusPtr); + + // 为PCM输出分配内存 + const pcmPtr = mod._malloc(this.frameSize * 2); // Int16 = 2字节 + + // 解码 + const decodedSamples = mod._opus_decode( + this.decoderPtr, + opusPtr, + opusData.length, + pcmPtr, + this.frameSize, + 0 // 不使用FEC + ); + + if (decodedSamples < 0) { + mod._free(opusPtr); + mod._free(pcmPtr); + throw new Error(`Opus解码失败: ${decodedSamples}`); + } + + // 复制解码后的数据 + const decodedData = new Int16Array(decodedSamples); + for (let i = 0; i < decodedSamples; i++) { + decodedData[i] = mod.HEAP16[(pcmPtr >> 1) + i]; + } + + // 释放内存 + mod._free(opusPtr); + mod._free(pcmPtr); + + return decodedData; + }, + + // 销毁方法 + destroy: function() { + if (this.decoderPtr) { + this.module._free(this.decoderPtr); + this.decoderPtr = null; + } + } + }; + + // 初始化编码器和解码器 + if (opusEncoder.init() && opusDecoder.init()) { + console.log("Opus 编码器和解码器初始化成功。"); + return true; + } else { + console.error("Opus 初始化失败"); + return false; + } + } catch (error) { + console.error("Opus 初始化失败:", error); + return false; + } +} + +// 将Float32音频数据转换为Int16音频数据 +function convertFloat32ToInt16(float32Data) { + const int16Data = new Int16Array(float32Data.length); + for (let i = 0; i < float32Data.length; i++) { + // 将[-1,1]范围转换为[-32768,32767] + const s = Math.max(-1, Math.min(1, float32Data[i])); + int16Data[i] = s < 0 ? s * 0x8000 : s * 0x7FFF; + } + return int16Data; +} + +// 将Int16音频数据转换为Float32音频数据 +function convertInt16ToFloat32(int16Data) { + const float32Data = new Float32Array(int16Data.length); + for (let i = 0; i < int16Data.length; i++) { + // 将[-32768,32767]范围转换为[-1,1] + float32Data[i] = int16Data[i] / (int16Data[i] < 0 ? 0x8000 : 0x7FFF); + } + return float32Data; +} + +function startRecording() { + if (isRecording) return; + + // 确保有权限并且AudioContext是活跃的 + if (audioContext.state === 'suspended') { + audioContext.resume().then(() => { + console.log("AudioContext已恢复"); + continueStartRecording(); + }).catch(err => { + console.error("恢复AudioContext失败:", err); + statusLabel.textContent = "无法激活音频上下文,请再次点击"; + }); + } else { + continueStartRecording(); + } +} + +// 实际开始录音的逻辑 +function continueStartRecording() { + // 重置录音数据 + recordedPcmData = []; + recordedOpusData = []; + window.audioDataBuffer = new Int16Array(0); // 重置缓冲区 + + // 初始化Opus + initOpus().then(success => { + if (!success) { + statusLabel.textContent = "Opus初始化失败"; + return; + } + + console.log("开始录音,参数:", { + sampleRate: SAMPLE_RATE, + channels: CHANNELS, + frameSize: FRAME_SIZE, + bufferSize: BUFFER_SIZE + }); + + // 如果WebSocket已连接,发送开始录音信号 + if (isConnected && websocket && websocket.readyState === WebSocket.OPEN) { + sendVoiceControlMessage('start'); + } + + // 请求麦克风权限 + navigator.mediaDevices.getUserMedia({ + audio: { + sampleRate: SAMPLE_RATE, + channelCount: CHANNELS, + echoCancellation: true, + noiseSuppression: true, + autoGainControl: true + } + }) + .then(stream => { + console.log("获取到麦克风流,实际参数:", stream.getAudioTracks()[0].getSettings()); + + // 检查流是否有效 + if (!stream || !stream.getAudioTracks().length || !stream.getAudioTracks()[0].enabled) { + throw new Error("获取到的音频流无效"); + } + + mediaStream = stream; + mediaSource = audioContext.createMediaStreamSource(stream); + + // 创建ScriptProcessor(虽然已弃用,但兼容性好) + // 在降级到ScriptProcessor之前尝试使用AudioWorklet + createAudioProcessor().then(processor => { + if (processor) { + console.log("使用AudioWorklet处理音频"); + audioProcessor = processor; + // 连接音频处理链 + mediaSource.connect(audioProcessor); + audioProcessor.connect(audioContext.destination); + } else { + console.log("回退到ScriptProcessor"); + // 创建ScriptProcessor节点 + audioProcessor = audioContext.createScriptProcessor(BUFFER_SIZE, CHANNELS, CHANNELS); + + // 处理音频数据 + audioProcessor.onaudioprocess = processAudioData; + + // 连接音频处理链 + mediaSource.connect(audioProcessor); + audioProcessor.connect(audioContext.destination); + } + + // 更新UI + isRecording = true; + statusLabel.textContent = "录音中..."; + startButton.disabled = true; + stopButton.disabled = false; + playButton.disabled = true; + }).catch(error => { + console.error("创建音频处理器失败:", error); + statusLabel.textContent = "创建音频处理器失败"; + }); + }) + .catch(error => { + console.error("获取麦克风失败:", error); + statusLabel.textContent = "获取麦克风失败: " + error.message; + }); + }); +} + +// 创建AudioWorklet处理器 +async function createAudioProcessor() { + try { + // 尝试使用更现代的AudioWorklet API + if ('AudioWorklet' in window && 'AudioWorkletNode' in window) { + // 定义AudioWorklet处理器代码 + const workletCode = ` + class OpusRecorderProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.buffers = []; + this.frameSize = ${FRAME_SIZE}; + this.buffer = new Float32Array(this.frameSize); + this.bufferIndex = 0; + this.isRecording = false; + + this.port.onmessage = (event) => { + if (event.data.command === 'start') { + this.isRecording = true; + } else if (event.data.command === 'stop') { + this.isRecording = false; + // 发送最后的缓冲区 + if (this.bufferIndex > 0) { + const finalBuffer = this.buffer.slice(0, this.bufferIndex); + this.port.postMessage({ buffer: finalBuffer }); + } + } + }; + } + + process(inputs, outputs) { + if (!this.isRecording) return true; + + // 获取输入数据 + const input = inputs[0][0]; // mono channel + if (!input || input.length === 0) return true; + + // 将输入数据添加到缓冲区 + for (let i = 0; i < input.length; i++) { + this.buffer[this.bufferIndex++] = input[i]; + + // 当缓冲区填满时,发送给主线程 + if (this.bufferIndex >= this.frameSize) { + this.port.postMessage({ buffer: this.buffer.slice() }); + this.bufferIndex = 0; + } + } + + return true; + } + } + + registerProcessor('opus-recorder-processor', OpusRecorderProcessor); + `; + + // 创建Blob URL + const blob = new Blob([workletCode], { type: 'application/javascript' }); + const url = URL.createObjectURL(blob); + + // 加载AudioWorklet模块 + await audioContext.audioWorklet.addModule(url); + + // 创建AudioWorkletNode + const workletNode = new AudioWorkletNode(audioContext, 'opus-recorder-processor'); + + // 处理从AudioWorklet接收的消息 + workletNode.port.onmessage = (event) => { + if (event.data.buffer) { + // 使用与ScriptProcessor相同的处理逻辑 + processAudioData({ + inputBuffer: { + getChannelData: () => event.data.buffer + } + }); + } + }; + + // 启动录音 + workletNode.port.postMessage({ command: 'start' }); + + // 保存停止函数 + workletNode.stopRecording = () => { + workletNode.port.postMessage({ command: 'stop' }); + }; + + console.log("AudioWorklet 音频处理器创建成功"); + return workletNode; + } + } catch (error) { + console.error("创建AudioWorklet失败,将使用ScriptProcessor:", error); + } + + // 如果AudioWorklet不可用或失败,返回null以便回退到ScriptProcessor + return null; +} + +// 处理音频数据 +function processAudioData(e) { + // 获取输入缓冲区 + const inputBuffer = e.inputBuffer; + + // 获取第一个通道的Float32数据 + const inputData = inputBuffer.getChannelData(0); + + // 添加调试信息 + const nonZeroCount = Array.from(inputData).filter(x => Math.abs(x) > 0.001).length; + console.log(`接收到音频数据: ${inputData.length} 个样本, 非零样本数: ${nonZeroCount}`); + + // 如果全是0,可能是麦克风没有正确获取声音 + if (nonZeroCount < 5) { + console.warn("警告: 检测到大量静音样本,请检查麦克风是否正常工作"); + // 继续处理,以防有些样本确实是静音 + } + + // 存储PCM数据用于调试 + recordedPcmData.push(new Float32Array(inputData)); + + // 转换为Int16数据供Opus编码 + const int16Data = convertFloat32ToInt16(inputData); + + // 如果收集到的数据不是FRAME_SIZE的整数倍,需要进行处理 + // 创建静态缓冲区来存储不足一帧的数据 + if (!window.audioDataBuffer) { + window.audioDataBuffer = new Int16Array(0); + } + + // 合并之前缓存的数据和新数据 + const combinedData = new Int16Array(window.audioDataBuffer.length + int16Data.length); + combinedData.set(window.audioDataBuffer); + combinedData.set(int16Data, window.audioDataBuffer.length); + + // 处理完整帧 + const frameCount = Math.floor(combinedData.length / FRAME_SIZE); + console.log(`可编码的完整帧数: ${frameCount}, 缓冲区总大小: ${combinedData.length}`); + + for (let i = 0; i < frameCount; i++) { + const frameData = combinedData.subarray(i * FRAME_SIZE, (i + 1) * FRAME_SIZE); + + try { + console.log(`编码第 ${i+1}/${frameCount} 帧, 帧大小: ${frameData.length}`); + const encodedData = opusEncoder.encode(frameData); + if (encodedData) { + console.log(`编码成功: ${encodedData.length} 字节`); + recordedOpusData.push(encodedData); + + // 如果WebSocket已连接,发送编码后的数据 + if (isConnected && websocket && websocket.readyState === WebSocket.OPEN) { + sendOpusDataToServer(encodedData); + } + } + } catch (error) { + console.error(`Opus编码帧 ${i+1} 失败:`, error); + } + } + + // 保存剩余不足一帧的数据 + const remainingSamples = combinedData.length % FRAME_SIZE; + if (remainingSamples > 0) { + window.audioDataBuffer = combinedData.subarray(frameCount * FRAME_SIZE); + console.log(`保留 ${remainingSamples} 个样本到下一次处理`); + } else { + window.audioDataBuffer = new Int16Array(0); + } +} + +function stopRecording() { + if (!isRecording) return; + + // 处理剩余的缓冲数据 + if (window.audioDataBuffer && window.audioDataBuffer.length > 0) { + console.log(`停止录音,处理剩余的 ${window.audioDataBuffer.length} 个样本`); + // 如果剩余数据不足一帧,可以通过补零的方式凑成一帧 + if (window.audioDataBuffer.length < FRAME_SIZE) { + const paddedFrame = new Int16Array(FRAME_SIZE); + paddedFrame.set(window.audioDataBuffer); + // 剩余部分填充为0 + for (let i = window.audioDataBuffer.length; i < FRAME_SIZE; i++) { + paddedFrame[i] = 0; + } + try { + console.log(`编码最后一帧(补零): ${paddedFrame.length} 样本`); + const encodedData = opusEncoder.encode(paddedFrame); + if (encodedData) { + recordedOpusData.push(encodedData); + + // 如果WebSocket已连接,发送最后一帧 + if (isConnected && websocket && websocket.readyState === WebSocket.OPEN) { + sendOpusDataToServer(encodedData); + } + } + } catch (error) { + console.error("最后一帧Opus编码失败:", error); + } + } else { + // 如果数据超过一帧,按正常流程处理 + processAudioData({ + inputBuffer: { + getChannelData: () => convertInt16ToFloat32(window.audioDataBuffer) + } + }); + } + window.audioDataBuffer = null; + } + + // 如果WebSocket已连接,发送停止录音信号 + if (isConnected && websocket && websocket.readyState === WebSocket.OPEN) { + // 发送一个空帧作为结束标记 + const emptyFrame = new Uint8Array(0); + websocket.send(emptyFrame); + + // 发送停止录音控制消息 + sendVoiceControlMessage('stop'); + } + + // 如果使用的是AudioWorklet,调用其特定的停止方法 + if (audioProcessor && typeof audioProcessor.stopRecording === 'function') { + audioProcessor.stopRecording(); + } + + // 停止麦克风 + if (mediaStream) { + mediaStream.getTracks().forEach(track => track.stop()); + } + + // 断开音频处理链 + if (audioProcessor) { + try { + audioProcessor.disconnect(); + if (mediaSource) mediaSource.disconnect(); + } catch (error) { + console.warn("断开音频处理链时出错:", error); + } + } + + // 更新UI + isRecording = false; + statusLabel.textContent = "已停止录音,收集了 " + recordedOpusData.length + " 帧Opus数据"; + startButton.disabled = false; + stopButton.disabled = true; + playButton.disabled = recordedOpusData.length === 0; + + console.log("录制完成:", + "PCM帧数:", recordedPcmData.length, + "Opus帧数:", recordedOpusData.length); +} + +function playRecording() { + if (!recordedOpusData.length) { + statusLabel.textContent = "没有可播放的录音"; + return; + } + + // 将所有Opus数据解码为PCM + let allDecodedData = []; + + for (const opusData of recordedOpusData) { + try { + // 解码为Int16数据 + const decodedData = opusDecoder.decode(opusData); + + if (decodedData && decodedData.length > 0) { + // 将Int16数据转换为Float32 + const float32Data = convertInt16ToFloat32(decodedData); + + // 添加到总解码数据中 + allDecodedData.push(...float32Data); + } + } catch (error) { + console.error("Opus解码失败:", error); + } + } + + // 如果没有解码出数据,返回 + if (allDecodedData.length === 0) { + statusLabel.textContent = "解码失败,无法播放"; + return; + } + + // 创建音频缓冲区 + const audioBuffer = audioContext.createBuffer(CHANNELS, allDecodedData.length, SAMPLE_RATE); + audioBuffer.copyToChannel(new Float32Array(allDecodedData), 0); + + // 创建音频源并播放 + const source = audioContext.createBufferSource(); + source.buffer = audioBuffer; + source.connect(audioContext.destination); + source.start(); + + // 更新UI + statusLabel.textContent = "正在播放..."; + playButton.disabled = true; + + // 播放结束后恢复UI + source.onended = () => { + statusLabel.textContent = "播放完毕"; + playButton.disabled = false; + }; +} + +// 处理二进制消息的修改版本 +async function handleBinaryMessage(data) { + try { + let arrayBuffer; + + // 根据数据类型进行处理 + if (data instanceof ArrayBuffer) { + arrayBuffer = data; + console.log(`收到ArrayBuffer音频数据,大小: ${data.byteLength}字节`); + } else if (data instanceof Blob) { + // 如果是Blob类型,转换为ArrayBuffer + arrayBuffer = await data.arrayBuffer(); + console.log(`收到Blob音频数据,大小: ${arrayBuffer.byteLength}字节`); + } else { + console.warn(`收到未知类型的二进制数据: ${typeof data}`); + return; + } + + // 创建Uint8Array用于处理 + const opusData = new Uint8Array(arrayBuffer); + + if (opusData.length > 0) { + // 将数据添加到缓冲队列 + audioBufferQueue.push(opusData); + + // 如果收到的是第一个音频包,开始缓冲过程 + if (audioBufferQueue.length === 1 && !isAudioBuffering && !isAudioPlaying) { + startAudioBuffering(); + } + } else { + console.warn('收到空音频数据帧,可能是结束标志'); + + // 如果缓冲队列中有数据且没有在播放,立即开始播放 + if (audioBufferQueue.length > 0 && !isAudioPlaying) { + playBufferedAudio(); + } + + // 如果正在播放,发送结束信号 + if (isAudioPlaying && streamingContext) { + streamingContext.endOfStream = true; + } + } + } catch (error) { + console.error(`处理二进制消息出错:`, error); + } +} + +// 开始音频缓冲过程 +function startAudioBuffering() { + if (isAudioBuffering || isAudioPlaying) return; + + isAudioBuffering = true; + console.log("开始音频缓冲..."); + + // 设置超时,如果在一定时间内没有收集到足够的音频包,就开始播放 + setTimeout(() => { + if (isAudioBuffering && audioBufferQueue.length > 0) { + console.log(`缓冲超时,当前缓冲包数: ${audioBufferQueue.length},开始播放`); + playBufferedAudio(); + } + }, 300); // 300ms超时 + + // 监控缓冲进度 + const bufferCheckInterval = setInterval(() => { + if (!isAudioBuffering) { + clearInterval(bufferCheckInterval); + return; + } + + // 当累积了足够的音频包,开始播放 + if (audioBufferQueue.length >= BUFFER_THRESHOLD) { + clearInterval(bufferCheckInterval); + console.log(`已缓冲 ${audioBufferQueue.length} 个音频包,开始播放`); + playBufferedAudio(); + } + }, 50); +} + +// 播放已缓冲的音频 +function playBufferedAudio() { + if (isAudioPlaying || audioBufferQueue.length === 0) return; + + isAudioPlaying = true; + isAudioBuffering = false; + + // 创建流式播放上下文 + if (!streamingContext) { + streamingContext = { + queue: [], // 已解码的PCM队列 + playing: false, // 是否正在播放 + endOfStream: false, // 是否收到结束信号 + source: null, // 当前音频源 + totalSamples: 0, // 累积的总样本数 + lastPlayTime: 0, // 上次播放的时间戳 + // 将Opus数据解码为PCM + decodeOpusFrames: async function(opusFrames) { + let decodedSamples = []; + + for (const frame of opusFrames) { + try { + // 使用Opus解码器解码 + const frameData = opusDecoder.decode(frame); + if (frameData && frameData.length > 0) { + // 转换为Float32 + const floatData = convertInt16ToFloat32(frameData); + decodedSamples.push(...floatData); + } + } catch (error) { + console.error("Opus解码失败:", error); + } + } + + if (decodedSamples.length > 0) { + // 添加到解码队列 + this.queue.push(...decodedSamples); + this.totalSamples += decodedSamples.length; + + // 如果累积了至少0.2秒的音频,开始播放 + const minSamples = SAMPLE_RATE * MIN_AUDIO_DURATION; + if (!this.playing && this.queue.length >= minSamples) { + this.startPlaying(); + } + } + }, + // 开始播放音频 + startPlaying: function() { + if (this.playing || this.queue.length === 0) return; + + this.playing = true; + + // 创建新的音频缓冲区 + const minPlaySamples = Math.min(this.queue.length, SAMPLE_RATE); // 最多播放1秒 + const currentSamples = this.queue.splice(0, minPlaySamples); + + const audioBuffer = audioContext.createBuffer(CHANNELS, currentSamples.length, SAMPLE_RATE); + audioBuffer.copyToChannel(new Float32Array(currentSamples), 0); + + // 创建音频源 + this.source = audioContext.createBufferSource(); + this.source.buffer = audioBuffer; + + // 创建增益节点用于平滑过渡 + const gainNode = audioContext.createGain(); + + // 应用淡入淡出效果避免爆音 + const fadeDuration = 0.02; // 20毫秒 + gainNode.gain.setValueAtTime(0, audioContext.currentTime); + gainNode.gain.linearRampToValueAtTime(1, audioContext.currentTime + fadeDuration); + + const duration = audioBuffer.duration; + if (duration > fadeDuration * 2) { + gainNode.gain.setValueAtTime(1, audioContext.currentTime + duration - fadeDuration); + gainNode.gain.linearRampToValueAtTime(0, audioContext.currentTime + duration); + } + + // 连接节点并开始播放 + this.source.connect(gainNode); + gainNode.connect(audioContext.destination); + + this.lastPlayTime = audioContext.currentTime; + console.log(`开始播放 ${currentSamples.length} 个样本,约 ${(currentSamples.length / SAMPLE_RATE).toFixed(2)} 秒`); + + // 播放结束后的处理 + this.source.onended = () => { + this.source = null; + this.playing = false; + + // 如果队列中还有数据或者缓冲区有新数据,继续播放 + if (this.queue.length > 0) { + setTimeout(() => this.startPlaying(), 10); + } else if (audioBufferQueue.length > 0) { + // 缓冲区有新数据,进行解码 + const frames = [...audioBufferQueue]; + audioBufferQueue = []; + this.decodeOpusFrames(frames); + } else if (this.endOfStream) { + // 流已结束且没有更多数据 + console.log("音频播放完成"); + isAudioPlaying = false; + streamingContext = null; + } else { + // 等待更多数据 + setTimeout(() => { + // 如果仍然没有新数据,但有更多的包到达 + if (this.queue.length === 0 && audioBufferQueue.length > 0) { + const frames = [...audioBufferQueue]; + audioBufferQueue = []; + this.decodeOpusFrames(frames); + } else if (this.queue.length === 0 && audioBufferQueue.length === 0) { + // 真的没有更多数据了 + console.log("音频播放完成 (超时)"); + isAudioPlaying = false; + streamingContext = null; + } + }, 500); // 500ms超时 + } + }; + + this.source.start(); + } + }; + } + + // 开始处理缓冲的数据 + const frames = [...audioBufferQueue]; + audioBufferQueue = []; // 清空缓冲队列 + + // 解码并播放 + streamingContext.decodeOpusFrames(frames); +} + +// 将旧的playOpusFromServer函数保留为备用方法 +function playOpusFromServerOld(opusData) { + if (!opusDecoder) { + initOpus().then(success => { + if (success) { + decodeAndPlayOpusDataOld(opusData); + } else { + statusLabel.textContent = "Opus解码器初始化失败"; + } + }); + } else { + decodeAndPlayOpusDataOld(opusData); + } +} + +// 旧的解码和播放函数作为备用 +function decodeAndPlayOpusDataOld(opusData) { + let allDecodedData = []; + + for (const frame of opusData) { + try { + const decodedData = opusDecoder.decode(frame); + if (decodedData && decodedData.length > 0) { + const float32Data = convertInt16ToFloat32(decodedData); + allDecodedData.push(...float32Data); + } + } catch (error) { + console.error("服务端Opus数据解码失败:", error); + } + } + + if (allDecodedData.length === 0) { + statusLabel.textContent = "服务端数据解码失败"; + return; + } + + const audioBuffer = audioContext.createBuffer(CHANNELS, allDecodedData.length, SAMPLE_RATE); + audioBuffer.copyToChannel(new Float32Array(allDecodedData), 0); + + const source = audioContext.createBufferSource(); + source.buffer = audioBuffer; + source.connect(audioContext.destination); + source.start(); + + statusLabel.textContent = "正在播放服务端数据..."; + source.onended = () => statusLabel.textContent = "服务端数据播放完毕"; +} + +// 更新playOpusFromServer函数为Promise版本 +function playOpusFromServer(opusData) { + // 为了兼容,我们将opusData添加到audioBufferQueue并触发播放 + if (Array.isArray(opusData) && opusData.length > 0) { + for (const frame of opusData) { + audioBufferQueue.push(frame); + } + + // 如果没有在播放和缓冲,启动流程 + if (!isAudioBuffering && !isAudioPlaying) { + startAudioBuffering(); + } + + return new Promise(resolve => { + // 我们无法准确知道何时播放完成,所以设置一个合理的超时 + setTimeout(resolve, 1000); // 1秒后认为已处理 + }); + } else { + // 如果不是数组或为空,使用旧方法 + return new Promise(resolve => { + playOpusFromServerOld(opusData); + setTimeout(resolve, 1000); + }); + } +} + +// 连接WebSocket服务器 +function connectToServer() { + let url = serverUrlInput.value || "ws://127.0.0.1:8000/xiaozhi/v1/"; + + try { + // 检查URL格式 + if (!url.startsWith('ws://') && !url.startsWith('wss://')) { + console.error('URL格式错误,必须以ws://或wss://开头'); + updateStatus('URL格式错误,必须以ws://或wss://开头', 'error'); + return; + } + + // 添加认证参数 + let connUrl = new URL(url); + connUrl.searchParams.append('device_id', 'web_test_device'); + connUrl.searchParams.append('device_mac', '00:11:22:33:44:55'); + + console.log(`正在连接: ${connUrl.toString()}`); + updateStatus(`正在连接: ${connUrl.toString()}`, 'info'); + + websocket = new WebSocket(connUrl.toString()); + + // 设置接收二进制数据的类型为ArrayBuffer + websocket.binaryType = 'arraybuffer'; + + websocket.onopen = async () => { + console.log(`已连接到服务器: ${url}`); + updateStatus(`已连接到服务器: ${url}`, 'success'); + isConnected = true; + + // 连接成功后发送hello消息 + await sendHelloMessage(); + + if(connectButton.id === "connectButton") { + connectButton.textContent = '断开'; + connectButton.onclick = disconnectFromServer; + } + + if(messageInput.id === "messageInput") { + messageInput.disabled = false; + } + + if(sendTextButton.id === "sendTextButton") { + sendTextButton.disabled = false; + } + }; + + websocket.onclose = () => { + console.log('已断开连接'); + updateStatus('已断开连接', 'info'); + isConnected = false; + + if(connectButton.id === "connectButton") { + connectButton.textContent = '连接'; + connectButton.onclick = connectToServer; + } + + if(messageInput.id === "messageInput") { + messageInput.disabled = true; + } + + if(sendTextButton.id === "sendTextButton") { + sendTextButton.disabled = true; + } + }; + + websocket.onerror = (error) => { + console.error(`WebSocket错误:`, error); + updateStatus(`WebSocket错误`, 'error'); + }; + + websocket.onmessage = function (event) { + try { + // 检查是否为文本消息 + if (typeof event.data === 'string') { + const message = JSON.parse(event.data); + handleTextMessage(message); + } else { + // 处理二进制数据 + handleBinaryMessage(event.data); + } + } catch (error) { + console.error(`WebSocket消息处理错误:`, error); + // 非JSON格式文本消息直接显示 + if (typeof event.data === 'string') { + addMessage(event.data); + } + } + }; + + updateStatus('正在连接...', 'info'); + } catch (error) { + console.error(`连接错误:`, error); + updateStatus(`连接失败: ${error.message}`, 'error'); + } +} + +// 断开WebSocket连接 +function disconnectFromServer() { + if (!websocket) return; + + websocket.close(); + if (isRecording) { + stopRecording(); + } +} + +// 发送hello握手消息 +async function sendHelloMessage() { + if (!websocket || websocket.readyState !== WebSocket.OPEN) return; + + try { + // 设置设备信息 + const helloMessage = { + type: 'hello', + device_id: 'web_test_device', + device_name: 'Web测试设备', + device_mac: '00:11:22:33:44:55', + token: 'your-token1' // 使用config.yaml中配置的token + }; + + console.log('发送hello握手消息'); + websocket.send(JSON.stringify(helloMessage)); + + // 等待服务器响应 + return new Promise(resolve => { + // 5秒超时 + const timeout = setTimeout(() => { + console.error('等待hello响应超时'); + resolve(false); + }, 5000); + + // 临时监听一次消息,接收hello响应 + const onMessageHandler = (event) => { + try { + const response = JSON.parse(event.data); + if (response.type === 'hello' && response.session_id) { + console.log(`服务器握手成功,会话ID: ${response.session_id}`); + clearTimeout(timeout); + websocket.removeEventListener('message', onMessageHandler); + resolve(true); + } + } catch (e) { + // 忽略非JSON消息 + } + }; + + websocket.addEventListener('message', onMessageHandler); + }); + } catch (error) { + console.error(`发送hello消息错误:`, error); + return false; + } +} + +// 发送文本消息 +function sendTextMessage() { + const message = messageInput ? messageInput.value.trim() : ""; + if (message === '' || !websocket || websocket.readyState !== WebSocket.OPEN) return; + + try { + // 发送listen消息 + const listenMessage = { + type: 'listen', + mode: 'manual', + state: 'detect', + text: message + }; + + websocket.send(JSON.stringify(listenMessage)); + addMessage(message, true); + console.log(`发送文本消息: ${message}`); + + if (messageInput) { + messageInput.value = ''; + } + } catch (error) { + console.error(`发送消息错误:`, error); + } +} + +// 添加消息到会话记录 +function addMessage(text, isUser = false) { + if (!conversationDiv) return; + + const messageDiv = document.createElement('div'); + messageDiv.className = `message ${isUser ? 'user' : 'server'}`; + messageDiv.textContent = text; + conversationDiv.appendChild(messageDiv); + conversationDiv.scrollTop = conversationDiv.scrollHeight; +} + +// 更新状态信息 +function updateStatus(message, type = 'info') { + console.log(`[${type}] ${message}`); + if (statusLabel) { + statusLabel.textContent = message; + } + if (connectionStatus) { + connectionStatus.textContent = message; + switch(type) { + case 'success': + connectionStatus.style.color = 'green'; + break; + case 'error': + connectionStatus.style.color = 'red'; + break; + case 'info': + default: + connectionStatus.style.color = 'black'; + break; + } + } +} + +// 处理文本消息 +function handleTextMessage(message) { + if (message.type === 'hello') { + console.log(`服务器回应:${message.message}`); + } else if (message.type === 'tts') { + // TTS状态消息 + if (message.state === 'start') { + console.log('服务器开始发送语音'); + } else if (message.state === 'sentence_start') { + console.log(`服务器发送语音段: ${message.text}`); + // 添加文本到会话记录 + if (message.text) { + addMessage(message.text); + } + } else if (message.state === 'sentence_end') { + console.log(`语音段结束: ${message.text}`); + } else if (message.state === 'stop') { + console.log('服务器语音传输结束'); + } + } else if (message.type === 'audio') { + // 音频控制消息 + console.log(`收到音频控制消息: ${JSON.stringify(message)}`); + } else if (message.type === 'stt') { + // 语音识别结果 + console.log(`识别结果: ${message.text}`); + // 添加识别结果到会话记录 + addMessage(`[语音识别] ${message.text}`, true); + } else if (message.type === 'llm') { + // 大模型回复 + console.log(`大模型回复: ${message.text}`); + // 添加大模型回复到会话记录 + if (message.text && message.text !== '😊') { + addMessage(message.text); + } + } else { + // 未知消息类型 + console.log(`未知消息类型: ${message.type}`); + addMessage(JSON.stringify(message, null, 2)); + } +} + +// 发送语音数据到WebSocket +function sendOpusDataToServer(opusData) { + if (!websocket || websocket.readyState !== WebSocket.OPEN) { + console.error('WebSocket未连接,无法发送音频数据'); + return false; + } + + try { + // 发送二进制数据 + websocket.send(opusData.buffer); + console.log(`已发送Opus音频数据: ${opusData.length}字节`); + return true; + } catch (error) { + console.error(`发送音频数据失败:`, error); + return false; + } +} + +// 发送语音开始和结束信号 +function sendVoiceControlMessage(state) { + if (!websocket || websocket.readyState !== WebSocket.OPEN) return; + + try { + const message = { + type: 'listen', + mode: 'manual', + state: state // 'start' 或 'stop' + }; + + websocket.send(JSON.stringify(message)); + console.log(`发送语音${state === 'start' ? '开始' : '结束'}控制消息`); + } catch (error) { + console.error(`发送语音控制消息失败:`, error); + } +} diff --git a/main/xiaozhi-server/test/abbreviated_version/test.html b/main/xiaozhi-server/test/abbreviated_version/test.html new file mode 100644 index 00000000..7c1f0324 --- /dev/null +++ b/main/xiaozhi-server/test/abbreviated_version/test.html @@ -0,0 +1,503 @@ + + + + + 小智语音服务测试 + + + +
+

小智语音服务测试

+ +
正在加载Opus库...
+ +
+

WebSocket连接 未连接

+
+ + +
+
+ +
+

录音测试

+ + +

+ + + +

录音状态: 待机,正在初始化...

+
+
+
+
+ +
+

文本消息

+
+ + +
+
+ +
+

会话记录

+
+
+ + +
+
+ + + + + + From 148e71985f29c8b738eba051c7e8768d99773681 Mon Sep 17 00:00:00 2001 From: CGD <3030332422@qq.com> Date: Fri, 4 Apr 2025 23:52:36 +0800 Subject: [PATCH 21/66] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=A1=B5=E9=9D=A2=E7=9A=84=E2=80=9D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=A8=A1=E5=9E=8B=E4=BE=9B=E5=BA=94=E5=99=A8=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E2=80=9C=E5=8A=9F=E8=83=BD=EF=BC=9B=E2=80=9D=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE=E2=80=9C=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E2=80=9D=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=86=85=E9=83=A8?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E2=80=9C=E9=94=99=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/apis/module/model.js | 18 +++++ .../src/components/ModelEditDialog.vue | 51 +++++++++++--- main/manager-web/src/views/ModelConfig.vue | 67 +++++++++++++------ 3 files changed, 106 insertions(+), 30 deletions(-) diff --git a/main/manager-web/src/apis/module/model.js b/main/manager-web/src/apis/module/model.js index 5957af45..2bf7dc00 100644 --- a/main/manager-web/src/apis/module/model.js +++ b/main/manager-web/src/apis/module/model.js @@ -74,5 +74,23 @@ export default { }) }).send() }, + // 删除模型配置 + deleteModel(modelType, provideCode, id, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/models/models/${modelType}/${provideCode}/${id}`) + .method('DELETE') + .success((res) => { + RequestService.clearRequestTime() + callback(res) + }) + .fail((err) => { + console.error('删除模型失败:', err) + this.$message.error(err.msg || '删除模型失败') + RequestService.reAjaxFun(() => { + this.deleteModel(modelType, provideCode, id, callback) + }) + }).send() + }, + } diff --git a/main/manager-web/src/components/ModelEditDialog.vue b/main/manager-web/src/components/ModelEditDialog.vue index 4aea1027..1313c6b0 100644 --- a/main/manager-web/src/components/ModelEditDialog.vue +++ b/main/manager-web/src/components/ModelEditDialog.vue @@ -37,10 +37,9 @@
- - - - + + + @@ -84,15 +83,19 @@ diff --git a/main/manager-web/src/views/ModelConfig.vue b/main/manager-web/src/views/ModelConfig.vue index e6703776..cdb9e3ef 100644 --- a/main/manager-web/src/views/ModelConfig.vue +++ b/main/manager-web/src/views/ModelConfig.vue @@ -118,7 +118,7 @@
- +
@@ -209,48 +209,71 @@ export default { handleSearch() { console.log('查询:', this.search); }, + // 批量删除 batchDelete() { if (this.selectedModels.length === 0) { - this.$message.warning('请先选择要删除的模型'); - return; + this.$message.warning('请先选择要删除的模型') + return } + this.$confirm('确定要删除选中的模型吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { - const selectedIds = this.selectedModels.map(model => model.code); - this.modelList = this.modelList.filter(model => !selectedIds.includes(model.code)); - this.$message.success('删除成功'); - this.selectedModels = []; - this.isAllSelected = false; + const deletePromises = this.selectedModels.map(model => + new Promise(resolve => { + ModelApi.deleteModel( + this.activeTab, + model.configJson?.provider || '', + model.id, + ({data}) => resolve(data.code === 0) + ) + }) + ) + + Promise.all(deletePromises).then(results => { + if (results.every(Boolean)) { + this.$message.success('批量删除成功') + this.loadData() + } else { + this.$message.error('部分删除失败') + } + }) }).catch(() => { - this.$message.info('已取消删除'); - }); - }, + this.$message.info('已取消删除') + }) + }, addModel() { this.addDialogVisible = true; }, editModel(model) { - this.editModelData = { - code: model.code, - name: model.candidateName, - supplier: model.supplier, - }; + this.editModelData = JSON.parse(JSON.stringify(model)); this.editDialogVisible = true; }, - // 删除模型配置 + // 删除单个模型 deleteModel(model) { - this.$confirm(`确定要删除模型 ${model.candidateName} 吗?`, '提示', { + this.$confirm('确定要删除该模型吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { - this.modelList = this.modelList.filter(item => item.code !== model.code); - this.$message.success('删除成功'); + ModelApi.deleteModel( + this.activeTab, + model.configJson?.provider || '', // 从configJson获取provider + model.id, + ({data}) => { + if (data.code === 0) { + this.$message.success('删除成功') + this.loadData() + } else { + this.$message.error(data.msg || '删除失败') + } + } + ) }).catch(() => { - this.$message.info('已取消删除'); - }); + this.$message.info('已取消删除') + }) }, handleCurrentChange(page) { this.currentPage = page; From e337dd920db6f645e134972279a3e8a447681581 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Sat, 5 Apr 2025 17:16:06 +0800 Subject: [PATCH 22/66] =?UTF-8?q?update:=E7=BB=9F=E4=B8=80=E4=BD=BF?= =?UTF-8?q?=E7=94=A8PageData=E8=BF=94=E5=9B=9E=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/FAQ.md | 18 ++- main/manager-api/README.md | 2 +- .../xiaozhi/common/page/ExtendPageData.java | 38 ------- .../agent/service/impl/AgentServiceImpl.java | 4 +- .../modules/device/service/DeviceService.java | 6 +- .../service/impl/DeviceServiceImpl.java | 16 ++- .../service/impl/ModelConfigServiceImpl.java | 4 - .../sys/controller/AdminController.java | 13 +-- .../modules/sys/service/SysUserService.java | 5 +- .../sys/service/impl/SysUserServiceImpl.java | 17 +-- .../modules/sys/vo/AdminPageUserVO.java | 3 - main/manager-web/README.md | 2 +- main/xiaozhi-server/core/utils/util.py | 103 +++++++++++------- 13 files changed, 108 insertions(+), 123 deletions(-) delete mode 100644 main/manager-api/src/main/java/xiaozhi/common/page/ExtendPageData.java diff --git a/docs/FAQ.md b/docs/FAQ.md index 8acdb1a0..9be27089 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -21,7 +21,17 @@ conda install conda-forge::ffmpeg 建议:如果 `EdgeTTS` 经常失败,请先检查是否使用了代理(梯子)。如果使用了,请尝试关闭代理后再试; 如果用的是火山引擎的豆包 TTS,经常失败时建议使用付费版本,因为测试版本仅支持 2 个并发。 -### 4、如何提高小智对话响应速度? ⚡ +### 4、使用Wifi能连接自建服务器,但是4G模式却接不上 🔐 + +原因:虾哥的固件,4G模式需要使用安全连接。 + +解决方法:目前有两种方法可以解决。任选一种: + +1、改代码。参考这个视频解决 https://www.bilibili.com/video/BV18MfTYoE85 + +2、使用nginx配置ssl证书。参考教程 https://icnt94i5ctj4.feishu.cn/docx/GnYOdMNJOoRCljx1ctecsj9cnRe + +### 5、如何提高小智对话响应速度? ⚡ 本项目默认配置为低成本方案,建议初学者先使用默认免费模型,解决"跑得动"的问题,再优化"跑得快"。 如需提升响应速度,可尝试更换各组件。以下为各组件的响应速度测试数据(仅供参考,不构成承诺): @@ -78,7 +88,7 @@ TTS 性能排行: - LLM:`AliLLM` - TTS:`DoubaoTTS` -### 5、我说话很慢,停顿时小智老是抢话 🗣️ +### 6、我说话很慢,停顿时小智老是抢话 🗣️ 建议:在配置文件中找到如下部分,将 `min_silence_duration_ms` 的值调大(例如改为 `1000`): @@ -90,7 +100,7 @@ VAD: min_silence_duration_ms: 700 # 如果说话停顿较长,可将此值调大 ``` -### 6、我想通过小智控制电灯、空调、远程开关机等操作 💡 +### 7、我想通过小智控制电灯、空调、远程开关机等操作 💡 本项目,支持以工具调用的方式控制HomeAssistant设备 @@ -128,7 +138,7 @@ Intent: - hass_play_music ``` -### 7、更多问题,可联系我们反馈 💬 +### 8、更多问题,可联系我们反馈 💬 我们的联系方式放在[百度网盘中,点击前往](https://pan.baidu.com/s/1x6USjvP1nTRsZ45XlJu65Q),提取码是`223y`。 diff --git a/main/manager-api/README.md b/main/manager-api/README.md index 5f7fda86..920cfbe4 100644 --- a/main/manager-api/README.md +++ b/main/manager-api/README.md @@ -1,4 +1,4 @@ -本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](.././FAQ.md#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-) +本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](../../../docs/Deployment.md) # 项目介绍 manager-api 该项目基于SpringBoot框架开发。 diff --git a/main/manager-api/src/main/java/xiaozhi/common/page/ExtendPageData.java b/main/manager-api/src/main/java/xiaozhi/common/page/ExtendPageData.java deleted file mode 100644 index a838baf5..00000000 --- a/main/manager-api/src/main/java/xiaozhi/common/page/ExtendPageData.java +++ /dev/null @@ -1,38 +0,0 @@ -package xiaozhi.common.page; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * 扩展的分页对象 - * @author zjy - * @since 2025-4-2 - */ -@Data -@Schema(description = "分页数据") -public class ExtendPageData implements Serializable { - @Schema(description = "总记录数") - private int totalCount; - - @Schema(description = "页数") - private int totalPage; - - @Schema(description = "列表数据") - private List list; - - /** - * 分页 - * - * @param list 列表数据 - * @param total 总记录数 - * @param page 页数 - */ - public ExtendPageData(List list, long total, long page) { - this.list = list; - this.totalCount = (int) total; - this.totalPage = (int) page; - } -} \ No newline at end of file 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 40579cee..8d0a0ee0 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 @@ -4,19 +4,17 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import org.springframework.transaction.annotation.Transactional; import xiaozhi.common.page.PageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.modules.agent.dao.AgentDao; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.agent.service.AgentService; -import xiaozhi.modules.device.entity.DeviceEntity; @Service public class AgentServiceImpl extends BaseServiceImpl implements AgentService { 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 1d8b2970..0f6a39a2 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 @@ -2,7 +2,7 @@ package xiaozhi.modules.device.service; import java.util.List; -import xiaozhi.common.page.ExtendPageData; +import xiaozhi.common.page.PageData; import xiaozhi.modules.device.dto.DeviceBindDTO; import xiaozhi.modules.device.dto.DevicePageUserDTO; import xiaozhi.modules.device.dto.DeviceReportReqDTO; @@ -45,12 +45,14 @@ public interface DeviceService { /** * 删除此用户的所有设备 + * * @param userId 用户id */ void deleteByUserId(Long userId); /** * 获取指定用户的设备数量 + * * @param userId 用户id * @return 设备数量 */ @@ -62,5 +64,5 @@ public interface DeviceService { * @param dto 分页查找参数 * @return 用户列表分页数据 */ - ExtendPageData page(DevicePageUserDTO dto); + PageData page(DevicePageUserDTO dto); } \ 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 f94038b8..6fbb1887 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 @@ -8,7 +8,6 @@ import java.util.Map; import java.util.TimeZone; import java.util.concurrent.TimeUnit; -import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; @@ -17,11 +16,12 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import cn.hutool.core.util.RandomUtil; import xiaozhi.common.constant.Constant; import xiaozhi.common.exception.RenException; -import xiaozhi.common.page.ExtendPageData; +import xiaozhi.common.page.PageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.user.UserDetail; import xiaozhi.common.utils.ConvertUtils; @@ -46,13 +46,12 @@ public class DeviceServiceImpl extends BaseServiceImpl private final String frontedUrl; - private final RedisTemplate redisTemplate; // 添加构造函数来初始化 deviceMapper public DeviceServiceImpl(DeviceDao deviceDao, SysUserUtilService sysUserUtilService, - @Value("${app.fronted-url:http://localhost:8001}") String frontedUrl, - RedisTemplate redisTemplate) { + @Value("${app.fronted-url:http://localhost:8001}") String frontedUrl, + RedisTemplate redisTemplate) { this.deviceDao = deviceDao; this.sysUserUtilService = sysUserUtilService; this.frontedUrl = frontedUrl; @@ -223,7 +222,7 @@ public class DeviceServiceImpl extends BaseServiceImpl } @Override - public ExtendPageData page(DevicePageUserDTO dto) { + public PageData page(DevicePageUserDTO dto) { Map params = new HashMap(); params.put(Constant.PAGE, dto.getPage()); params.put(Constant.LIMIT, dto.getLimit()); @@ -243,9 +242,8 @@ public class DeviceServiceImpl extends BaseServiceImpl vo.setDeviceType(device.getBoard()); return vo; }).toList(); - //计算页数 - long num = page.getTotal() / Long.parseLong(dto.getPage()); - return new ExtendPageData<>(list, page.getTotal(), num); + // 计算页数 + return new PageData<>(list, page.getTotal()); } private DeviceReportRespDTO.ServerTime buildServerTime() { diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java index 6372dc0c..b98f70c6 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java @@ -5,8 +5,6 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -37,8 +35,6 @@ public class ModelConfigServiceImpl extends BaseServiceImpl getModelCodeList(String modelType, String modelName) { return modelConfigDao.getModelCodeList(modelType, modelName); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java index 36fa1d92..9b43cab0 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java @@ -17,7 +17,6 @@ import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import xiaozhi.common.constant.Constant; -import xiaozhi.common.page.ExtendPageData; import xiaozhi.common.page.PageData; import xiaozhi.common.utils.Result; import xiaozhi.common.validator.ValidatorUtils; @@ -51,7 +50,7 @@ public class AdminController { @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true), @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true), }) - public Result> pageUser( + public Result> pageUser( @Parameter(hidden = true) @RequestParam Map params) { AdminPageUserDTO dto = new AdminPageUserDTO(); dto.setMobile((String) params.get("mobile")); @@ -59,8 +58,8 @@ public class AdminController { dto.setPage((String) params.get(Constant.PAGE)); ValidatorUtils.validateEntity(dto); ValidatorUtils.validateEntity(dto); - ExtendPageData page = sysUserService.page(dto); - return new Result>().ok(page); + PageData page = sysUserService.page(dto); + return new Result>().ok(page); } @PutMapping("/users/{id}") @@ -88,14 +87,14 @@ public class AdminController { @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true), @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true), }) - public Result> pageDevice( + public Result> pageDevice( @Parameter(hidden = true) @RequestParam Map params) { DevicePageUserDTO dto = new DevicePageUserDTO(); dto.setKeywords((String) params.get("keywords")); dto.setLimit((String) params.get(Constant.LIMIT)); dto.setPage((String) params.get(Constant.PAGE)); ValidatorUtils.validateEntity(dto); - ExtendPageData page = deviceService.page(dto); - return new Result>().ok(page); + PageData page = deviceService.page(dto); + return new Result>().ok(page); } } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java index dbdf06f0..303cca76 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java @@ -1,6 +1,6 @@ package xiaozhi.modules.sys.service; -import xiaozhi.common.page.ExtendPageData; +import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; import xiaozhi.modules.sys.dto.AdminPageUserDTO; import xiaozhi.modules.sys.dto.PasswordDTO; @@ -21,6 +21,7 @@ public interface SysUserService extends BaseService { /** * 删除指定用户,且有关联的数据设备和智能体 + * * @param ids */ void deleteById(Long ids); @@ -55,5 +56,5 @@ public interface SysUserService extends BaseService { * @param dto 分页查找参数 * @return 用户列表分页数据 */ - ExtendPageData page(AdminPageUserDTO dto); + PageData page(AdminPageUserDTO dto); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java index 2335c7e1..911011b5 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java @@ -18,7 +18,7 @@ import lombok.AllArgsConstructor; import xiaozhi.common.constant.Constant; import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.exception.RenException; -import xiaozhi.common.page.ExtendPageData; +import xiaozhi.common.page.PageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.utils.ConvertUtils; import xiaozhi.modules.agent.service.AgentService; @@ -99,7 +99,6 @@ public class SysUserServiceImpl extends BaseServiceImpl page(AdminPageUserDTO dto) { + public PageData page(AdminPageUserDTO dto) { Map params = new HashMap(); params.put(Constant.PAGE, dto.getPage()); params.put(Constant.LIMIT, dto.getLimit()); IPage page = baseDao.selectPage( getPage(params, "id", true), - // 定义查询条件 - new QueryWrapper() - // 必须按照手机号码查找 - .eq(StringUtils.isNotBlank(dto.getMobile()), "username", dto.getMobile())); + new QueryWrapper().eq(StringUtils.isNotBlank(dto.getMobile()), "username", + dto.getMobile())); // 循环处理page获取回来的数据,返回需要的字段 List list = page.getRecords().stream().map(user -> { AdminPageUserVO adminPageUserVO = new AdminPageUserVO(); @@ -168,12 +165,10 @@ public class SysUserServiceImpl extends BaseServiceImpl(list, page.getTotal(),num); + return new PageData<>(list, page.getTotal()); } private boolean isStrongPassword(String password) { diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java index c1d55ed0..a406848f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/vo/AdminPageUserVO.java @@ -23,7 +23,4 @@ public class AdminPageUserVO { @Schema(description = "用户id") private String userid; - - @Schema(description = "用户状态") - private String status; } diff --git a/main/manager-web/README.md b/main/manager-web/README.md index 3d26f25e..0f793bb0 100644 --- a/main/manager-web/README.md +++ b/main/manager-web/README.md @@ -1,4 +1,4 @@ -本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](.././FAQ.md#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-) +本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](../../../docs/Deployment.md) # xiaozhi diff --git a/main/xiaozhi-server/core/utils/util.py b/main/xiaozhi-server/core/utils/util.py index 764ce689..14d71fb2 100644 --- a/main/xiaozhi-server/core/utils/util.py +++ b/main/xiaozhi-server/core/utils/util.py @@ -10,7 +10,10 @@ import requests def get_project_dir(): """获取项目根目录""" - return os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + '/' + return ( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + + "/" + ) def get_local_ip(): @@ -24,6 +27,7 @@ def get_local_ip(): except Exception as e: return "127.0.0.1" + def is_private_ip(ip_addr): """ Check if an IP address is a private IP address (compatible with IPv4 and IPv6). @@ -33,48 +37,48 @@ def is_private_ip(ip_addr): """ try: # Validate IPv4 or IPv6 address format - if not re.match(r"^(\d{1,3}\.){3}\d{1,3}$|^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$", ip_addr): + if not re.match( + r"^(\d{1,3}\.){3}\d{1,3}$|^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$", ip_addr + ): return False # Invalid IP address format # IPv4 private address ranges - if '.' in ip_addr: # IPv4 address - ip_parts = list(map(int, ip_addr.split('.'))) + if "." in ip_addr: # IPv4 address + ip_parts = list(map(int, ip_addr.split("."))) if ip_parts[0] == 10: return True # 10.0.0.0/8 range elif ip_parts[0] == 172 and 16 <= ip_parts[1] <= 31: return True # 172.16.0.0/12 range elif ip_parts[0] == 192 and ip_parts[1] == 168: return True # 192.168.0.0/16 range - elif ip_addr == '127.0.0.1': + elif ip_addr == "127.0.0.1": return True # Loopback address elif ip_parts[0] == 169 and ip_parts[1] == 254: - return True # Link-local address 169.254.0.0/16 + return True # Link-local address 169.254.0.0/16 else: return False # Not a private IPv4 address else: # IPv6 address ip_addr = ip_addr.lower() - if ip_addr.startswith('fc00:') or ip_addr.startswith('fd00:'): + if ip_addr.startswith("fc00:") or ip_addr.startswith("fd00:"): return True # Unique Local Addresses (FC00::/7) - elif ip_addr == '::1': + elif ip_addr == "::1": return True # Loopback address - elif ip_addr.startswith('fe80:'): - return True # Link-local unicast addresses (FE80::/10) + elif ip_addr.startswith("fe80:"): + return True # Link-local unicast addresses (FE80::/10) else: return False # Not a private IPv6 address except (ValueError, IndexError): return False # IP address format error or insufficient segments + def get_ip_info(ip_addr): try: + if is_private_ip(ip_addr): + ip_addr = "" url = f"https://whois.pconline.com.cn/ipJson.jsp?json=true&ip={ip_addr}" resp = requests.get(url).json() - - ip_info = { - "city": resp.get("city"), - "region": resp.get("region"), - "addr": resp.get("addr") - } + ip_info = {"city": resp.get("city")} return ip_info except Exception as e: logging.error(f"Error getting client ip info: {e}") @@ -89,7 +93,7 @@ def read_config(config_path): def write_json_file(file_path, data): """将数据写入 JSON 文件""" - with open(file_path, 'w', encoding='utf-8') as file: + with open(file_path, "w", encoding="utf-8") as file: json.dump(data, file, ensure_ascii=False, indent=4) @@ -97,21 +101,28 @@ def is_punctuation_or_emoji(char): """检查字符是否为空格、指定标点或表情符号""" # 定义需要去除的中英文标点(包括全角/半角) punctuation_set = { - ',', ',', # 中文逗号 + 英文逗号 - '。', '.', # 中文句号 + 英文句号 - '!', '!', # 中文感叹号 + 英文感叹号 - '-', '-', # 英文连字符 + 中文全角横线 - '、' # 中文顿号 + ",", + ",", # 中文逗号 + 英文逗号 + "。", + ".", # 中文句号 + 英文句号 + "!", + "!", # 中文感叹号 + 英文感叹号 + "-", + "-", # 英文连字符 + 中文全角横线 + "、", # 中文顿号 } if char.isspace() or char in punctuation_set: return True # 检查表情符号(保留原有逻辑) code_point = ord(char) emoji_ranges = [ - (0x1F600, 0x1F64F), (0x1F300, 0x1F5FF), - (0x1F680, 0x1F6FF), (0x1F900, 0x1F9FF), - (0x1FA70, 0x1FAFF), (0x2600, 0x26FF), - (0x2700, 0x27BF) + (0x1F600, 0x1F64F), + (0x1F300, 0x1F5FF), + (0x1F680, 0x1F6FF), + (0x1F900, 0x1F9FF), + (0x1FA70, 0x1FAFF), + (0x2600, 0x26FF), + (0x2700, 0x27BF), ] return any(start <= code_point <= end for start, end in emoji_ranges) @@ -127,27 +138,42 @@ def get_string_no_punctuation_or_emoji(s): end = len(chars) - 1 while end >= start and is_punctuation_or_emoji(chars[end]): end -= 1 - return ''.join(chars[start:end + 1]) + return "".join(chars[start : end + 1]) def remove_punctuation_and_length(text): # 全角符号和半角符号的Unicode范围 - full_width_punctuations = '!"#$%&'()*+,-。/:;<=>?@[\]^_`{|}~' + full_width_punctuations = ( + "!"#$%&'()*+,-。/:;<=>?@[\]^_`{|}~" + ) half_width_punctuations = r'!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~' - space = ' ' # 半角空格 - full_width_space = ' ' # 全角空格 + space = " " # 半角空格 + full_width_space = " " # 全角空格 # 去除全角和半角符号以及空格 - result = ''.join([char for char in text if - char not in full_width_punctuations and char not in half_width_punctuations and char not in space and char not in full_width_space]) + result = "".join( + [ + char + for char in text + if char not in full_width_punctuations + and char not in half_width_punctuations + and char not in space + and char not in full_width_space + ] + ) if result == "Yeah": return 0, "" return len(result), result + def check_model_key(modelType, modelKey): if "你" in modelKey: - logging.error("你还没配置" + modelType + "的密钥,请在配置文件中配置密钥,否则无法正常工作") + logging.error( + "你还没配置" + + modelType + + "的密钥,请在配置文件中配置密钥,否则无法正常工作" + ) return False return True @@ -157,15 +183,15 @@ def check_ffmpeg_installed(): try: # 执行ffmpeg -version命令,并捕获输出 result = subprocess.run( - ['ffmpeg', '-version'], + ["ffmpeg", "-version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, - check=True # 如果返回码非零则抛出异常 + check=True, # 如果返回码非零则抛出异常 ) # 检查输出中是否包含版本信息(可选) output = result.stdout + result.stderr - if 'ffmpeg version' in output.lower(): + if "ffmpeg version" in output.lower(): ffmpeg_installed = True return False except (subprocess.CalledProcessError, FileNotFoundError): @@ -177,10 +203,11 @@ def check_ffmpeg_installed(): error_msg += "1、按照项目的安装文档,正确进入conda环境\n" error_msg += "2、查阅安装文档,如何在conda环境中安装ffmpeg\n" raise ValueError(error_msg) - + + def extract_json_from_string(input_string): """提取字符串中的 JSON 部分""" - pattern = r'(\{.*\})' + pattern = r"(\{.*\})" match = re.search(pattern, input_string) if match: return match.group(1) # 返回提取的 JSON 字符串 From 6f46776484761704e17578cc2f9e3e6e623aa70a Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Sat, 5 Apr 2025 19:37:18 +0800 Subject: [PATCH 23/66] =?UTF-8?q?update:=E7=BC=96=E8=BE=91=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E9=85=8D=E7=BD=AE(/models/{modelType}/{provideCode}/{?= =?UTF-8?q?id})=E4=BF=9D=E5=AD=98configJson=E8=BE=BE=E4=B8=8D=E5=88=B0?= =?UTF-8?q?=E9=A2=84=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/controller/ModelController.java | 28 +++++++++---------- .../modules/model/dto/ModelConfigBodyDTO.java | 3 +- .../modules/model/dto/ModelConfigDTO.java | 3 +- .../model/dto/ModelProviderFieldDTO.java | 19 ------------- .../model/entity/ModelConfigEntity.java | 5 ++-- .../model/service/ModelConfigService.java | 6 ++-- .../model/service/ModelProviderService.java | 3 -- .../service/impl/ModelConfigServiceImpl.java | 11 +------- .../impl/ModelProviderServiceImpl.java | 13 --------- .../sys/controller/AdminController.java | 10 +++++++ .../modules/sys/service/SysUserService.java | 8 ++++++ .../sys/service/impl/SysUserServiceImpl.java | 16 +++++++++-- .../resources/mapper/model/ModelConfigDao.xml | 16 +++++++++++ 13 files changed, 73 insertions(+), 68 deletions(-) delete mode 100644 main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderFieldDTO.java diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java index af1e772f..7b3381ce 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java @@ -17,11 +17,12 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import xiaozhi.common.page.PageData; +import xiaozhi.common.utils.ConvertUtils; import xiaozhi.common.utils.Result; import xiaozhi.modules.model.dto.ModelConfigBodyDTO; import xiaozhi.modules.model.dto.ModelConfigDTO; import xiaozhi.modules.model.dto.ModelProviderDTO; -import xiaozhi.modules.model.dto.ModelProviderFieldDTO; +import xiaozhi.modules.model.entity.ModelConfigEntity; import xiaozhi.modules.model.service.ModelConfigService; import xiaozhi.modules.model.service.ModelProviderService; @@ -52,15 +53,6 @@ public class ModelController { return new Result>().ok(modelProviderDTOS); } - @GetMapping("/{modelType}/{provideCode}/fields") - @Operation(summary = "获取模型供应器字段") - @RequiresPermissions("sys:role:superAdmin") - public Result> getModelProviderFields(@PathVariable String modelType, - @PathVariable String provideCode) { - List fieldList = modelProviderService.getFieldList(modelType, provideCode); - return new Result>().ok(fieldList); - } - @GetMapping("/models/list") @Operation(summary = "获取模型配置列表") @RequiresPermissions("sys:role:superAdmin") @@ -94,15 +86,23 @@ public class ModelController { return new Result().ok(modelConfigDTO); } - @DeleteMapping("/models/{modelType}/{provideCode}/{id}") + @DeleteMapping("/models/{id}") @Operation(summary = "删除模型配置") @RequiresPermissions("sys:role:superAdmin") - public Result deleteModelConfig(@PathVariable String modelType, @PathVariable String provideCode, - @PathVariable String id) { - modelConfigService.delete(modelType, provideCode, id); + public Result deleteModelConfig(@PathVariable String id) { + modelConfigService.delete(id); return new Result<>(); } + @GetMapping("/models/{id}") + @Operation(summary = "获取模型配置") + @RequiresPermissions("sys:role:superAdmin") + public Result getModelConfig(@PathVariable String id) { + ModelConfigEntity item = modelConfigService.selectById(id); + ModelConfigDTO modelConfigDTO = ConvertUtils.sourceToTarget(item, ModelConfigDTO.class); + return new Result().ok(modelConfigDTO); + } + @GetMapping("/models/{modelId}/voices") @Operation(summary = "获取模型音色") @RequiresPermissions("sys:role:normal") diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigBodyDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigBodyDTO.java index 3e335bf0..07758def 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigBodyDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigBodyDTO.java @@ -2,6 +2,7 @@ package xiaozhi.modules.model.dto; import java.io.Serial; +import cn.hutool.json.JSONObject; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -28,7 +29,7 @@ public class ModelConfigBodyDTO { private Integer isEnabled; @Schema(description = "模型配置(JSON格式)") - private String configJson; + private JSONObject configJson; @Schema(description = "官方文档链接") private String docLink; diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigDTO.java index a7b1b436..ed73e1ff 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigDTO.java @@ -3,6 +3,7 @@ package xiaozhi.modules.model.dto; import java.io.Serial; import java.io.Serializable; +import cn.hutool.json.JSONObject; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -32,7 +33,7 @@ public class ModelConfigDTO implements Serializable { private Integer isEnabled; @Schema(description = "模型配置(JSON格式)") - private String configJson; + private JSONObject configJson; @Schema(description = "官方文档链接") private String docLink; diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderFieldDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderFieldDTO.java deleted file mode 100644 index 8186b363..00000000 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderFieldDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package xiaozhi.modules.model.dto; - -import java.io.Serializable; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(description = "模型供应器字段") -public class ModelProviderFieldDTO implements Serializable { - @Schema(description = "字段名") - private String key; - - @Schema(description = "字段标签") - private String label; - - @Schema(description = "字段类型") - private String type; -} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelConfigEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelConfigEntity.java index 0111ea96..32ff911f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelConfigEntity.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelConfigEntity.java @@ -9,11 +9,12 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import cn.hutool.json.JSONObject; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data -@TableName("ai_model_config") +@TableName(value = "ai_model_config", autoResultMap = true) @Schema(description = "模型配置表") public class ModelConfigEntity { @@ -38,7 +39,7 @@ public class ModelConfigEntity { @TableField(typeHandler = JacksonTypeHandler.class) @Schema(description = "模型配置(JSON格式)") - private String configJson; + private JSONObject configJson; @Schema(description = "官方文档链接") private String docLink; diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java index 78e9d0ce..59312589 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java @@ -3,10 +3,12 @@ package xiaozhi.modules.model.service; import java.util.List; import xiaozhi.common.page.PageData; +import xiaozhi.common.service.BaseService; import xiaozhi.modules.model.dto.ModelConfigBodyDTO; import xiaozhi.modules.model.dto.ModelConfigDTO; +import xiaozhi.modules.model.entity.ModelConfigEntity; -public interface ModelConfigService { +public interface ModelConfigService extends BaseService { List getModelCodeList(String modelType, String modelName); @@ -16,7 +18,7 @@ public interface ModelConfigService { ModelConfigDTO edit(String modelType, String provideCode, String id, ModelConfigBodyDTO modelConfigBodyDTO); - void delete(String modelType, String provideCode, String id); + void delete(String id); List getVoiceList(String modelName, String voiceName); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java index cb92c953..2ace101e 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java @@ -3,7 +3,6 @@ package xiaozhi.modules.model.service; import java.util.List; import xiaozhi.modules.model.dto.ModelProviderDTO; -import xiaozhi.modules.model.dto.ModelProviderFieldDTO; import xiaozhi.modules.model.entity.ModelProviderEntity; public interface ModelProviderService { @@ -19,6 +18,4 @@ public interface ModelProviderService { void delete(); List getList(String modelType, String provideCode); - - List getFieldList(String modelType, String provideCode); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java index b98f70c6..998bf137 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java @@ -91,16 +91,7 @@ public class ModelConfigServiceImpl extends BaseServiceImpl providerList = modelProviderService.getList(modelType, provideCode); - if (CollectionUtil.isEmpty(providerList)) { - throw new RenException("供应器不存在"); - } - + public void delete(String id) { modelConfigDao.deleteById(id); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelProviderServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelProviderServiceImpl.java index 7580d479..fb06e4d5 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelProviderServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelProviderServiceImpl.java @@ -10,10 +10,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.AllArgsConstructor; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.utils.ConvertUtils; -import xiaozhi.common.utils.JsonUtils; import xiaozhi.modules.model.dao.ModelProviderDao; import xiaozhi.modules.model.dto.ModelProviderDTO; -import xiaozhi.modules.model.dto.ModelProviderFieldDTO; import xiaozhi.modules.model.entity.ModelProviderEntity; import xiaozhi.modules.model.service.ModelProviderService; @@ -56,15 +54,4 @@ public class ModelProviderServiceImpl extends BaseServiceImpl providerEntities = modelProviderDao.selectList(queryWrapper); return ConvertUtils.sourceToTarget(providerEntities, ModelProviderDTO.class); } - - @Override - public List getFieldList(String modelType, String providerCode) { - List modelProviderEntities = modelProviderDao.getFieldList(modelType, providerCode); - if (modelProviderEntities == null || modelProviderEntities.isEmpty()) { - return null; - } - String fields = modelProviderEntities.getFirst(); - List fieldList = JsonUtils.parseArray(fields, ModelProviderFieldDTO.class); - return fieldList; - } } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java index 9b43cab0..bae50cee 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/AdminController.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -79,6 +80,15 @@ public class AdminController { return new Result<>(); } + @PutMapping("/users/changeStatus/{status}") + @Operation(summary = "批量修改用户状态") + @RequiresPermissions("sys:role:superAdmin") + @Parameter(name = "status", description = "用户状态", required = true) + public Result changeStatus(@PathVariable Integer status, @RequestBody Long[] userIds) { + sysUserService.changeStatus(status, userIds); + return new Result(); + } + @GetMapping("/device/all") @Operation(summary = "分页查找设备") @RequiresPermissions("sys:role:superAdmin") diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java index 303cca76..8b7ff1c2 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java @@ -57,4 +57,12 @@ public interface SysUserService extends BaseService { * @return 用户列表分页数据 */ PageData page(AdminPageUserDTO dto); + + /** + * 批量修改用户状态 + * + * @param status 用户状态 + * @param userIds 用户ID数组 + */ + void changeStatus(Integer status, Long[] userIds); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java index 911011b5..d83dd3e0 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysUserServiceImpl.java @@ -189,10 +189,20 @@ public class SysUserServiceImpl extends BaseServiceImpl + + + + + + + + + + + + + + + + + SELECT COUNT(*) FROM ai_device WHERE agent_id = #{agentId} + + \ No newline at end of file diff --git a/main/manager-web/src/apis/httpRequest.js b/main/manager-web/src/apis/httpRequest.js index 78e2dbf6..43cdf92d 100755 --- a/main/manager-web/src/apis/httpRequest.js +++ b/main/manager-web/src/apis/httpRequest.js @@ -137,7 +137,7 @@ function reAjaxFun(fn) { } else { showWarning('正在连接服务器(' + ajaxIndex + ')') } - if (fn) { + if (ajaxIndex < 10 && fn) { setTimeout(() => { fn() }, reAjaxSec * 1000) diff --git a/main/manager-web/src/components/DeviceItem.vue b/main/manager-web/src/components/DeviceItem.vue index 729b3d1f..13bf608d 100644 --- a/main/manager-web/src/components/DeviceItem.vue +++ b/main/manager-web/src/components/DeviceItem.vue @@ -2,12 +2,15 @@
- {{ device.agentName }} + {{ device.agentName }}
- - + + + +
@@ -20,14 +23,14 @@
配置角色
- - - - - - -
- 设备管理 + + + + + + +
+ 设备管理({{ device.deviceCount }})
@@ -66,6 +69,7 @@ export default { padding: 22px; box-sizing: border-box; } + .device-name { margin: 7px 0 10px; font-weight: 400; @@ -94,5 +98,11 @@ export default { color: #979db1; font-weight: 400; } + + \ No newline at end of file From 17bcaba026e0e98625a985b9f7b9378f0ec99d91 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Sun, 6 Apr 2025 20:55:11 +0800 Subject: [PATCH 37/66] =?UTF-8?q?update:=E5=A2=9E=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E9=A1=B5=E9=9D=A2=E5=B7=A6=E5=9B=BE=20(#683)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/login/login-person.png | Bin 99751 -> 104707 bytes .../src/assets/login/register-person.png | Bin 0 -> 116897 bytes main/manager-web/src/views/register.vue | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 main/manager-web/src/assets/login/register-person.png diff --git a/main/manager-web/src/assets/login/login-person.png b/main/manager-web/src/assets/login/login-person.png index 5a98a1671339a51b02599210dd76b8f2f6784dfe..27477f2f46393b50968261eee8139e037aaec1ba 100644 GIT binary patch literal 104707 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

|^=wul-D4ih~c=GfM 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

qeix;A+=G$elOEA2RkE=yoNj`XuTM@esSU?RLK z0p8kzxtrk>shvS!I7Ic0KL z28Wn4c0^cH=cZN>9rz;wmg9OMkQ~%Wmw;75iGu@n>p)l6HWqxa0Ib`<;Y9FCaY5c{YW$Lkh|-GqV8)DI~UNCb*Uy4-7%Q|T;uos7 zk#rA94qRj_7F-?p*VUR>^-7;NR0Nj`=BBFyPFk%E^0R=N!Tl>?VuXl+6xWWXq-Mr&Zopq16^FRp>dhzf9+F6!#g zB$Hn^WF3^tgptiJsh*qAn!K39S_2p2iWb+v5o+Q?b9`so!+`r1R@as~4}ys=R2{g! zQkMLZ-Z_qDYfIn+SVp=g(rYShadvHiHrK*{+a(8vfG-ZF#8XM8tEP(;L6%k>SlHGe z#f4gSJR}3b!{=_mU7PCaGyTWaDG^KyCcSYSifGyep8DrFchq-?m_j$Q_fr#|N#D{m zLa%p*!((B>kQ^9iebk2FcoHGAIAiGI`auNiEH!uF&odL|C$^O^B%F*E zP6qzLuK+eOFIkr60EbIgw?$FKs5EPMA47(+-@oWv&|TXToczvyiIoz;hmf6Md2mq$ z7=>8Nf!BPt4jK=phQbjt>y1R17F>3x!+{SGQcnmKGR+|~f@@0-9Ep`WA3w*Br>Ww= z>Z(7}QOiHwj_yD833S(AAozHF7+4mZ`0A%vPA^JvV9I9vg5U`I1qUAKww{VC2xgdP z{W&=jLk*Gxo3$kiCc@^qCBNub2PWwu_5El^1K_pkiy(#-yba+xVMnU_&Ij zx!uejhs_e#LtYR1;^qT}55!`Y2$%3=Ue{e{wB@~QrHFbnC;ap0c;v8R%fjvox5k1t z@ICtJL4TD_*I&}*xA{st@q4PiR#v;vVRhuUIB?Zy0$BhTldjTAmu>V&sO~HYWP@5G zu#9HN>Bt6g8tqXQ!3YveH8p0gYh~eVmH@Z1td-J$Ih>KyLNt8q{C53ioxA@g0G9u* zI50v}*JTGD{fO*$k&;~Ty!>K!PNC(%(5eHYQUW~drzg>S@m!H2$f{AZ+U`?Ud9au{LMWEy+R?&Q`#nm(d#XPwxb$5@2cNGp5GMwWhXHn@2q6#1gV}V5lL;a}&Pv9cEmDNq!RQ2#$>M{>K(PR)E*l$h_AnOV74A65PgY$!rdx7jo)MGw0xtNAlYkj-SxY zngna+J$2xH*~E%-v|8lqz$Wcu?u-*(ul1i#cKu5ozH%44S(7=m1bipID&;AW`+ z6MC|W970_zx7-pI^rAUICTre?4i$h~vESiPU`h)mec`c?3^*&F^g=u*gu{Ui0Pkth zgxtS~SGWqk`1{!2)$Ol? zd=PkuFNS2obYP^g)`YRun*QpIme|RBm9xQGXbwhzZJ=~k4bm%(P~iLV>w_zO_qpp| zN(jF@0fZA@-A2OEoZ$#*31RwceW{%-T|7o`xXP+4Hx#y;#-M!nMj$;v;EaqGBUU>| zWzU7G%%n-I4hjI9JFt+&Aq(c%-ca@ftI_N<@x9dX?fO4DbLGw#-^i+)(Dc0w{oiIQ z`&TOfuRlgeK6Rb?lJSev_E|N#pw|tgvDOlJx)9dlI2;&3BUYHI@=FZfMhbG}%z1Hk zr9C3u_r|3o2fDhxv3LF|P6bgI*G9>T2(yKS&4om4k|jcl*tnLq`v7@>eUp6%UqP_3 za9LR4c4?G|phd6=$OR!y9>DLM@8p<+S9krNUC(dk&diO;y6YRM0_5W>$CUc$z)7+oxor!v#5^s7eGroyMPnE5@ zo76Kdp^>j{dW6Aio#{L3?_5cee+5(c(VKTix9M+8U{q?$8Y!%xZ4Z1#41?DH8rlQc z#kKDWV<1IcM57~CPu`Hg+zz|E@&>OoG$b%0wr+e690E5e3<^qR`VLaxWDB_e;L}Wg z%C-hCF4zNN1b?k?(JKlZ^^DKP(ZqW;M8)N1_|PUMYz^^?QS1q9C7xxWat7$U>l+f7 zJ-fyen2YE(ed~g@5`UMgQ64=f+d}Wbr?)dGEb3BU?d7L?-@)~b9dN;=oeDf@ceb7O zhs<8_j015L59#fp)(Kyx#4N5GW#zq&_^5WApu(*nfg!v;94UNL!6SmEZ!$>ePJ5#AF$S=A z=I^1u%+`Hw$yKr`@C}$KE@H4h02*yOkq!8hcA4ab$0u$HtzC7FDsLvug_Zo$Kok#Z{(OwJ2fv87;oX7 z2e0HV>YC+hJj`$VCfiG=xA*YF%jqEq`nE=JOkh6gE|zkR6n9EcxlCwq3A(z&g@foX zp4~XF(g_>*gqvw4C`^H6Op1Um*gNX?Qr~2|>59W2-_H(jiA?$fQ(Q*ot&UiPsxX1W zYSzatz!cb?spYF$A3Co_2mPy8lH|hB>Fy1N2;wOM_y)3Q9h_@sQY$Gs4}mA^HMBn# z@Htbs9Y!$irOf8Dm!Pr_%0>_en{C)`aP9gQSh|3~MenF>WeexkXxQJ$m2+~@=yZF7 z;Rrk8s!R%E)*PH^ap*A06c*xPU+87uxS9 zu!xLqu@Zshz)HTRjcxBB_r1x5rPC9MPgc#e!fLt#Vk|n<7(EezRl*s}`xWqRI7fTY z(q%@l5e)VQFVlGwl)sWRybA(5HHs>XRs@!*TE0Bp^+Mj^U^oA*LUO_B^!kJ0^XD($ zPnpE5^wx*X($B1Z1y5m$$Eq&-*4x}Ip3i6@v18%t6yDZeg2k064v~?-u$JyZ-Ujv_ zq=xf!zMIYI) z)%@jEvyoD*|A>@!+0+W$m38y()%=GF$>pNcMG~LRVew*GRS;PHHHn*MVxrE_dJ#;N z2*v&e<~Qwye;i5)r_;p*j+HOJ?r%MrdVN?jPQV||=&E(>+LQ$ECr?a%7o&^Khgp|&Vr0liL8%$jr$G$|9EuAWutnt3ljW0m}mz+wsGeP}#CJ$d?mNp~fY7Z|buW^*gd zWha{4PDP!i!&Y}wRDYd!YHeZI8VgmIM^&TI!64mD{&zZ9Q{#LKt7s9<0)q0FLmXYZj{JLR!+-gk z>Ad-K6&7r~!PdKJ$*r{}2}@=A56T2Yw&>nC`u^hEB|AJnxxZAHm49#V?qcyncNbqx zSn)=Caah}tlBsj1F7ZvC{AB&*$ZVc=-=v2hKiuZ=h~IHtcvq#-R29!jP;~P7w+9m# lfWYCx|LgY*KrB)~f#9Uj0}j4E6{|qHJYD@<);T3K0RS5$&4~a2 diff --git a/main/manager-web/src/assets/login/register-person.png b/main/manager-web/src/assets/login/register-person.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac2f0f6e5b85789daf5d0bada34aa1554eb1c3c GIT binary patch literal 116897 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 5P7eZdl}ooEos1Z#N1 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 z000000000000000000000000000000006iMQ