Kaynağa Gözat

缩放改好-修改样式1

qdy 1 ay önce
ebeveyn
işleme
915b037edc

+ 9
- 10
projects/base-core/src/lib/components/sticky-header/sticky-header.component.scss Dosyayı Görüntüle

@@ -5,19 +5,18 @@
5 5
   transition: all 0.3s ease-in-out;
6 6
   margin-bottom: 1.5rem; /* 为内容区域提供间距 */
7 7
   align-self: flex-start; /* 确保在flex容器中sticky生效 */
8
-  background-color: white; /* 确保不透明,防止内容透出 */
8
+  background-color: transparent; /* 移除白色背景,消除白色边缘 */
9 9
   /* 创建新的层叠上下文,确保z-index生效 */
10 10
   transform: translateZ(0);
11 11
   will-change: transform;
12
-  /* 轻微的内阴影,增强立体感 */
13
-  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.8);
12
+  /* 移除顶部内阴影,消除白色边缘 */
14 13
   /* 确保内容区域填充高度 */
15 14
   display: flex;
16 15
   flex-direction: column;
17 16
 
18 17
   .header-content {
19 18
     background: #f8fafc; /* 简洁的灰白色背景 */
20
-    border-radius: 0.5rem;
19
+    border-radius: 0; /* 移除圆角,消除白色边缘 */
21 20
     border: 1px solid #e2e8f0; /* 柔和的边框 */
22 21
     box-shadow: 
23 22
       inset 0 2px 4px 0 rgba(0, 0, 0, 0.06), /* 轻微内阴影,创造凹陷感 */
@@ -66,17 +65,17 @@
66 65
     transform: none; /* 移除transform层叠上下文 */
67 66
     will-change: auto;
68 67
     box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); /* 外阴影,表示浮动状态 */
69
-    background-color: white; /* 确保背景不透明 */
68
+    background-color: transparent; /* 移除白色背景,消除白色边缘 */
70 69
     
