diff --git a/main/manager-web/src/App.vue b/main/manager-web/src/App.vue index 952b09e7..0eefc0bc 100644 --- a/main/manager-web/src/App.vue +++ b/main/manager-web/src/App.vue @@ -1,7 +1,7 @@ @@ -61,8 +61,9 @@ export default { }, mounted() { // 只有在启用CDN时才添加相关事件和功能 - // 添加全局快捷键Alt+C用于显示缓存查看器 - document.addEventListener('keydown', this.handleKeyDown); + if (this.isCDNEnabled) { + // 添加全局快捷键Alt+C用于显示缓存查看器 + document.addEventListener('keydown', this.handleKeyDown); // 在全局对象上添加缓存检查方法,便于调试 window.checkCDNCacheStatus = () => { @@ -80,6 +81,12 @@ export default { // 检查Service Worker状态 this.checkServiceWorkerStatus(); + } else { + console.info( + '%c[小智服务] CDN模式已禁用,使用本地打包资源', + 'color: #67C23A; font-weight: bold;' + ); + } }, beforeDestroy() { // 只有在启用CDN时才需要移除事件监听 diff --git a/main/manager-web/src/components/AddModelDialog.vue b/main/manager-web/src/components/AddModelDialog.vue index 4e647381..b6854a3e 100644 --- a/main/manager-web/src/components/AddModelDialog.vue +++ b/main/manager-web/src/components/AddModelDialog.vue @@ -6,7 +6,6 @@ 添加模型 - diff --git a/main/manager-web/src/views/DeviceManagement.vue b/main/manager-web/src/views/DeviceManagement.vue index 823bedc6..1dd2844c 100644 --- a/main/manager-web/src/views/DeviceManagement.vue +++ b/main/manager-web/src/views/DeviceManagement.vue @@ -1,67 +1,94 @@ @@ -77,22 +104,35 @@ export default { addDeviceDialogVisible: false, selectedDevices: [], isAllSelected: false, + searchKeyword: "", + activeSearchKeyword: "", currentAgentId: this.$route.query.agentId || '', currentPage: 1, pageSize: 5, deviceList: [], loading: false, userApi: null, + }; }, computed: { + filteredDeviceList() { + const keyword = this.activeSearchKeyword.toLowerCase(); + if (!keyword) return this.deviceList; + return this.deviceList.filter(device => + (device.model && device.model.toLowerCase().includes(keyword)) || + (device.macAddress && device.macAddress.toLowerCase().includes(keyword)) + ); + }, + paginatedDeviceList() { const start = (this.currentPage - 1) * this.pageSize; const end = start + this.pageSize; - return this.deviceList.slice(start, end); + return this.filteredDeviceList.slice(start, end); }, pageCount() { - return Math.ceil(this.deviceList.length / this.pageSize); + return Math.ceil(this.filteredDeviceList.length / this.pageSize); + }, visiblePages() { const pages = []; @@ -108,7 +148,7 @@ export default { pages.push(i); } return pages; - }, + } }, mounted() { const agentId = this.$route.query.agentId; @@ -117,6 +157,10 @@ export default { } }, methods: { + handleSearch() { + this.activeSearchKeyword = this.searchKeyword; + this.currentPage = 1; + }, handleSelectionChange(val) { this.selectedDevices = val; @@ -126,6 +170,55 @@ export default { this.$refs.deviceTable.toggleAllSelection(); }, + deleteSelected() { + if (this.selectedDevices.length === 0) { + this.$message.warning({ + message: '请至少选择一条记录', + showClose: true + }); + return; + } + + this.$confirm(`确认要解绑选中的 ${this.selectedDevices.length} 台设备吗?`, '警告', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + const deviceIds = this.selectedDevices.map(device => device.device_id); + this.batchUnbindDevices(deviceIds); + }); + }, + + batchUnbindDevices(deviceIds) { + const promises = deviceIds.map(id => { + return new Promise((resolve, reject) => { + Api.device.unbindDevice(id, ({ data }) => { + if (data.code === 0) { + resolve(); + } else { + reject(data.msg || '解绑失败'); + } + }); + }); + }); + + Promise.all(promises) + .then(() => { + this.$message.success({ + message: `成功解绑 ${deviceIds.length} 台设备`, + showClose: true + }); + this.fetchBindDevices(this.currentAgentId); + this.selectedDevices = []; + this.isAllSelected = false; + }) + .catch(error => { + this.$message.error({ + message: error || '批量解绑过程中出现错误', + showClose: true + }); + }); + }, handleAddDevice() { this.addDeviceDialogVisible = true; @@ -176,9 +269,7 @@ export default { Api.device.getAgentBindDevices(agentId, ({ data }) => { this.loading = false; if (data.code === 0) { - // 格式化日期并按照绑定时间降序排列 this.deviceList = data.data.map(device => { - // 格式化绑定时间 const bindDate = new Date(device.createDate); const formattedBindTime = `${bindDate.getFullYear()}-${(bindDate.getMonth() + 1).toString().padStart(2, '0')}-${bindDate.getDate().toString().padStart(2, '0')} ${bindDate.getHours().toString().padStart(2, '0')}:${bindDate.getMinutes().toString().padStart(2, '0')}:${bindDate.getSeconds().toString().padStart(2, '0')}`; return { @@ -186,25 +277,30 @@ export default { model: device.board, firmwareVersion: device.appVersion, macAddress: device.macAddress, - bindTime: formattedBindTime, // 使用格式化后的时间 + bindTime: formattedBindTime, lastConversation: device.lastConnectedAt, remark: device.alias, isEdit: false, otaSwitch: device.autoUpdate === 1, - // 添加原始时间用于排序 rawBindTime: new Date(device.createDate).getTime() }; }) - // 按照绑定时间降序排序 - .sort((a, b) => a.rawBindTime - b.rawBindTime); + .sort((a, b) => a.rawBindTime - b.rawBindTime); + this.activeSearchKeyword = ""; + this.searchKeyword = ""; } else { this.$message.error(data.msg || '获取设备列表失败'); } }); }, + headerCellClassName({columnIndex}) { + if (columnIndex === 0) { + return "custom-selection-header"; + } + return ""; + } } }; - diff --git a/main/manager-web/src/views/ParamsManagement.vue b/main/manager-web/src/views/ParamsManagement.vue index 02f912a1..c815a77b 100644 --- a/main/manager-web/src/views/ParamsManagement.vue +++ b/main/manager-web/src/views/ParamsManagement.vue @@ -16,7 +16,7 @@
+ :header-cell-class-name="headerCellClassName" :max-height="tableMaxHeight"> 删除
+ + + + @@ -64,6 +72,7 @@ +
@@ -80,10 +89,12 @@ export default { paramsList: [], currentPage: 1, pageSize: 5, + pageSizeOptions: [5, 10, 20, 50, 100], total: 0, dialogVisible: false, dialogTitle: "新增参数", isAllSelected: false, + tableMaxHeight: 400, paramForm: { id: null, paramCode: "", @@ -94,7 +105,9 @@ export default { }, created() { this.fetchParams(); + }, + computed: { pageCount() { return Math.ceil(this.total / this.pageSize); @@ -116,6 +129,11 @@ export default { }, }, methods: { + handlePageSizeChange(val) { + this.pageSize = val; + this.currentPage = 1; + this.fetchParams(); + }, fetchParams() { Api.admin.getParamsList( { @@ -190,7 +208,6 @@ export default { return; } - const paramCount = params.length; this.$confirm(`确定要删除选中的${paramCount}个参数吗?`, '警告', { confirmButtonText: '确定', @@ -210,7 +227,7 @@ export default { message: `成功删除${paramCount}个参数`, showClose: true }); - this.fetchParams(); // 刷新参数列表 + this.fetchParams(); } else { this.$message.error({ message: data.msg || '删除失败,请重试', @@ -279,12 +296,16 @@ export default { } .main-wrapper { - margin: 5px 22px; - border-radius: 15px; - min-height: 600px; - box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); - position: relative; - background: rgba(237, 242, 255, 0.5); + margin: 5px 22px; + border-radius: 15px; + min-height: calc(100vh - 350px); + height: auto; + max-height: 80vh; + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); + position: relative; + background: rgba(237, 242, 255, 0.5); + display: flex; + flex-direction: column; } .operation-bar { @@ -344,6 +365,7 @@ export default { justify-content: space-between; align-items: center; margin-top: 10px; + padding-bottom: 10px; } .ctrl_btn { @@ -386,9 +408,14 @@ export default { gap: 8px; margin-top: 15px; + .el-select { + margin-right: 8px; + } + .pagination-btn:first-child, .pagination-btn:nth-child(2), - .pagination-btn:nth-last-child(2) { + .pagination-btn:nth-last-child(2), + .pagination-btn:nth-child(3) { min-width: 60px; height: 32px; padding: 0 12px; @@ -410,7 +437,7 @@ export default { } } - .pagination-btn:not(:first-child):not(:nth-child(2)):not(:nth-last-child(2)) { + .pagination-btn:not(:first-child):not(:nth-child(3)):not(:nth-child(2)):not(:nth-last-child(2)) { min-width: 28px; height: 32px; padding: 0; @@ -446,6 +473,7 @@ export default { :deep(.transparent-table) { background: white; + flex: 1; .el-table__header th { background: white !important; @@ -534,4 +562,29 @@ export default { overflow: hidden; text-overflow: ellipsis; } + +.page-size-select { + width: 100px; + margin-right: 8px; + + :deep(.el-input__inner) { + height: 32px; + line-height: 32px; + border-radius: 4px; + border: 1px solid #e4e7ed; + background: #dee7ff; + color: #606266; + font-size: 14px; + } + + :deep(.el-input__suffix) { + line-height: 32px; + } +} + +:deep(.el-table) { + .el-table__body-wrapper { + transition: height 0.3s ease; + } +} diff --git a/main/manager-web/src/views/UserManagement.vue b/main/manager-web/src/views/UserManagement.vue index 617ad04c..d43af456 100644 --- a/main/manager-web/src/views/UserManagement.vue +++ b/main/manager-web/src/views/UserManagement.vue @@ -69,6 +69,7 @@ + diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index 5f8115f3..b09d032e 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -19,13 +19,13 @@
Hello, Let's have a wonderful day!
-
-
+
+
添加智能体
- +
@@ -261,4 +261,7 @@ export default { text-align: center; /* 居中显示 */ } + + + \ No newline at end of file diff --git a/main/manager-web/src/views/roleConfig.vue b/main/manager-web/src/views/roleConfig.vue index a67fe0f4..e71a218d 100644 --- a/main/manager-web/src/views/roleConfig.vue +++ b/main/manager-web/src/views/roleConfig.vue @@ -81,6 +81,7 @@
+