Quellcode durchsuchen

markdow能显示

qdy vor 1 Monat
Ursprung
Commit
2a945904eb

+ 2
- 1
gct.sh Datei anzeigen

@@ -14,7 +14,8 @@ git push -u origin master
14 14
 
15 15
 # 创建标签(关键修改在这里)
16 16
 # 方法1:使用注释标签(推荐,不会打开编辑器)
17
-git tag -a "$TAG_VERSION" -m "Release $TAG_VERSION"
17
+# git tag -a "$TAG_VERSION" -m "Release $TAG_VERSION"
18
+git tag -a "$TAG_VERSION" -m "$COMMIT_MSG"
18 19
 
19 20
 # 或者方法2:如果你需要GPG签名,使用这个
20 21
 # GIT_EDITOR=true git tag -s "$TAG_VERSION" -m "Release $TAG_VERSION"

+ 18
- 0
web/package-lock.json Datei anzeigen

@@ -20,6 +20,7 @@
20 20
         "@angular/router": "^19.2.0",
21 21
         "@types/marked": "^5.0.2",
22 22
         "marked": "^17.0.1",
23
+        "prismjs": "^1.30.0",
23 24
         "rxjs": "~7.8.0",
24 25
         "tslib": "^2.3.0",
25 26
         "zone.js": "~0.15.0"
@@ -29,6 +30,7 @@
29 30
         "@angular/cli": "^19.2.8",
30 31
         "@angular/compiler-cli": "^19.2.0",
31 32
         "@types/jasmine": "~5.1.0",
33
+        "@types/prismjs": "^1.26.5",
32 34
         "autoprefixer": "^10.4.23",
33 35
         "jasmine-core": "~5.6.0",
34 36
         "karma": "~6.4.0",
@@ -5785,6 +5787,13 @@
5785 5787
         "@types/node": "*"
5786 5788
       }
5787 5789
     },
5790
+    "node_modules/@types/prismjs": {
5791
+      "version": "1.26.5",
5792
+      "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz",
5793
+      "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==",
5794
+      "dev": true,
5795
+      "license": "MIT"
5796
+    },
5788 5797
     "node_modules/@types/qs": {
5789 5798
       "version": "6.14.0",
5790 5799
       "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
@@ -12322,6 +12331,15 @@
12322 12331
       "dev": true,
12323 12332
       "license": "MIT"
12324 12333
     },
