From ec5063f050704d2af430980e41a0ba4c57c2f4e9 Mon Sep 17 00:00:00 2001 From: rainv123 <2148537152@qq.com> Date: Wed, 27 May 2026 17:35:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E8=AE=BE=E5=A4=87=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=97=B6=E9=97=B4=E8=BF=94=E5=9B=9E=20UTC=20?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=88=B3=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=97=B6?= =?UTF-8?q?=E5=8C=BA=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/controller/DeviceController.java | 7 ++++--- .../modules/device/service/DeviceService.java | 5 +++++ .../service/impl/DeviceServiceImpl.java | 19 +++++++++++++++++++ .../device/vo/UserShowDeviceListVO.java | 10 ++++++++++ .../src/main/resources/application-dev.yml | 2 +- .../src/views/DeviceManagement.vue | 14 ++++++++++++-- main/xiaozhi-server/docker-compose.yml | 2 +- 7 files changed, 52 insertions(+), 7 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java index 629ba80f..8d49e065 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java @@ -29,6 +29,7 @@ import xiaozhi.modules.device.dto.DeviceUnBindDTO; import xiaozhi.modules.device.dto.DeviceUpdateDTO; 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.SysParamsService; @@ -78,10 +79,10 @@ public class DeviceController { @GetMapping("/bind/{agentId}") @Operation(summary = "获取已绑定设备") @RequiresPermissions("sys:role:normal") - public Result> getUserDevices(@PathVariable String agentId) { + public Result> getUserDevices(@PathVariable String agentId) { UserDetail user = SecurityUser.getUser(); - List devices = deviceService.getUserDevices(user.getId(), agentId); - return new Result>().ok(devices); + List devices = deviceService.getUserDeviceList(user.getId(), agentId); + return new Result>().ok(devices); } @PostMapping("/bind/{agentId}") 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 ecbf719c..99fe1583 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 @@ -30,6 +30,11 @@ public interface DeviceService extends BaseService { */ List getUserDevices(Long userId, String agentId); + /** + * 获取用户指定智能体的设备列表(带时区处理), + */ + List getUserDeviceList(Long userId, String agentId); + /** * 解绑设备 */ 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 adabbd95..e8e82637 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 @@ -298,6 +298,21 @@ public class DeviceServiceImpl extends BaseServiceImpl return baseDao.selectList(wrapper); } + @Override + public List getUserDeviceList(Long userId, String agentId) { + List devices = getUserDevices(userId, agentId); + return devices.stream().map(device -> { + UserShowDeviceListVO vo = ConvertUtils.sourceToTarget(device, UserShowDeviceListVO.class); + // 手动设置deviceType(ConvertUtils按字段名匹配,board无法直接映射到deviceType) + vo.setDeviceType(device.getBoard()); + // 设置UTC时间戳供前端使用时区转换 + if (device.getLastConnectedAt() != null) { + vo.setLastConnectedAtTimestamp(device.getLastConnectedAt().getTime()); + } + return vo; + }).toList(); + } + @Override public void unbindDevice(Long userId, String deviceId) { // 先查询设备信息,获取agentId @@ -356,6 +371,10 @@ public class DeviceServiceImpl extends BaseServiceImpl sysUserUtilService.assignUsername(device.getUserId(), vo::setBindUserName); vo.setDeviceType(device.getBoard()); + // 设置UTC时间戳供前端使用时区转换 + if (device.getLastConnectedAt() != null) { + vo.setLastConnectedAtTimestamp(device.getLastConnectedAt().getTime()); + } return vo; }).toList(); // 计算页数 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 index e3a5d8fd..778f656b 100644 --- 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 @@ -1,8 +1,11 @@ package xiaozhi.modules.device.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.util.Date; + @Data @Schema(description = "用户显示设备列表VO") public class UserShowDeviceListVO { @@ -28,4 +31,11 @@ public class UserShowDeviceListVO { @Schema(description = "最近对话时间") private String recentChatTime; + @Schema(description = "最后连接时间(UTC毫秒)") + private Long lastConnectedAtTimestamp; + + @Schema(description = "绑定时间") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC") + private Date createDate; + } \ No newline at end of file diff --git a/main/manager-api/src/main/resources/application-dev.yml b/main/manager-api/src/main/resources/application-dev.yml index 1c86f288..2470bed5 100644 --- a/main/manager-api/src/main/resources/application-dev.yml +++ b/main/manager-api/src/main/resources/application-dev.yml @@ -12,7 +12,7 @@ spring: druid: #MySQL driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + url: jdbc:mysql://127.0.0.1:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&nullCatalogMeansCurrent=true username: root password: 123456 initial-size: 10 diff --git a/main/manager-web/src/views/DeviceManagement.vue b/main/manager-web/src/views/DeviceManagement.vue index 095aaf1d..e15ff278 100644 --- a/main/manager-web/src/views/DeviceManagement.vue +++ b/main/manager-web/src/views/DeviceManagement.vue @@ -369,11 +369,13 @@ export default { this.deviceList = data.data.map(device => { return { device_id: device.id, - model: device.board, + model: device.deviceType, firmwareVersion: device.appVersion, macAddress: device.macAddress, bindTime: device.createDate, - lastConversation: device.lastConnectedAt, + lastConversation: device.lastConnectedAtTimestamp + ? this.formatRelativeTime(device.lastConnectedAtTimestamp) + : '-', remark: device.alias, _originalRemark: device.alias, isEdit: false, @@ -489,6 +491,14 @@ export default { const version = row.firmwareVersion.replace(/\./g, ''); return Number(version) >= 200; }, + formatRelativeTime(timestamp) { + if (!timestamp) return '-'; + const ts = Number(timestamp); + if (isNaN(ts)) return '-'; + const date = new Date(ts); + if (isNaN(date.getTime())) return '-'; + return date.toLocaleString(); // 自动适配本地时区 + }, } }; diff --git a/main/xiaozhi-server/docker-compose.yml b/main/xiaozhi-server/docker-compose.yml index 089a04a5..2427a79f 100644 --- a/main/xiaozhi-server/docker-compose.yml +++ b/main/xiaozhi-server/docker-compose.yml @@ -9,7 +9,7 @@ services: security_opt: - seccomp:unconfined environment: - - TZ=Asia/Shanghai + - TZ=UTC ports: # ws服务端 - "8000:8000" From 3a0ce6998edc7b78f73e1ed5e3fa3fc82c6a6c2f Mon Sep 17 00:00:00 2001 From: rainv123 <2148537152@qq.com> Date: Fri, 29 May 2026 09:50:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=9E=8B=E5=8F=B7=E4=B8=8D=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xiaozhi/modules/device/service/impl/DeviceServiceImpl.java | 3 ++- .../java/xiaozhi/modules/device/vo/UserShowDeviceListVO.java | 3 +++ main/manager-web/src/views/DeviceManagement.vue | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) 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 e8e82637..2009fa70 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 @@ -303,8 +303,8 @@ public class DeviceServiceImpl extends BaseServiceImpl List devices = getUserDevices(userId, agentId); return devices.stream().map(device -> { UserShowDeviceListVO vo = ConvertUtils.sourceToTarget(device, UserShowDeviceListVO.class); - // 手动设置deviceType(ConvertUtils按字段名匹配,board无法直接映射到deviceType) vo.setDeviceType(device.getBoard()); + vo.setBoard(device.getBoard()); // 设置UTC时间戳供前端使用时区转换 if (device.getLastConnectedAt() != null) { vo.setLastConnectedAtTimestamp(device.getLastConnectedAt().getTime()); @@ -371,6 +371,7 @@ public class DeviceServiceImpl extends BaseServiceImpl sysUserUtilService.assignUsername(device.getUserId(), vo::setBindUserName); vo.setDeviceType(device.getBoard()); + vo.setBoard(device.getBoard()); // 设置UTC时间戳供前端使用时区转换 if (device.getLastConnectedAt() != null) { vo.setLastConnectedAtTimestamp(device.getLastConnectedAt().getTime()); 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 index 778f656b..d7035c32 100644 --- 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 @@ -19,6 +19,9 @@ public class UserShowDeviceListVO { @Schema(description = "设备型号") private String deviceType; + @Schema(description = "设备型号(board)") + private String board; + @Schema(description = "设备唯一标识符") private String id; diff --git a/main/manager-web/src/views/DeviceManagement.vue b/main/manager-web/src/views/DeviceManagement.vue index e15ff278..981365ad 100644 --- a/main/manager-web/src/views/DeviceManagement.vue +++ b/main/manager-web/src/views/DeviceManagement.vue @@ -369,7 +369,7 @@ export default { this.deviceList = data.data.map(device => { return { device_id: device.id, - model: device.deviceType, + model: device.board, firmwareVersion: device.appVersion, macAddress: device.macAddress, bindTime: device.createDate,