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 @@
+
@@ -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