71 70
     .header-content {
72
-      border-radius: 0.5rem;
71
+      border-radius: 0; /* 移除圆角,消除白色边缘 */
73 72
       box-shadow: 
74 73
         inset 0 2px 4px 0 rgba(0, 0, 0, 0.06),
75 74
         inset 0 0 0 1px rgba(255, 255, 255, 0.9),
76 75
         0 2px 4px 0 rgba(0, 0, 0, 0.1); /* 更强外阴影,强调固定状态 */
77 76
       background: #f1f5f9;
78 77
       border: 1px solid #cbd5e1;
79
-      margin: 1rem; /* 添加外边距,避免贴边 */
78
+      margin: 5px; /* 减少外边距,从1rem(16px)改为5px */
80 79
       /* 保持原padding大小 */
81 80
       height: 100%; /* 填充父容器高度 */
82 81
       min-height: 100%; /* 确保填充最小高度 */
@@ -120,7 +119,7 @@
120 119
   /* 缩小状态 - 在锁定基础上进一步缩小 */
121 120
   &.compact {
122 121
     .header-content {
123
-      border-radius: 0.375rem;
122
+      border-radius: 0; /* 移除圆角,消除白色边缘 */
124 123
       box-shadow: 
125 124
         inset 0 3px 6px 0 rgba(0, 0, 0, 0.08), /* 更强的内阴影,增强凹陷感 */
126 125
         inset 0 0 0 1px rgba(255, 255, 255, 0.8), /* 内边缘高光 */
@@ -132,8 +131,8 @@
132 131
       flex: 1; /* 填充可用空间 */
133 132
       
134 133
       > div:first-child {
135
-        padding-top: 0.375rem;
136
-        padding-bottom: 0.375rem;
134
+        padding-top: 1px; /* 减少上下空白,从6px改为1px */
135
+        padding-bottom: 1px; /* 减少上下空白,从6px改为1px */
137 136
       }
138 137
     }
139 138
 

+ 26
- 32
projects/base-core/src/lib/components/tree-nav/tree-nav.component.ts Dosyayı Görüntüle

@@ -1,4 +1,4 @@
1
-import { Component, OnInit } from '@angular/core';
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2 2
 import { CommonModule } from '@angular/common';
3 3
 import { Router, RouterLink, RouterLinkActive } from '@angular/router';
4 4
 import { MatTreeModule, MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
@@ -6,7 +6,6 @@ import { MatIconModule } from '@angular/material/icon';
6 6
 import { MatButtonModule } from '@angular/material/button';
7 7
 import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
8 8
 import { FlatTreeControl } from '@angular/cdk/tree';
9
-import { TreeService } from '../../services/tree.service';
10 9
 import { TreeNode } from '../../models/tree-node.model';
11 10
 
12 11
 interface FlatNode {
@@ -59,43 +58,40 @@ export class TreeNavComponent implements OnInit {
59 58
 
60 59
   dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
61 60
   isLoading = true;
61
+  
62
+  @Input() set treeData(data: TreeNode[]) {
63
+    if (data) {
64
+      console.log('树数据更新:', data);
65
+      if (data.length > 0) {
66
+        console.log('接收到的树数据图标检查:');
67
+        data.forEach((node: TreeNode, index: number) => {
68
+          console.log(`节点${index}: ${node.name}, 图标: ${node.icon}, 类型: ${node.type}, 路由: ${node.route}`);
69
+          if (node.children && node.children.length > 0) {
70
+            node.children.forEach((child: TreeNode, childIndex: number) => {
71
+              console.log(`  子节点${childIndex}: ${child.name}, 图标: ${child.icon}, 类型: ${child.type}, 路由: ${child.route}`);
72
+            });
73
+          }
74
+        });
75
+      }
76
+      this.dataSource.data = data;
77
+      this.treeControl.expandAll();
78
+      this.isLoading = false;
79
+    }
80
+  }
81
+  
82
+  @Output() refresh = new EventEmitter<void>();
62 83
 
63 84
   constructor(
64
-    private treeService: TreeService,
65 85
     public router: Router
66 86
   ) {}
67 87
 
68 88
   ngOnInit(): void {
69
-    this.loadTreeData();
89
+    // 数据由父组件通过 @Input() treeData 提供
70 90
   }
71 91
 
72 92
   loadTreeData(): void {
73 93
     this.isLoading = true;
74
-    this.treeService.getTree().subscribe({
75
-      next: (data: TreeNode[]) => {
76
-        console.log('树数据加载成功:', data);
77
-        // 调试:检查数据中的图标
78
-        if (data && data.length > 0) {
79
-          console.log('接收到的树数据图标检查:');
80
-          data.forEach((node: TreeNode, index: number) => {
81
-            console.log(`节点${index}: ${node.name}, 图标: ${node.icon}, 类型: ${node.type}, 路由: ${node.route}`);
82
-            if (node.children && node.children.length > 0) {
83
-              node.children.forEach((child: TreeNode, childIndex: number) => {
84
-                console.log(`  子节点${childIndex}: ${child.name}, 图标: ${child.icon}, 类型: ${child.type}, 路由: ${child.route}`);
85
-              });
86
-            }
87
-          });
88
-        }
89
-        this.dataSource.data = data;
90
-        // 默认展开所有节点
91
-        this.treeControl.expandAll();
92
-        this.isLoading = false;
93
-      },
94
-      error: (error: any) => {
95
-        console.error('树数据加载失败:', error);
96
-        this.isLoading = false;
97
-      }
98
-    });
94
+    this.refresh.emit();
99 95
   }
100 96
 
101 97
   hasChild = (_: number, node: FlatNode) => node.expandable;
@@ -117,7 +113,5 @@ export class TreeNavComponent implements OnInit {
117 113
     }
118 114
   }
119 115
 
120
-  refresh(): void {
121
-    this.loadTreeData();
122
-  }
116
+
123 117
 }

+ 1
- 1
projects/base-core/src/lib/services/index.ts Dosyayı Görüntüle

@@ -11,5 +11,5 @@ export * from './config.service';
11 11
 // export * from './skill.service';
12 12
 // export * from './tenant.service';
13 13
 export * from './toast.service';
14
-export * from './tree.service';
14
+
15 15
 // export * from './user.service';

+ 0
- 180
projects/base-core/src/lib/services/tree.service.ts Dosyayı Görüntüle

@@ -1,180 +0,0 @@
1
-import { Injectable } from '@angular/core';
2
-import { HttpClient } from '@angular/common/http';
3
-import { Observable, of, catchError, map } from 'rxjs';
4
-import { TreeNode } from '../models/tree-node.model';
5
-import { ConfigService } from './config.service';
6
-
7
-@Injectable({
8
-  providedIn: 'root'
9
-})
10
-export class TreeService {
11
-  constructor(
12
-    private http: HttpClient,
13
-    private config: ConfigService
14
-  ) {}
15
-
16
-  getTree(): Observable<TreeNode[]> {
17
-    console.log('TreeService.getTree() 调用');
18
-    console.log('config.useMockData:', this.config.useMockData);
19
-    console.log('config.apiBaseUrl:', this.config.apiBaseUrl);
20
-    
21
-    if (this.config.useMockData) {
22
-      console.log('使用模拟树数据');
23
-      const mockTree = this.getMockTree();
24
-      console.log('模拟数据节点数:', mockTree.length);
25
-      // 调试:打印第一个节点的图标信息
26
-      if (mockTree.length > 0 && mockTree[0].children) {
27
-        console.log('[模拟数据]第一个分组节点图标:', mockTree[0].icon);
28
-        console.log('[模拟数据]第一个分组子节点图标:', mockTree[0].children.map(c => ({name: c.name, icon: c.icon})));
29
-      }
30
-      console.log('模拟数据结构:', JSON.stringify(mockTree, null, 2));
31
-      return of(mockTree);
32
-    }
33
-    
34
-    const apiUrl = `${this.config.apiBaseUrl}/projects/tree`;
35
-    console.log('请求树数据:', apiUrl);
36
-    
37
-    return this.http.get<any>(apiUrl).pipe(
38
-      map(response => {
39
-        console.log('树数据响应:', response);
40
-        // 后端返回 {success: true, data: [...]}
41
-        if (response && response.success && response.data) {
42
-          console.log('提取data字段,节点数:', response.data.length);
43
-          // 调试:打印第一个节点的图标信息
44
-          if (response.data.length > 0 && response.data[0].children) {
45
-            console.log('第一个分组节点图标:', response.data[0].icon);
46
-            console.log('第一个分组子节点图标:', response.data[0].children.map((c: any) => ({name: c.name, icon: c.icon})));
47
-          }
48
-          return response.data;
49
-        } else {
50
-          console.warn('响应格式不符合预期,返回空数组');
51
-          return [];
52
-        }
53
-      }),
54
-      catchError((error) => {
55
-        console.error('获取树数据失败:', error);
56
-        console.error('错误详情:', error.status, error.message, error.url);
57
-        // 认证失败或其他错误时返回空数组,不显示模拟数据
58
-        console.warn('API请求失败,回退到模拟数据');
59
-        const mockTree = this.getMockTree();
60
-        console.log('回退模拟数据节点数:', mockTree.length);
61
-        return of(mockTree);
62
-      })
63
-    );
64
-  }
65
-
66
-  private getMockTree(): TreeNode[] {
67
-    // 模拟树数据,基于Go后端返回的结构
68
-    return [
69
-      {
70
-        id: 'home',
71
-        name: '首页',
72
-        icon: 'home',
73
-        type: 'group',
74
-        children: [
75
-          {
76
-            id: 'readme',
77
-            name: '说明',
78
-            icon: 'description',
79
-            type: 'page',
80
-            route: '/home/readme'
81
-          }
82
-        ]
83
-      },
84
-      {
85
-        id: 'service-group',
86
-        name: '服务',
87
-        icon: 'settings',
88
-        type: 'group',
89
-        children: [
90
-          {
91
-            id: 'service-register',
92
-            name: '注册服务配置',
93
-            icon: 'app_registration',
94
-            type: 'page',
95
-            route: '/service/register-config'
96
-          },
97
-          {
98
-            id: 'service-management',
99
-            name: '微服务管理',
100
-            icon: 'dns',
101
-            type: 'page',
102
-            route: '/service/management'
103
-          },
104
-          {
105
-            id: 'service-config',
106
-            name: '微服务配置管理',
107
-            icon: 'settings_applications',
108
-            type: 'page',
109
-            route: '/service/config-management'
110
-          },
111
-          {
112
-            id: 'boot-config',
113
-            name: '微服务启动配置管理',
114
-            icon: 'play_circle',
115
-            type: 'page',
116
-            route: '/service/boot-config'
117
-          }
118
-        ]
119
-      },
120
-      {
121
-        id: 'user-group',
122
-        name: '项目',
123
-        icon: 'folder',
124
-        type: 'group',
125
-        children: [
126
-          {
127
-            id: 'project-management',
128
-            name: '项目管理',
129
-            icon: 'folder_open',
130
-            type: 'page',
131
-            route: '/project/list'
132
-          },
133
-          {
134
-            id: 'agent-management',
135
-            name: 'Agent管理',
136
-            icon: 'smart_toy',
137
-            type: 'page',
138
-            route: '/agent/list'
139
-          },
140
-          {
141
-            id: 'skill-management',
142
-            name: 'Skill管理',
143
-            icon: 'build',
144
-            type: 'page',
145
-            route: '/skill/list'
146
-          }
147
-        ]
148
-      },
149
-      {
150
-        id: 'tenant-group',
151
-        name: '租户管理',
152
-        icon: 'apartment',
153
-        type: 'group',
154
-        children: [
155
-          {
156
-            id: 'tenant-management',
157
-            name: '租户管理',
158
-            icon: 'apartment',
159
-            type: 'page',
160
-            route: '/tenant/list'
161
-          },
162
-          {
163
-            id: 'role-management',
164
-            name: '角色管理',
165
-            icon: 'admin_panel_settings',
166
-            type: 'page',
167
-            route: '/role/list'
168
-          },
169
-          {
170
-            id: 'user-management',
171
-            name: '用户管理',
172
-            icon: 'people',
173
-            type: 'page',
174
-            route: '/user/list'
175
-          }
176
-        ]
177
-      }
178
-    ];
179
-  }
180
-}

Loading…
İptal
Kaydet