diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index b09d032e..65a5687a 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -31,8 +31,30 @@
- + + +
@@ -60,7 +82,9 @@ export default { devices: [], originalDevices: [], isSearching: false, - searchRegex: null + searchRegex: null, + isLoading: true, + skeletonCount: localStorage.getItem('skeletonCount') || 8, } }, @@ -109,12 +133,26 @@ export default { }, // 获取智能体列表 fetchAgentList() { + this.isLoading = true; Api.agent.getAgentList(({ data }) => { - this.originalDevices = data.data.map(item => ({ - ...item, - agentId: item.id // 字段映射 - })); - this.handleSearchReset(); // 重置搜索状态 + if (data?.data) { + this.originalDevices = data.data.map(item => ({ + ...item, + agentId: item.id + })); + + // 动态设置骨架屏数量(可选) + this.skeletonCount = Math.min( + Math.max(this.originalDevices.length, 3), // 最少3个 + 10 // 最多10个 + ); + + this.handleSearchReset(); + } + this.isLoading = false; + }, (error) => { + console.error('Failed to fetch agent list:', error); + this.isLoading = false; }); }, // 删除智能体 @@ -262,6 +300,66 @@ export default { /* 居中显示 */ } +/* 骨架屏动画 */ +@keyframes shimmer { + 100% { transform: translateX(100%); } +} +.skeleton-item { + background: #fff; + border-radius: 8px; + padding: 20px; + height: 120px; + position: relative; + overflow: hidden; + margin-bottom: 20px; +} + +.skeleton-image { + width: 80px; + height: 80px; + background: #f0f2f5; + border-radius: 4px; + float: left; + position: relative; + overflow: hidden; +} + +.skeleton-content { + margin-left: 100px; +} + +.skeleton-line { + height: 16px; + background: #f0f2f5; + border-radius: 4px; + margin-bottom: 12px; + width: 70%; + position: relative; + overflow: hidden; +} + +.skeleton-line-short { + height: 12px; + background: #f0f2f5; + border-radius: 4px; + width: 50%; +} + +.skeleton-item::after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 50%; + height: 100%; + background: linear-gradient( + 90deg, + rgba(255,255,255,0), + rgba(255,255,255,0.3), + rgba(255,255,255,0) + ); + animation: shimmer 1.5s infinite; +} \ 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 46bd6e5e..c13ad718 100644 --- a/main/manager-web/src/views/roleConfig.vue +++ b/main/manager-web/src/views/roleConfig.vue @@ -15,6 +15,9 @@ {{ form.agentName }} +
@@ -165,6 +168,9 @@ export default { } }, methods: { + goToHome() { + this.$router.push('/home'); + }, saveConfig() { const configData = { agentCode: this.form.agentCode, @@ -423,6 +429,7 @@ export default { } .config-header { + position: relative; display: flex; align-items: center; gap: 13px; @@ -560,8 +567,35 @@ export default { background: none; position: absolute; font-size: 12px; - bottom: -10px; - right: 21px; + bottom: -10%; + right: 3%; +} + +.custom-close-btn { + position: absolute; + top: 25%; + right: 0; + transform: translateY(-50%); + width: 35px; + height: 35px; + border-radius: 50%; + border: 2px solid #cfcfcf; + background: none; + font-size: 30px; + font-weight: lighter; + color: #cfcfcf; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + z-index: 1; + padding: 0; + outline: none; +} + +.custom-close-btn:hover { + color: #409EFF; + border-color: #409EFF; } \ No newline at end of file