12334
+    "node_modules/prismjs": {
12335
+      "version": "1.30.0",
12336
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
12337
+      "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
12338
+      "license": "MIT",
12339
+      "engines": {
12340
+        "node": ">=6"
12341
+      }
12342
+    },
12325 12343
     "node_modules/proc-log": {
12326 12344
       "version": "5.0.0",
12327 12345
       "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",

+ 3
- 1
web/package.json Datei anzeigen

@@ -16,12 +16,13 @@
16 16
     "@angular/compiler": "^19.2.0",
17 17
     "@angular/core": "^19.2.0",
18 18
     "@angular/forms": "^19.2.0",
19
+    "@angular/material": "^19.2.19",
19 20
     "@angular/platform-browser": "^19.2.0",
20 21
     "@angular/platform-browser-dynamic": "^19.2.0",
21 22
     "@angular/router": "^19.2.0",
22
-    "@angular/material": "^19.2.19",
23 23
     "@types/marked": "^5.0.2",
24 24
     "marked": "^17.0.1",
25
+    "prismjs": "^1.30.0",
25 26
     "rxjs": "~7.8.0",
26 27
     "tslib": "^2.3.0",
27 28
     "zone.js": "~0.15.0"
@@ -31,6 +32,7 @@
31 32
     "@angular/cli": "^19.2.8",
32 33
     "@angular/compiler-cli": "^19.2.0",
33 34
     "@types/jasmine": "~5.1.0",
35
+    "@types/prismjs": "^1.26.5",
34 36
     "autoprefixer": "^10.4.23",
35 37
     "jasmine-core": "~5.6.0",
36 38
     "karma": "~6.4.0",

+ 1
- 3
web/src/app/app.component.ts Datei anzeigen

@@ -36,9 +36,7 @@ export class AppComponent implements OnInit {
36 36
   }
37 37
   
38 38
   get isLoginPage(): boolean {
39
-    const isLogin = this.router.url.includes('/login');
40
-    console.log('isLoginPage检查,当前路由:', this.router.url, '结果:', isLogin);
41
-    return isLogin;
39
+    return this.router.url.includes('/login');
42 40
   }
43 41
 
44 42
   startDrag(event: MouseEvent) {

+ 29
- 179
web/src/app/pages/home/home.component.html Datei anzeigen

@@ -1,188 +1,38 @@
1
-<div class="max-w-6xl mx-auto py-8 px-4">
2
-  <!-- 欢迎标题 -->
3
-  <div class="text-center mb-12">
4
-    <h1 class="text-4xl font-bold text-gray-800 mb-4">欢迎来到配置管理中心</h1>
5
-    <p class="text-lg text-gray-600 max-w-3xl mx-auto">
6
-      一个集中化的平台,用于管理您的微服务、项目、权限和系统配置。通过左侧导航菜单快速访问各项功能。
7
-    </p>
1
+<div class="max-w-7xl mx-auto py-6 px-4">
2
+  <!-- 加载状态 -->
3
+  <div *ngIf="isLoading" class="flex flex-col items-center justify-center min-h-[400px]">
4
+    <mat-spinner diameter="48"></mat-spinner>
5
+    <p class="mt-4 text-gray-600">正在加载文档...</p>
8 6
   </div>
9 7
 
10
-  <!-- 功能卡片网格 -->
11
-  <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-12">
12
-    <!-- 服务管理卡片 -->
13
-    <mat-card class="hover:shadow-lg transition-shadow duration-300">
14
-      <mat-card-header class="pb-2">
15
-        <div class="w-12 h-12 bg-gradient-to-r from-blue-500 to-blue-600 rounded-lg flex items-center justify-center mr-3">
16
-          <mat-icon class="text-white">settings</mat-icon>
17
-        </div>
18
-        <mat-card-title class="text-xl font-semibold">服务管理</mat-card-title>
19
-        <mat-card-subtitle class="text-gray-500">微服务配置与监控</mat-card-subtitle>
20
-      </mat-card-header>
21
-      <mat-card-content>
22
-        <p class="text-gray-600">
23
-          管理微服务的注册、配置、启动参数和运行状态。支持 Consul 服务发现和健康检查。
24
-        </p>
25
-        <ul class="mt-3 space-y-1 text-sm text-gray-500">
26
-          <li class="flex items-center">
27
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
28
-            <span>服务注册配置</span>
29
-          </li>
30
-          <li class="flex items-center">
31
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
32
-            <span>微服务管理</span>
33
-          </li>
34
-          <li class="flex items-center">
35
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
36
-            <span>配置管理</span>
37
-          </li>
38
-          <li class="flex items-center">
39
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
40
-            <span>启动配置</span>
41
-          </li>
42
-        </ul>
43
-      </mat-card-content>
44
-      <mat-card-actions>
45
-        <button mat-button color="primary" [routerLink]="'/service/management'">
46
-          进入服务管理
47
-          <mat-icon>arrow_forward</mat-icon>
48
-        </button>
49
-      </mat-card-actions>
50
-    </mat-card>
51
-
52
-    <!-- 项目管理卡片 -->
53
-    <mat-card class="hover:shadow-lg transition-shadow duration-300">
54
-      <mat-card-header class="pb-2">
55
-        <div class="w-12 h-12 bg-gradient-to-r from-green-500 to-green-600 rounded-lg flex items-center justify-center mr-3">
56
-          <mat-icon class="text-white">folder</mat-icon>
57
-        </div>
58
-        <mat-card-title class="text-xl font-semibold">项目管理</mat-card-title>
59
-        <mat-card-subtitle class="text-gray-500">项目、Agent与Skill</mat-card-subtitle>
60
-      </mat-card-header>
61
-      <mat-card-content>
62
-        <p class="text-gray-600">
63
-          管理项目、AI Agent 和技能 (Skills)。为不同项目分配资源和配置。
64
-        </p>
65
-        <ul class="mt-3 space-y-1 text-sm text-gray-500">
66
-          <li class="flex items-center">
67
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
68
-            <span>项目管理</span>
69
-          </li>
70
-          <li class="flex items-center">
71
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
72
-            <span>Agent 管理</span>
73
-          </li>
74
-          <li class="flex items-center">
75
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
76
-            <span>Skill 管理</span>
77
-          </li>
78
-        </ul>
79
-      </mat-card-content>
80
-      <mat-card-actions>
81
-        <button mat-button color="primary" [routerLink]="'/project/list'">
82
-          进入项目管理
83
-          <mat-icon>arrow_forward</mat-icon>
84
-        </button>
85
-      </mat-card-actions>
86
-    </mat-card>
87
-
88
-    <!-- 权限管理卡片 -->
89
-    <mat-card class="hover:shadow-lg transition-shadow duration-300">
90
-      <mat-card-header class="pb-2">
91
-        <div class="w-12 h-12 bg-gradient-to-r from-purple-500 to-purple-600 rounded-lg flex items-center justify-center mr-3">
92
-          <mat-icon class="text-white">shield</mat-icon>
93
-        </div>
94
-        <mat-card-title class="text-xl font-semibold">权限管理</mat-card-title>
95
-        <mat-card-subtitle class="text-gray-500">租户、角色与用户</mat-card-subtitle>
96
-      </mat-card-header>
97
-      <mat-card-content>
98
-        <p class="text-gray-600">
99
-          管理多租户环境、角色权限和用户账户。支持细粒度的访问控制和权限分配。
100
-        </p>
101
-        <ul class="mt-3 space-y-1 text-sm text-gray-500">
102
-          <li class="flex items-center">
103
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
104
-            <span>租户管理</span>
105
-          </li>
106
-          <li class="flex items-center">
107
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
108
-            <span>角色管理</span>
109
-          </li>
110
-          <li class="flex items-center">
111
-            <mat-icon class="text-green-500 text-sm mr-1">check_circle</mat-icon>
112
-            <span>用户管理</span>
113
-          </li>
114
-        </ul>
115
-      </mat-card-content>
116
-      <mat-card-actions>
117
-        <button mat-button color="primary" [routerLink]="'/tenant/list'">
118
-          进入权限管理
119
-          <mat-icon>arrow_forward</mat-icon>
120
-        </button>
121
-      </mat-card-actions>
122
-    </mat-card>
8
+  <!-- 错误状态 -->
9
+  <div *ngIf="!isLoading && error" class="flex flex-col items-center justify-center min-h-[400px]">
10
+    <div class="text-center max-w-md">
11
+      <mat-icon class="text-red-500 text-6xl mb-4">error</mat-icon>
12
+      <h2 class="text-2xl font-bold text-gray-800 mb-2">加载失败</h2>
13
+      <p class="text-gray-600 mb-6">{{ error }}</p>
14
+      <button mat-raised-button color="primary" (click)="retry()">
15
+        <mat-icon>refresh</mat-icon>
16
+        重试
17
+      </button>
18
+    </div>
123 19
   </div>
124 20
 
125
-  <!-- 快速操作区域 -->
126
-  <div class="bg-gradient-to-r from-blue-50 to-indigo-50 rounded-2xl p-8 mb-12">
127
-    <div class="flex flex-col md:flex-row items-center justify-between">
128
-      <div class="mb-6 md:mb-0 md:mr-8">
129
-        <h2 class="text-2xl font-bold text-gray-800 mb-2">开始快速操作</h2>
130
-        <p class="text-gray-600">选择以下常用操作快速开始工作</p>
131
-      </div>
132
-      <div class="flex flex-wrap gap-4">
133
-        <button mat-flat-button color="primary" [routerLink]="'/service/register-config'">
134
-          <mat-icon>add_circle</mat-icon>
135
-          添加服务配置
136
-        </button>
137
-        <button mat-stroked-button color="primary" [routerLink]="'/project/list'">
138
-          <mat-icon>create_new_folder</mat-icon>
139
-          创建新项目
140
-        </button>
141
-        <button mat-stroked-button color="accent" [routerLink]="'/user/list'">
142
-          <mat-icon>person_add</mat-icon>
143
-          添加用户
144
-        </button>
145
-      </div>
146
-    </div>
21
+  <!-- Markdown 内容 -->
22
+  <div *ngIf="!isLoading && !error && markdownContent" class="markdown-content-container">
23
+    <div class="markdown-content" [innerHTML]="markdownContent"></div>
147 24
   </div>
148 25
 
149
-  <!-- 系统状态 -->
150
-  <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
151
-    <div class="bg-white rounded-xl border border-gray-200 p-6">
152
-      <div class="flex items-center justify-between">
153
-        <div>
154
-          <p class="text-sm text-gray-500">系统版本</p>
155
-          <p class="text-2xl font-bold text-gray-800">v1.0.0</p>
156
-        </div>
157
-        <div class="w-12 h-12 bg-green-100 rounded-full flex items-center justify-center">
158
-          <mat-icon class="text-green-600">code</mat-icon>
159
-        </div>
160
-      </div>
161
-      <p class="text-sm text-gray-500 mt-4">基于 Angular 19 + Go 微服务架构</p>
162
-    </div>
163
-    <div class="bg-white rounded-xl border border-gray-200 p-6">
164
-      <div class="flex items-center justify-between">
165
-        <div>
166
-          <p class="text-sm text-gray-500">在线服务</p>
167
-          <p class="text-2xl font-bold text-gray-800">8/10</p>
168
-        </div>
169
-        <div class="w-12 h-12 bg-blue-100 rounded-full flex items-center justify-center">
170
-          <mat-icon class="text-blue-600">cloud_done</mat-icon>
171
-        </div>
172
-      </div>
173
-      <p class="text-sm text-gray-500 mt-4">服务健康状态良好</p>
174
-    </div>
175
-    <div class="bg-white rounded-xl border border-gray-200 p-6">
176
-      <div class="flex items-center justify-between">
177
-        <div>
178
-          <p class="text-sm text-gray-500">活跃用户</p>
179
-          <p class="text-2xl font-bold text-gray-800">24</p>
180
-        </div>
181
-        <div class="w-12 h-12 bg-purple-100 rounded-full flex items-center justify-center">
182
-          <mat-icon class="text-purple-600">group</mat-icon>
183
-        </div>
184
-      </div>
185
-      <p class="text-sm text-gray-500 mt-4">最近24小时活跃用户</p>
26
+  <!-- 空状态 -->
27
+  <div *ngIf="!isLoading && !error && !markdownContent" class="flex flex-col items-center justify-center min-h-[400px]">
28
+    <div class="text-center max-w-md">
29
+      <mat-icon class="text-gray-400 text-6xl mb-4">description</mat-icon>
30
+      <h2 class="text-2xl font-bold text-gray-800 mb-2">文档为空</h2>
31
+      <p class="text-gray-600 mb-6">没有找到文档内容</p>
32
+      <button mat-raised-button color="primary" (click)="retry()">
33
+        <mat-icon>refresh</mat-icon>
34
+        重试
35
+      </button>
186 36
     </div>
187 37
   </div>
188 38
 </div>

+ 265
- 11
web/src/app/pages/home/home.component.scss Datei anzeigen

@@ -2,20 +2,274 @@
2 2
   display: block;
3 3
 }
4 4
 
5
-.mat-mdc-card {
6
-  border-radius: 12px;
5
+.markdown-content-container {
6
+  max-width: 100%;
7 7
   overflow: hidden;
8 8
 }
9 9
 
10
-.mat-mdc-card-header {
11
-  padding: 24px 24px 8px 24px;
12
-}
10
+.markdown-content {
11
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
12
+  line-height: 1.7;
13
+  color: #374151;
13 14
 
14
-.mat-mdc-card-content {
15
-  padding: 0 24px 16px 24px;
16
-}
15
+  /* 标题样式 */
16
+  h1 {
17
+    font-size: 2.25rem;
18
+    font-weight: 800;
19
+    margin-top: 2rem;
20
+    margin-bottom: 1rem;
21
+    padding-bottom: 0.5rem;
22
+    border-bottom: 2px solid #e5e7eb;
23
+    color: #111827;
24
+  }
25
+
26
+  h2 {
27
+    font-size: 1.875rem;
28
+    font-weight: 700;
29
+    margin-top: 2rem;
30
+    margin-bottom: 1rem;
31
+    padding-bottom: 0.5rem;
32
+    border-bottom: 1px solid #e5e7eb;
33
+    color: #1f2937;
34
+  }
35
+
36
+  h3 {
37
+    font-size: 1.5rem;
38
+    font-weight: 600;
39
+    margin-top: 1.5rem;
40
+    margin-bottom: 0.75rem;
41
+    color: #374151;
42
+  }
43
+
44
+  h4 {
45
+    font-size: 1.25rem;
46
+    font-weight: 600;
47
+    margin-top: 1.25rem;
48
+    margin-bottom: 0.5rem;
49
+    color: #4b5563;
50
+  }
51
+
52
+  h5 {
53
+    font-size: 1.125rem;
54
+    font-weight: 600;
55
+    margin-top: 1rem;
56
+    margin-bottom: 0.5rem;
57
+    color: #6b7280;
58
+  }
59
+
60
+  h6 {
61
+    font-size: 1rem;
62
+    font-weight: 600;
63
+    margin-top: 0.75rem;
64
+    margin-bottom: 0.5rem;
65
+    color: #6b7280;
66
+  }
67
+
68
+  /* 段落和文字 */
69
+  p {
70
+    margin-top: 1rem;
71
+    margin-bottom: 1rem;
72
+  }
73
+
74
+  strong {
75
+    font-weight: 700;
76
+    color: #374151;
77
+  }
78
+
79
+  em {
80
+    font-style: italic;
81
+  }
82
+
83
+  a {
84
+    color: #2563eb;
85
+    text-decoration: none;
86
+    &:hover {
87
+      text-decoration: underline;
88
+      color: #1d4ed8;
89
+    }
90
+    &:focus {
91
+      outline: 2px solid #3b82f6;
92
+      outline-offset: 2px;
93
+    }
94
+  }
95
+
96
+  /* 列表 */
97
+  ul, ol {
98
+    margin-top: 0.75rem;
99
+    margin-bottom: 0.75rem;
100
+    padding-left: 2rem;
101
+  }
102
+
103
+  li {
104
+    margin-top: 0.25rem;
105
+    margin-bottom: 0.25rem;
106
+  }
107
+
108
+  ul {
109
+    list-style-type: disc;
110
+  }
111
+
112
+  ol {
113
+    list-style-type: decimal;
114
+  }
115
+
116
+  li > ul,
117
+  li > ol {
118
+    margin-top: 0.25rem;
119
+    margin-bottom: 0.25rem;
120
+  }
121
+
122
+  /* 代码块 - 使用prism.js样式 */
123
+  pre {
124
+    margin-top: 1rem;
125
+    margin-bottom: 1rem;
126
+    overflow-x: auto;
127
+    border-radius: 0.5rem;
128
+    
129
+    /* 确保prism代码块正常显示 */
130
+    &.prism-code {
131
+      background-color: #1f2937;
132
+      color: #f3f4f6;
133
+      padding: 1.25rem;
134
+      font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
135
+      font-size: 0.875rem;
136
+      line-height: 1.6;
137
+      
138
+      code {
139
+        background-color: transparent;
140
+        color: inherit;
141
+        padding: 0;
142
+        font-family: inherit;
143
+      }
144
+    }
145
+  }
146
+
147
+  /* 行内代码 - 不使用prism的代码 */
148
+  code:not(.prism-code code) {
149
+    background-color: #f3f4f6;
150
+    color: #dc2626;
151
+    padding: 0.125rem 0.375rem;
152
+    border-radius: 0.25rem;
153
+    font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
154
+    font-size: 0.875rem;
155
+  }
156
+
157
+  /* 引用 */
158
+  blockquote {
159
+    margin-top: 1rem;
160
+    margin-bottom: 1rem;
161
+    padding: 0.75rem 1.25rem;
162
+    background-color: #f9fafb;
163
+    border-left: 4px solid #d1d5db;
164
+    color: #4b5563;
165
+    border-radius: 0.25rem;
166
+
167
+    p {
168
+      margin-top: 0;
169
+      margin-bottom: 0.5rem;
170
+      &:last-child {
171
+        margin-bottom: 0;
172
+      }
173
+    }
174
+  }
175
+
176
+  /* 表格 */
177
+  table {
178
+    width: 100%;
179
+    border-collapse: collapse;
180
+    margin-top: 1rem;
181
+    margin-bottom: 1rem;
182
+    font-size: 0.875rem;
183
+  }
184
+
185
+  th {
186
+    background-color: #f3f4f6;
187
+    font-weight: 600;
188
+    text-align: left;
189
+    padding: 0.75rem;
190
+    border: 1px solid #d1d5db;
191
+    color: #374151;
192
+  }
193
+
194
+  td {
195
+    padding: 0.75rem;
196
+    border: 1px solid #d1d5db;
197
+    color: #4b5563;
198
+  }
199
+
200
+  tr:nth-child(even) {
201
+    background-color: #f9fafb;
202
+  }
203
+
204
+  /* 水平线 */
205
+  hr {
206
+    margin-top: 2rem;
207
+    margin-bottom: 2rem;
208
+    border: 0;
209
+    border-top: 1px solid #e5e7eb;
210
+  }
211
+
212
+  /* 图片 */
213
+  img {
214
+    max-width: 100%;
215
+    height: auto;
216
+    margin-top: 1rem;
217
+    margin-bottom: 1rem;
218
+    border-radius: 0.375rem;
219
+  }
220
+
221
+  /* 内联代码块 - 不使用prism样式 */
222
+  p code:not(.prism-code code),
223
+  li code:not(.prism-code code),
224
+  td code:not(.prism-code code) {
225
+    background-color: #f3f4f6;
226
+    color: #dc2626;
227
+    padding: 0.125rem 0.375rem;
228
+    border-radius: 0.25rem;
229
+    font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
230
+    font-size: 0.875rem;
231
+  }
232
+
233
+  /* 任务列表 */
234
+  input[type="checkbox"] {
235
+    margin-right: 0.5rem;
236
+  }
237
+
238
+  /* 打印样式 */
239
+  @media print {
240
+    pre:not(.prism-code),
241
+    code:not(.prism-code code) {
242
+      white-space: pre-wrap;
243
+      word-break: break-word;
244
+    }
245
+    
246
+    table {
247
+      page-break-inside: avoid;
248
+    }
249
+    
250
+    .prism-code {
251
+      background-color: #f8f9fa !important;
252
+      color: #212529 !important;
253
+    }
254
+  }
17 255
 
18
-.mat-mdc-card-actions {
19
-  padding: 0 24px 24px 24px;
20
-  gap: 8px;
256
+  /* 响应式调整 */
257
+  @media (max-width: 768px) {
258
+    h1 {
259
+      font-size: 1.875rem;
260
+    }
261
+    
262
+    h2 {
263
+      font-size: 1.5rem;
264
+    }
265
+    
266
+    h3 {
267
+      font-size: 1.25rem;
268
+    }
269
+    
270
+    pre {
271
+      font-size: 0.8125rem;
272
+      padding: 1rem;
273
+    }
274
+  }
21 275
 }

+ 52
- 8
web/src/app/pages/home/home.component.ts Datei anzeigen

@@ -1,21 +1,65 @@
1
-import { Component } from '@angular/core';
1
+import { Component, OnInit, OnDestroy } from '@angular/core';
2 2
 import { CommonModule } from '@angular/common';
3
-import { MatCardModule } from '@angular/material/card';
4
-import { MatIconModule } from '@angular/material/icon';
3
+import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
5 4
 import { MatButtonModule } from '@angular/material/button';
6
-import { RouterLink } from '@angular/router';
5
+import { MatIconModule } from '@angular/material/icon';
6
+import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
7
+import { MarkdownService } from '../../services/markdown.service';
8
+import { Subscription } from 'rxjs';
7 9
 
8 10
 @Component({
9 11
   selector: 'app-home',
10 12
   standalone: true,
11 13
   imports: [
12 14
     CommonModule,
13
-    MatCardModule,
14
-    MatIconModule,
15
+    MatProgressSpinnerModule,
15 16
     MatButtonModule,
16
-    RouterLink
17
+    MatIconModule
17 18
   ],
18 19
   templateUrl: './home.component.html',
19 20
   styleUrl: './home.component.scss'
20 21
 })
21
-export class HomeComponent {}
22
+export class HomeComponent implements OnInit, OnDestroy {
23
+  markdownContent: SafeHtml | null = null;
24
+  isLoading = false;
25
+  error: string | null = null;
26
+  
27
+  private subscription: Subscription | null = null;
28
+
29
+  constructor(
30
+    private markdownService: MarkdownService,
31
+    private sanitizer: DomSanitizer
32
+  ) {}
33
+
34
+  ngOnInit(): void {
35
+    this.loadMarkdown();
36
+  }
37
+
38
+  ngOnDestroy(): void {
39
+    if (this.subscription) {
40
+      this.subscription.unsubscribe();
41
+    }
42
+  }
43
+
44
+  loadMarkdown(): void {
45
+    this.isLoading = true;
46
+    this.error = null;
47
+    this.markdownContent = null;
48
+
49
+    this.subscription = this.markdownService.getConfigureReadme().subscribe({
50
+      next: (htmlContent) => {
51
+        this.markdownContent = this.sanitizer.bypassSecurityTrustHtml(htmlContent);
52
+        this.isLoading = false;
53
+      },
54
+      error: (err) => {
55
+        console.error('加载文档失败:', err);
56
+        this.error = '无法加载文档,请稍后重试';
57
+        this.isLoading = false;
58
+      }
59
+    });
60
+  }
61
+
62
+  retry(): void {
63
+    this.loadMarkdown();
64
+  }
65
+}

+ 19
- 11
web/src/app/services/auth.service.ts Datei anzeigen

@@ -57,18 +57,26 @@ export class AuthService {
57 57
     console.log('本地存储Basic认证:', basicAuth ? '有' : '无');
58 58
     console.log('本地存储用户:', user);
59 59
 
60
-    // 清除旧的认证信息,强制重新登录
61
-    // 这确保每次启动应用都需要重新认证,提高安全性
62
-    // 如果希望持久化登录,可以移除下面的清除代码
63
-    if (basicAuth || user) {
64
-      console.log('清除旧的认证信息,需要重新登录');
65
-      this.clearAuthData();
60
+    // 从本地存储恢复认证状态
61
+    if (basicAuth && user) {
62
+      console.log('从本地存储恢复认证状态');
63
+      this.authState.next({
64
+        isAuthenticated: true,
65
+        basicAuth,
66
+        user
67
+      });
68
+    } else {
69
+      console.log('未找到保存的认证信息,需要重新登录');
70
+      // 清除可能的不完整数据
71
+      if (basicAuth || user) {
72
+        console.log('清除不完整的认证数据');
73
+        this.clearAuthData();
74
+      }
75
+      // 初始状态设置为未认证
76
+      this.authState.next({
77
+        isAuthenticated: false
78
+      });
66 79
     }
67
-    
68
-    // 初始状态设置为未认证
69
-    this.authState.next({
70
-      isAuthenticated: false
71
-    });
72 80
   }
73 81
 
74 82
   login(username: string, password: string): Observable<LoginResponse> {

+ 61
- 3
web/src/app/services/markdown.service.ts Datei anzeigen

@@ -2,15 +2,27 @@ import { Injectable } from '@angular/core';
2 2
 import { HttpClient } from '@angular/common/http';
3 3
 import { Observable, catchError, map, of } from 'rxjs';
4 4
 import * as marked from 'marked';
5
+import * as Prism from 'prismjs';
6
+
7
+// 导入常用语言支持
8
+import 'prismjs/components/prism-javascript';
9
+import 'prismjs/components/prism-typescript';
10
+import 'prismjs/components/prism-go';
11
+import 'prismjs/components/prism-bash';
12
+import 'prismjs/components/prism-json';
13
+import 'prismjs/components/prism-yaml';
14
+import 'prismjs/components/prism-sql';
15
+import 'prismjs/components/prism-css';
16
+import 'prismjs/components/prism-scss';
5 17
 
6 18
 @Injectable({
7 19
   providedIn: 'root'
8 20
 })
9 21
 export class MarkdownService {
10
-  private readonly basePath = 'assets/docs/';
22
+  private readonly basePath = 'docs/';
11 23
 
12 24
   constructor(private http: HttpClient) {
13
-    // 配置marked选项
25
+    // 配置marked选项和自定义渲染器
14 26
     marked.setOptions({
15 27
       gfm: true, // GitHub Flavored Markdown
16 28
       breaks: true, // 将换行符转换为<br>
@@ -21,11 +33,13 @@ export class MarkdownService {
21 33
 
22 34
   getMarkdown(fileName: string): Observable<string> {
23 35
     const filePath = `${this.basePath}${fileName}`;
36
+    console.log('Requesting markdown file:', filePath);
24 37
     
25 38
     return this.http.get(filePath, { responseType: 'text' }).pipe(
26 39
       map(markdown => this.parseMarkdown(markdown)),
27 40
       catchError(error => {
28 41
         console.error(`无法加载markdown文件: ${filePath}`, error);
42
+        console.error('Error details:', error.status, error.url, error.message);
29 43
         return of(`<div class="text-red-500">无法加载文档: ${fileName}</div>`);
30 44
       })
31 45
     );
@@ -37,13 +51,57 @@ export class MarkdownService {
37 51
 
38 52
   private parseMarkdown(markdown: string): string {
39 53
     try {
40
-      return marked.parse(markdown) as string;
54
+      // 配置自定义渲染器支持代码高亮
55
+      const renderer = new marked.Renderer();
56
+      
57
+      // 重写code渲染器以支持prismjs语法高亮
58
+      // marked v17+ 使用对象参数 { text, lang, escaped }
59
+      const originalCode = renderer.code;
60
+      renderer.code = ({ text, lang, escaped }: { text: string; lang?: string; escaped?: boolean }): string => {
61
+        const validLanguage = this.getValidLanguage(lang);
62
+        const highlightedCode = validLanguage 
63
+          ? Prism.highlight(text, Prism.languages[validLanguage], validLanguage)
64
+          : this.escapeHtml(text);
65
+        
66
+        return `<pre class="prism-code language-${validLanguage || 'none'}"><code class="language-${validLanguage || 'none'}">${highlightedCode}</code></pre>`;
67
+      };
68
+      
69
+      // 使用自定义渲染器解析markdown
70
+      return marked.parse(markdown, { renderer }) as string;
41 71
     } catch (error) {
42 72
       console.error('Markdown解析错误:', error);
43 73
       return `<pre class="p-4 bg-gray-100 rounded overflow-auto">${this.escapeHtml(markdown)}</pre>`;
44 74
     }
45 75
   }
46 76
 
77
+  private getValidLanguage(language: string | undefined): string | undefined {
78
+    if (!language) return undefined;
79
+    
80
+    // 清理语言标识,移除可能的前缀
81
+    const cleanLanguage = language.toLowerCase().trim();
82
+    
83
+    // 检查是否支持的语言
84
+    const supportedLanguages = ['javascript', 'typescript', 'js', 'ts', 'go', 'bash', 'sh', 'shell', 'json', 'yaml', 'yml', 'sql', 'css', 'scss', 'html', 'xml'];
85
+    
86
+    // 映射别名
87
+    const languageMap: Record<string, string> = {
88
+      'js': 'javascript',
89
+      'ts': 'typescript',
90
+      'sh': 'bash',
91
+      'shell': 'bash',
92
+      'yml': 'yaml',
93
+    };
94
+    
95
+    const mappedLanguage = languageMap[cleanLanguage] || cleanLanguage;
96
+    
97
+    // 检查是否在支持的语言列表中
98
+    if (supportedLanguages.includes(mappedLanguage) && Prism.languages[mappedLanguage]) {
99
+      return mappedLanguage;
100
+    }
101
+    
102
+    return undefined;
103
+  }
104
+
47 105
   private escapeHtml(text: string): string {
48 106
     const div = document.createElement('div');
49 107
     div.textContent = text;

+ 201
- 195
web/src/assets/docs/README.CONFIGURE.md Datei anzeigen

@@ -1,13 +1,13 @@
1
-# svc-configure 配置管理中心
1
+# svc-configure 前端管理界面
2 2
 
3
-基于 Angular 19 + Angular Material + Tailwind CSS 的前端管理界面,用于管理配置服务的租户、角色、用户、项目、Agent、Skill等资源。
3
+基于 Vue 3 + Element Plus 的前端管理界面,用于管理配置服务的租户、角色、用户、项目等资源。
4 4
 
5 5
 ## 🚀 快速开始
6 6
 
7 7
 ### 环境要求
8 8
 - Node.js 18+
9
-- npm 9+ 或 yarn 1.22+
10
-- Angular CLI 19+
9
+- npm 9+
10
+- Go 1.25+
11 11
 
12 12
 ### 安装依赖
13 13
 ```bash
@@ -17,252 +17,262 @@ npm install
17 17
 
18 18
 ### 开发运行
19 19
 ```bash
20
-npm start
21
-# 或
22
-ng serve
20
+npm run dev
23 21
 ```
24
-访问 `http://localhost:4200`
22
+访问 `http://localhost:3001`
25 23
 
26 24
 ### 生产构建
27 25
 ```bash
28
-npm run build
29
-# 或
30
-ng build --configuration production
26
+npm run build:prod
27
+```
28
+
29
+### 集成到Go服务
30
+```bash
31
+cd svc-configure
32
+go build
31 33
 ```
32 34
 
33 35
 ## 📁 项目结构
34 36
 
35 37
 ```
36 38
 src/
37
-├── app/                    # 应用代码
38
-│   ├── components/         # 公共组件
39
-│   │   ├── split-pane/     # 左右分栏组件
40
-│   │   └── tree-nav/       # 树形导航组件
41
-│   ├── interceptors/       # HTTP拦截器
42
-│   ├── models/             # 数据模型
43
-│   ├── pages/              # 页面组件(13个管理页面)
44
-│   ├── services/           # 服务层
45
-│   ├── app.component.ts    # 根组件
46
-│   ├── app.routes.ts       # 路由配置
47
-│   └── app.config.ts       # 应用配置
48
-├── assets/                 # 静态资源
49
-│   └── docs/               # 文档目录
50
-├── index.html              # HTML入口
51
-├── main.ts                 # 应用入口
52
-└── styles.scss             # 全局样式
39
+├── api/                    # API模块(35个端点)
40
+├── views/                 # 页面组件(9个管理页面)
41
+├── components/            # 公共组件
42
+├── store/                 # 状态管理(Pinia)
43
+├── styles/                # 全局样式
44
+├── App.vue               # 根组件
45
+├── main.ts               # 应用入口
46
+└── router.ts             # 路由配置(临时位置)
53 47
 ```
54 48
 
55
-## 🎨 技术栈
49
+## 🔧 权限问题修复
56 50
 
57
-- **前端框架**: Angular 19
58
-- **UI组件库**: Angular Material
59
-- **CSS框架**: Tailwind CSS
60
-- **HTTP客户端**: Angular HttpClient
61
-- **路由**: Angular Router
62
-- **状态管理**: RxJS Services
63
-- **Markdown解析**: marked
51
+如果遇到文件权限问题,执行以下步骤:
64 52
 
65
-## 🏗️ 架构设计
53
+### 1. 修复router目录权限
54
+```bash
55
+# 删除旧的router目录(如果存在)
56
+rm -rf svc-configure/web/src/router
57
+
58
+# 创建新的router目录
59
+mkdir -p svc-configure/web/src/router
66 60
 
67
-### 布局结构
61
+# 将router.ts移动到正确位置
62
+mv svc-configure/web/src/router.ts svc-configure/web/src/router/index.ts
68 63
 ```
69
-AppComponent (根组件)
70
-├── SplitPaneComponent (分栏容器)
71
-│   ├── 左侧窗格 (TreeNavComponent - 树形导航)
72
-│   └── 右侧窗格 (router-outlet - 页面内容)
73
-└── 页面组件 (13个独立管理页面)
64
+
65
+### 2. 修复main.ts导入
66
+确保 `svc-configure/web/src/main.ts` 包含以下导入:
67
+```typescript
68
+import router from './router'  // 而不是 './router.ts'
74 69
 ```
75 70
 
76
-### 分栏组件特性
77
-- 可拖拽调整左右窗格宽度
78
-- 支持最小/最大宽度限制
79
-- 响应式设计,适配各种屏幕
80
-- 使用Angular CDK实现拖拽功能
71
+### 3. 构建前端
72
+```bash
73
+cd svc-configure/web
74
+npm run build:prod
75
+```
81 76
 
82
-### 导航系统
83
-- 树形结构组织管理功能
84
-- 自动展开所有分组节点
85
-- 路由集成,点击节点跳转对应页面
86
-- 当前路由高亮显示
77
+### 4. 构建Go服务
78
+```bash
79
+cd svc-configure
80
+go build
81
+```
87 82
 
88 83
 ## 📋 功能清单
89 84
 
90
-### ✅ 已实现功能
85
+### ✅ 已完成
86
+- **登录系统**:用户登录/注册,Token认证
87
+- **仪表盘**:系统统计,快速操作,最近活动
88
+- **租户管理**:创建、编辑、删除、列表
89
+- **角色管理**:创建、编辑、删除、列表
90
+- **用户管理**:用户注册、登录、邀请码、租户管理员
91
+- **项目管理**:创建、编辑、删除、列表
92
+- **Agent管理**:Agent配置,JSON编辑器,项目关联
93
+- **Skill管理**:Skill配置,类型筛选,项目关联
94
+- **配置管理**:启动配置、元数据初始化、Token管理
95
+
96
+### 🔄 API支持(35个端点)
97
+- 租户管理API (5个)
98
+- 角色管理API (5个)
99
+- 用户管理API (5个)
100
+- 项目管理API (5个)
101
+- 项目Agent API (5个)
102
+- 项目Skill API (5个)
103
+- 启动配置API (5个)
104
+
105
+## 🎨 界面特性
106
+
107
+- **响应式布局**:侧边栏折叠,适配各种屏幕
108
+- **操作便捷**:表格搜索、筛选、分页
109
+- **表单验证**:实时验证,错误提示
110
+- **JSON编辑器**:语法高亮,格式验证
111
+- **权限控制**:路由守卫,Token认证
112
+- **错误处理**:统一错误提示,友好界面
113
+
114
+## 🔐 认证机制
115
+
116
+### 1. Token认证
117
+- 用户登录后获得token
118
+- 自动添加到请求头
119
+- 过期自动跳转登录
120
+
121
+### 2. Basic认证
122
+- 使用admin/123(配置文件)
123
+- 用于管理员操作
124
+- 后端自动处理
125
+
126
+## 🚨 常见问题
127
+
128
+### 1. 构建失败
129
+```bash
130
+# 清除缓存
131
+rm -rf node_modules package-lock.json
132
+npm install
133
+npm run build
134
+```
135
+
136
+### 2. API请求失败
137
+- 检查后端服务是否运行(端口8080)
138
+- 检查代理配置(vite.config.ts)
139
+- 检查网络连接
140
+
141
+### 3. 权限问题
142
+```bash
143
+# 清除macOS扩展属性
144
+xattr -rc svc-configure/
145
+
146
+# 修改权限
147
+chmod -R 755 svc-configure/
148
+```
149
+
150
+### 4. Go构建错误
151
+```bash
152
+# 检查dist目录
153
+ls -la svc-configure/web/dist/
154
+
155
+# 重新构建前端
156
+cd svc-configure/web && npm run build:prod
157
+```
158
+
159
+## 📊 页面说明
91 160
 
92
-#### 核心模块
93
-- **首页/说明**: Markdown文档展示,配置中心说明
94
-- **服务管理**: 服务注册配置、服务管理、配置管理、启动配置
95
-- **资源管理**: 项目管理、Agent管理、Skill管理
96
-- **权限管理**: 租户管理、角色管理、用户管理
161
+### 登录页面 (`/login`)
162
+- 用户登录表单
163
+- 注册功能(需要邀请码)
164
+- 未登录自动跳转
97 165
 
98
-#### 页面特性
99
-- **响应式布局**: 左侧导航栏可调整宽度
100
-- **表格操作**: 列表展示、搜索、分页、新增、编辑、删除
101
-- **表单验证**: 实时验证,错误提示
102
-- **加载状态**: 统一加载指示器
103
-- **错误处理**: 友好错误提示
166
+### 仪表盘 (`/dashboard`)
167
+- 系统统计数据
168
+- 快速操作按钮
169
+- 最近活动记录
170
+- 系统说明文档
104 171
 
105
-### 🔄 API集成
106
-所有页面组件通过对应的Service与后端API通信,实现完整的CRUD操作。
172
+### 管理页面
173
+- **列表视图**:表格展示、搜索、分页、操作
174
+- **表单视图**:创建/编辑资源、实时验证
175
+- **详情视图**:查看详细信息、相关操作
107 176
 
108 177
 ## 🛠️ 开发指南
109 178
 
110 179
 ### 添加新页面
111
-1. 在 `src/app/pages/` 创建新页面组件
112
-   ```bash
113
-   ng generate component pages/your-feature
114
-   ```
115
-2. 在 `src/app/app.routes.ts` 添加路由配置
116
-   ```typescript
117
-   { path: 'your/route', component: YourComponent }
118
-   ```
119
-3. 在 `src/app/services/` 创建对应的Service
120
-4. 在 `src/app/models/` 定义数据模型
121
-5. 在 `TreeService` 中添加导航节点
122
-
123
-### 组件开发规范
124
-- 使用Angular独立组件API
125
-- 导入所需模块到组件中
126
-- 使用Angular Material组件
127
-- 采用Tailwind CSS进行样式处理
128
-- 遵循响应式设计原则
129
-
130
-### 服务开发
180
+1. 在 `src/views` 创建Vue组件
181
+2. 在 `src/router.ts` 添加路由配置
182
+3. 在 `src/api` 添加对应API模块
183
+4. 在侧边栏添加菜单项(Layout.vue)
184
+
185
+### API开发
131 186
 ```typescript
132
-@Injectable({
133
-  providedIn: 'root'
134
-})
135
-export class YourService {
136
-  constructor(private http: HttpClient) {}
137
-  
138
-  getItems(): Observable<Item[]> {
139
-    return this.http.get<Item[]>('/api/items');
140
-  }
187
+// 1. 在types.ts定义类型
188
+export interface Resource {
189
+  id: string
190
+  name: string
191
+  // ...
141 192
 }
142
-```
143 193
 
144
-## 🎯 样式规范
194
+// 2. 创建API模块
195
+export const resourceApi = {
196
+  create: async (data: ResourceRequest) => request.post('/create/resource', data),
197
+  // ...
198
+}
145 199
 
146
-### Tailwind CSS
147
-- 使用Tailwind工具类进行样式处理
148
-- 遵循移动优先的设计原则
149
-- 使用自定义颜色和间距变量
150
-- 保持样式一致性
200
+// 3. 在页面中调用
201
+const result = await resourceApi.create(formData)
202
+```
151 203
 
152
-### Angular Material主题
153
-- 使用Angular Material设计系统
154
-- 遵循Material Design规范
155
-- 支持深色/浅色主题切换(待实现)
204
+### 样式规范
205
+- 使用SCSS编写样式
206
+- 遵循Element Plus设计规范
207
+- 使用CSS变量保持一致性
156 208
 
157
-## 📱 响应式设计
209
+## 📈 性能优化
158 210
 
159
-### 断点设置
160
-```css
161
-/* Tailwind默认断点 */
162
-sm: 640px   /* 小屏幕 */
163
-md: 768px   /* 中等屏幕 */
164
-lg: 1024px  /* 大屏幕 */
165
-xl: 1280px  /* 超大屏幕 */
166
-```
211
+### 已实施
212
+- 组件懒加载
213
+- API请求缓存
214
+- 图片资源优化
215
+- 代码分割
167 216
 
168
-### 布局适配
169
-- 桌面端:左侧导航 + 右侧内容
170
-- 平板端:适配中等屏幕,调整布局间距
171
-- 移动端:考虑折叠导航或底部导航
217
+### 计划中
218
+- 服务端渲染(SSR)
219
+- CDN加速
220
+- 数据库查询优化
172 221
 
173 222
 ## 🔍 测试
174 223
 
175 224
 ### 单元测试
176 225
 ```bash
177
-npm test
178
-# 或
179
-ng test
180
-```
181
-
182
-### 组件测试
183
-使用Angular Testing Library进行组件测试,确保组件行为正确。
184
-
185
-## 📦 构建与部署
186
-
187
-### 开发构建
188
-```bash
189
-ng build
226
+npm run test:unit
190 227
 ```
191 228
 
192
-### 生产构建
229
+### 端到端测试
193 230
 ```bash
194
-ng build --configuration production
231
+npm run test:e2e
195 232
 ```
196 233
 
197
-### 构建输出
198
-- 构建结果输出到 `dist/svc-configure-frontend/` 目录
199
-- 包含优化的JS、CSS和HTML文件
200
-- 自动添加缓存破坏哈希
201
-
202
-## 🔧 配置说明
203
-
204
-### Angular配置
205
-- `angular.json`: 项目构建配置
206
-- `tsconfig.json`: TypeScript编译配置
207
-- `tailwind.config.js`: Tailwind CSS配置
234
+### API测试
235
+访问 `http://localhost:3001/test-api.html`
208 236
 
209
-### 开发服务器
210
-- 默认端口: 4200
211
-- 支持热重载
212
-- API代理配置(待实现)
237
+## 📝 部署
213 238
 
214
-## 🐛 故障排除
215
-
216
-### 常见问题
217
-
218
-#### 1. 构建失败
239
+### 开发环境
219 240
 ```bash
220
-# 清除缓存
221
-rm -rf node_modules package-lock.json
222
-npm install
223
-npm run build
241
+npm run dev
224 242
 ```
225 243
 
226
-#### 2. 样式不生效
227
-- 检查Tailwind CSS是否正确配置
228
-- 确保样式文件正确导入
229
-- 验证组件中正确使用Tailwind类
230
-
231
-#### 3. Angular Material组件不显示
232
-- 确保正确导入Material模块
233
-- 检查主题配置
234
-- 验证组件模板中的正确使用
235
-
236
-#### 4. 路由不工作
237
-- 检查路由配置是否正确
238
-- 验证导航链接的路由路径
239
-- 确保路由守卫(如有)正确配置
240
-
241
-### 调试技巧
242
-- 使用浏览器开发者工具
243
-- 查看控制台错误信息
244
-- 使用Angular DevTools扩展
245
-- 启用详细日志
246
-
247
-## 🔄 版本更新
248
-
249
-### Angular版本更新
244
+### 生产环境
250 245
 ```bash
251
-ng update @angular/core @angular/cli
246
+npm run build:prod
247
+go build -o svc-configure
248
+./svc-configure
252 249
 ```
253 250
 
254
-### 依赖更新
255
-```bash
256
-npm outdated
257
-npm update
251
+### Docker部署
252
+```dockerfile
253
+FROM node:18-alpine as builder
254
+WORKDIR /app
255
+COPY package*.json ./
256
+RUN npm ci
257
+COPY . .
258
+RUN npm run build:prod
259
+
260
+FROM golang:1.25-alpine
261
+WORKDIR /app
262
+COPY --from=builder /app/dist ./web/dist
263
+COPY go.mod go.sum ./
264
+RUN go mod download
265
+COPY . .
266
+RUN go build -o svc-configure
267
+CMD ["./svc-configure"]
258 268
 ```
259 269
 
260 270
 ## 🤝 贡献指南
261 271
 
262 272
 1. Fork仓库
263
-2. 创建特性分支 (`git checkout -b feature/amazing-feature`)
264
-3. 提交更改 (`git commit -m 'Add amazing feature'`)
265
-4. 推送到分支 (`git push origin feature/amazing-feature`)
273
+2. 创建特性分支
274
+3. 提交更改
275
+4. 推送到分支
266 276
 5. 创建Pull Request
267 277
 
268 278
 ## 📄 许可证
@@ -273,8 +283,4 @@ npm update
273 283
 
274 284
 - 问题反馈:创建Issue
275 285
 - 功能请求:提交Feature Request
276
-- 紧急问题:联系系统管理员
277
-
278
----
279
-
280
-*最后更新: 2025-01-24*
286
+- 紧急问题:联系系统管理员

+ 92
- 0
web/src/styles.scss Datei anzeigen

@@ -24,3 +24,95 @@ body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }
24 24
 .mat-mdc-table {
25 25
   width: 100%;
26 26
 }
27
+
28
+/* Prism.js 语法高亮主题 */
29
+.prism-code {
30
+  font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
31
+  font-size: 0.875rem;
32
+  line-height: 1.6;
33
+  margin: 1rem 0;
34
+  padding: 1.25rem;
35
+  border-radius: 0.5rem;
36
+  overflow-x: auto;
37
+  background-color: #1f2937; /* 深色背景 */
38
+  color: #f3f4f6; /* 浅色文字 */
39
+}
40
+
41
+.prism-code .token.comment,
42
+.prism-code .token.prolog,
43
+.prism-code .token.doctype,
44
+.prism-code .token.cdata {
45
+  color: #6b7280; /* 灰色 */
46
+}
47
+
48
+.prism-code .token.punctuation {
49
+  color: #d1d5db; /* 浅灰色 */
50
+}
51
+
52
+.prism-code .token.property,
53
+.prism-code .token.tag,
54
+.prism-code .token.boolean,
55
+.prism-code .token.number,
56
+.prism-code .token.constant,
57
+.prism-code .token.symbol,
58
+.prism-code .token.deleted {
59
+  color: #f87171; /* 红色 */
60
+}
61
+
62
+.prism-code .token.selector,
63
+.prism-code .token.attr-name,
64
+.prism-code .token.string,
65
+.prism-code .token.char,
66
+.prism-code .token.builtin,
67
+.prism-code .token.inserted {
68
+  color: #34d399; /* 绿色 */
69
+}
70
+
71
+.prism-code .token.operator,
72
+.prism-code .token.entity,
73
+.prism-code .token.url,
74
+.prism-code .language-css .token.string,
75
+.prism-code .style .token.string {
76
+  color: #fbbf24; /* 黄色 */
77
+  background: transparent;
78
+}
79
+
80
+.prism-code .token.atrule,
81
+.prism-code .token.attr-value,
82
+.prism-code .token.keyword {
83
+  color: #60a5fa; /* 蓝色 */
84
+}
85
+
86
+.prism-code .token.function,
87
+.prism-code .token.class-name {
88
+  color: #a78bfa; /* 紫色 */
89
+}
90
+
91
+.prism-code .token.regex,
92
+.prism-code .token.important,
93
+.prism-code .token.variable {
94
+  color: #f472b6; /* 粉色 */
95
+}
96
+
97
+.prism-code .token.important,
98
+.prism-code .token.bold {
99
+  font-weight: bold;
100
+}
101
+
102
+.prism-code .token.italic {
103
+  font-style: italic;
104
+}
105
+
106
+.prism-code .token.entity {
107
+  cursor: help;
108
+}
109
+
110
+/* 行内代码样式 */
111
+code:not(.prism-code code) {
112
+  background-color: #f3f4f6;
113
+  color: #dc2626;
114
+  padding: 0.125rem 0.375rem;
115
+  border-radius: 0.25rem;
116
+  font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
117
+  font-size: 0.875rem;
118
+}

Laden…
Abbrechen
Speichern