zhouhui.jiang

Add前端样式模板

Showing 43 changed files with 2970 additions and 0 deletions
1 +// Header 导航规范
2 +.header {
3 + height: var(--header-height);
4 + background: var(--el-bg-color);
5 + border-bottom: 1px solid var(--el-border-color);
6 + box-shadow: var(--el-box-shadow);
7 + display: flex;
8 + align-items: center;
9 + justify-content: space-between;
10 + padding: 0 var(--el-spacing-large);
11 + z-index: 1000;
12 +}
13 +
14 +.header-left {
15 + display: flex;
16 + align-items: center;
17 + gap: var(--el-spacing-medium);
18 +}
19 +
20 +.header-right {
21 + display: flex;
22 + align-items: center;
23 + gap: var(--el-spacing-base);
24 +}
25 +
26 +// 折叠按钮
27 +.collapse-btn {
28 + background: none;
29 + border: none;
30 + cursor: pointer;
31 + padding: var(--el-spacing-small);
32 + border-radius: var(--el-border-radius-small);
33 + color: var(--el-text-color-regular);
34 + transition: all 0.2s ease;
35 + display: flex;
36 + align-items: center;
37 + justify-content: center;
38 + width: 32px;
39 + height: 32px;
40 +
41 + &:hover {
42 + background: var(--el-bg-color-page);
43 + color: var(--el-text-color-primary);
44 + }
45 +
46 + &:active {
47 + transform: scale(0.95);
48 + }
49 +}
50 +
51 +// 头部按钮
52 +.header-btn {
53 + background: none;
54 + border: none;
55 + cursor: pointer;
56 + padding: var(--el-spacing-small);
57 + border-radius: var(--el-border-radius-small);
58 + color: var(--el-text-color-regular);
59 + transition: all 0.2s ease;
60 + display: flex;
61 + align-items: center;
62 + justify-content: center;
63 + width: 32px;
64 + height: 32px;
65 +
66 + &:hover {
67 + background: var(--el-bg-color-page);
68 + color: var(--el-text-color-primary);
69 + }
70 +
71 + &:active {
72 + transform: scale(0.95);
73 + }
74 +}
75 +
76 +// 用户信息
77 +.user-info {
78 + display: flex;
79 + align-items: center;
80 + gap: var(--el-spacing-small);
81 + padding: var(--el-spacing-small) var(--el-spacing-base);
82 + border-radius: var(--el-border-radius-small);
83 + cursor: pointer;
84 + transition: background-color 0.2s ease;
85 +
86 + &:hover {
87 + background: var(--el-bg-color-page);
88 + }
89 +
90 + &:active {
91 + transform: scale(0.98);
92 + }
93 +}
94 +
95 +.username {
96 + font-family: var(--el-font-family);
97 + font-size: var(--el-font-size-base);
98 + font-weight: 500;
99 + color: var(--el-text-color-primary);
100 + white-space: nowrap;
101 +}
102 +
103 +.dropdown-icon {
104 + color: var(--el-text-color-secondary);
105 + transition: color 0.2s ease;
106 + font-size: var(--el-font-size-small);
107 +}
108 +
109 +// Sidebar 导航规范 - 深色主题
110 +.sidebar {
111 + width: var(--sidebar-width);
112 + height: 100vh;
113 + background: #1a1a1a; // 深色背景
114 + border-right: 1px solid #333;
115 + box-shadow: 2px 0 8px rgba(0, 0, 0, 0.3);
116 + display: flex;
117 + flex-direction: column;
118 + transition: width 0.3s ease;
119 +}
120 +
121 +.sidebar.collapsed {
122 + width: var(--sidebar-collapsed-width);
123 +}
124 +
125 +.sidebar-logo {
126 + height: 60px;
127 + display: flex;
128 + align-items: center;
129 + justify-content: center;
130 + padding: 0 var(--el-spacing-large);
131 + border-bottom: 1px solid #333;
132 + background: #1a1a1a;
133 +}
134 +
135 +.logo-link {
136 + display: flex;
137 + align-items: center;
138 + justify-content: center;
139 + gap: var(--el-spacing-base);
140 + text-decoration: none;
141 + color: white;
142 + transition: opacity 0.2s ease;
143 + width: 100%;
144 +
145 + &:hover {
146 + opacity: 0.8;
147 + }
148 +}
149 +
150 +.logo-img {
151 + width: 32px;
152 + height: 32px;
153 + border-radius: var(--el-border-radius-small);
154 +}
155 +
156 +.logo-text {
157 + font-family: var(--el-font-family);
158 + font-size: 20px;
159 + font-weight: 700;
160 + color: white;
161 + white-space: nowrap;
162 + letter-spacing: 1px;
163 +}
164 +
165 +.sidebar-scrollbar {
166 + flex: 1;
167 + overflow-y: auto;
168 +}
169 +
170 +// 菜单项样式 - 深色主题
171 +.el-menu {
172 + border-right: none;
173 + background: #1a1a1a;
174 +}
175 +
176 +.el-menu-item {
177 + font-family: var(--el-font-family);
178 + font-size: 14px;
179 + font-weight: 400;
180 + line-height: 22px;
181 + color: #ffffff;
182 + height: 48px;
183 + line-height: 48px;
184 + margin: 2px 8px;
185 + border-radius: 6px;
186 + transition: all 0.2s ease;
187 + position: relative;
188 + display: flex;
189 + align-items: center;
190 + padding: 0 16px;
191 +
192 + &.is-active {
193 + color: #ffffff;
194 + background-color: #333333;
195 + font-weight: 500;
196 +
197 + &::before {
198 + content: '';
199 + position: absolute;
200 + left: 0;
201 + top: 50%;
202 + transform: translateY(-50%);
203 + width: 3px;
204 + height: 20px;
205 + background-color: #007bff;
206 + border-radius: 0 2px 2px 0;
207 + }
208 + }
209 +
210 + &:hover {
211 + background-color: #333333;
212 + color: #ffffff;
213 + }
214 +
215 + &:active {
216 + transform: scale(0.98);
217 + }
218 +
219 + .el-icon {
220 + margin-right: 12px;
221 + font-size: 16px;
222 + color: inherit;
223 + }
224 +
225 + span {
226 + flex: 1;
227 + }
228 +}
229 +
230 +.el-submenu__title {
231 + font-family: var(--el-font-family);
232 + font-size: 14px;
233 + font-weight: 400;
234 + line-height: 22px;
235 + color: #ffffff;
236 + height: 48px;
237 + line-height: 48px;
238 + margin: 2px 8px;
239 + border-radius: 6px;
240 + transition: all 0.2s ease;
241 + display: flex;
242 + align-items: center;
243 + padding: 0 16px;
244 +
245 + &:hover {
246 + background-color: #333333;
247 + color: #ffffff;
248 + }
249 +
250 + &:active {
251 + transform: scale(0.98);
252 + }
253 +
254 + .el-icon {
255 + margin-right: 12px;
256 + font-size: 16px;
257 + color: inherit;
258 + }
259 +
260 + span {
261 + flex: 1;
262 + }
263 +}
264 +
265 +// 子菜单 - 深色主题
266 +.el-submenu .el-menu-item {
267 + margin: 1px 16px;
268 + padding-left: 24px;
269 + height: 40px;
270 + line-height: 40px;
271 + font-size: 13px;
272 + color: #cccccc;
273 +
274 + &.is-active {
275 + color: #ffffff;
276 + background-color: #333333;
277 +
278 + &::before {
279 + left: 16px;
280 + }
281 + }
282 +
283 + &:hover {
284 + background-color: #333333;
285 + color: #ffffff;
286 + }
287 +}
288 +
289 +// 弹出菜单系统 (Flyout Menu) - 深色主题
290 +.sidebar-flyout {
291 + position: fixed;
292 + top: var(--header-height);
293 + left: var(--sidebar-collapsed-width);
294 + width: 200px;
295 + background: #1a1a1a;
296 + border: 1px solid #333;
297 + border-left: none;
298 + box-shadow: 4px 0 16px rgba(0, 0, 0, 0.3);
299 + z-index: 1000;
300 + border-radius: 0 6px 6px 0;
301 + overflow: hidden;
302 + animation: slideInRight 0.2s ease;
303 +}
304 +
305 +.flyout-menu {
306 + padding: 8px 0;
307 +
308 + .flyout-item {
309 + display: flex;
310 + align-items: center;
311 + padding: 8px 16px;
312 + color: #ffffff;
313 + text-decoration: none;
314 + transition: all 0.2s ease;
315 + font-family: var(--el-font-family);
316 + font-size: 14px;
317 + font-weight: 400;
318 + line-height: 22px;
319 + cursor: pointer;
320 +
321 + &:hover {
322 + background: #333333;
323 + color: #ffffff;
324 + }
325 +
326 + &.is-active {
327 + background: #333333;
328 + color: #ffffff;
329 + font-weight: 500;
330 + position: relative;
331 +
332 + &::before {
333 + content: '';
334 + position: absolute;
335 + left: 0;
336 + top: 50%;
337 + transform: translateY(-50%);
338 + width: 3px;
339 + height: 20px;
340 + background-color: #007bff;
341 + border-radius: 0 2px 2px 0;
342 + }
343 + }
344 +
345 + .flyout-icon {
346 + margin-right: 12px;
347 + font-size: 16px;
348 + width: 16px;
349 + text-align: center;
350 + color: inherit;
351 + }
352 +
353 + .flyout-text {
354 + flex: 1;
355 + }
356 +
357 + .flyout-arrow {
358 + font-size: 12px;
359 + color: #cccccc;
360 + transition: transform 0.2s ease;
361 +
362 + &.expanded {
363 + transform: rotate(90deg);
364 + }
365 + }
366 + }
367 +
368 + .flyout-submenu {
369 + background: #222222;
370 + border-top: 1px solid #333;
371 +
372 + .flyout-subitem {
373 + display: flex;
374 + align-items: center;
375 + padding: 8px 24px;
376 + color: #cccccc;
377 + text-decoration: none;
378 + transition: all 0.2s ease;
379 + font-family: var(--el-font-family);
380 + font-size: 13px;
381 + font-weight: 400;
382 + line-height: 20px;
383 + cursor: pointer;
384 +
385 + &:hover {
386 + background: #333333;
387 + color: #ffffff;
388 + }
389 +
390 + &.is-active {
391 + background: #333333;
392 + color: #ffffff;
393 + font-weight: 500;
394 + }
395 + }
396 + }
397 +}
398 +
399 +// 折叠状态下的侧边栏样式
400 +.sidebar.collapsed {
401 + .sidebar-logo {
402 + .logo-text {
403 + display: none;
404 + }
405 + }
406 +
407 + .el-menu-item,
408 + .el-submenu__title {
409 + padding: 0;
410 + text-align: center;
411 + justify-content: center;
412 +
413 + .el-icon {
414 + margin-right: 0;
415 + font-size: 18px;
416 + }
417 +
418 + span {
419 + display: none;
420 + }
421 + }
422 +
423 + .el-submenu {
424 + .el-menu {
425 + display: none;
426 + }
427 + }
428 +}
429 +
430 +// 弹出菜单动画
431 +@keyframes slideInRight {
432 + from {
433 + opacity: 0;
434 + transform: translateX(-10px);
435 + }
436 + to {
437 + opacity: 1;
438 + transform: translateX(0);
439 + }
440 +}
441 +
442 +@keyframes slideOutRight {
443 + from {
444 + opacity: 1;
445 + transform: translateX(0);
446 + }
447 + to {
448 + opacity: 0;
449 + transform: translateX(-10px);
450 + }
451 +}
452 +
453 +// 弹出菜单遮罩
454 +.flyout-overlay {
455 + position: fixed;
456 + top: 0;
457 + left: 0;
458 + right: 0;
459 + bottom: 0;
460 + background: transparent;
461 + z-index: 999;
462 +}
463 +
464 +// 面包屑导航
465 +.breadcrumb {
466 + height: var(--breadcrumb-height);
467 + background: var(--el-bg-color);
468 + border-bottom: 1px solid var(--el-border-color);
469 + display: flex;
470 + align-items: center;
471 + padding: 0 var(--el-spacing-large);
472 +}
473 +
474 +.el-breadcrumb {
475 + font-family: var(--el-font-family);
476 + font-size: var(--el-font-size-base);
477 +}
478 +
479 +.el-breadcrumb__item {
480 + .el-breadcrumb__inner {
481 + color: var(--el-text-color-regular);
482 + font-weight: 400;
483 + transition: color 0.2s ease;
484 +
485 + &:hover {
486 + color: var(--el-color-primary);
487 + }
488 + }
489 +
490 + &:last-child .el-breadcrumb__inner {
491 + color: var(--el-text-color-primary);
492 + font-weight: 500;
493 + }
494 +}
495 +
496 +// 响应式导航
497 +@media (max-width: 768px) {
498 + .header {
499 + padding: 0 var(--el-spacing-base);
500 + }
501 +
502 + .header-left {
503 + gap: var(--el-spacing-small);
504 + }
505 +
506 + .header-right {
507 + gap: var(--el-spacing-small);
508 + }
509 +
510 + .username {
511 + display: none;
512 + }
513 +
514 + .sidebar {
515 + position: fixed;
516 + top: 0;
517 + left: 0;
518 + z-index: 1001;
519 + transform: translateX(-100%);
520 + transition: transform 0.3s ease;
521 +
522 + &.mobile-open {
523 + transform: translateX(0);
524 + }
525 + }
526 +
527 + .sidebar-logo {
528 + padding: 0 var(--el-spacing-base);
529 + }
530 +}
531 +
532 +// 导航动画
533 +@keyframes slideInLeft {
534 + from {
535 + transform: translateX(-100%);
536 + }
537 + to {
538 + transform: translateX(0);
539 + }
540 +}
541 +
542 +@keyframes slideOutLeft {
543 + from {
544 + transform: translateX(0);
545 + }
546 + to {
547 + transform: translateX(-100%);
548 + }
549 +}
550 +
551 +// 导航状态指示器
552 +.nav-indicator {
553 + position: absolute;
554 + left: 0;
555 + top: 0;
556 + bottom: 0;
557 + width: 3px;
558 + background: var(--el-color-primary);
559 + border-radius: 0 2px 2px 0;
560 + transition: all 0.2s ease;
561 +}
562 +
563 +// 导航徽章
564 +.nav-badge {
565 + position: absolute;
566 + top: 8px;
567 + right: 8px;
568 + min-width: 16px;
569 + height: 16px;
570 + padding: 0 4px;
571 + background: var(--el-color-danger);
572 + color: white;
573 + font-size: 10px;
574 + font-weight: 500;
575 + border-radius: 8px;
576 + display: flex;
577 + align-items: center;
578 + justify-content: center;
579 + line-height: 1;
580 +}
581 +
582 +// 导航搜索
583 +.nav-search {
584 + padding: var(--el-spacing-base) var(--el-spacing-large);
585 + border-bottom: 1px solid var(--el-border-color);
586 +
587 + .search-input {
588 + width: 100%;
589 + padding: var(--el-spacing-small) var(--el-spacing-base);
590 + border: 1px solid var(--el-border-color);
591 + border-radius: var(--el-border-radius-base);
592 + background: var(--el-bg-color);
593 + color: var(--el-text-color-primary);
594 + font-family: var(--el-font-family);
595 + font-size: var(--el-font-size-small);
596 + transition: all 0.2s ease;
597 +
598 + &:focus {
599 + border-color: var(--el-color-primary);
600 + outline: none;
601 + box-shadow: 0 0 0 2px rgba(20, 31, 51, 0.1);
602 + }
603 +
604 + &::placeholder {
605 + color: var(--el-text-color-placeholder);
606 + }
607 + }
608 +}
609 +
610 +// 导航工具提示
611 +.nav-tooltip {
612 + .el-tooltip__trigger {
613 + display: flex;
614 + align-items: center;
615 + justify-content: center;
616 + }
617 +}
618 +
619 +// 导航加载状态
620 +.nav-loading {
621 + position: relative;
622 +
623 + &::after {
624 + content: '';
625 + position: absolute;
626 + top: 0;
627 + left: 0;
628 + right: 0;
629 + bottom: 0;
630 + background: rgba(255, 255, 255, 0.8);
631 + display: flex;
632 + align-items: center;
633 + justify-content: center;
634 + z-index: 1;
635 + }
636 +}
637 +
638 +// 导航主题切换
639 +.nav-theme-toggle {
640 + .theme-icon {
641 + transition: transform 0.3s ease;
642 + }
643 +
644 + &:hover .theme-icon {
645 + transform: rotate(180deg);
646 + }
647 +}
1 +// 字体系统
2 +$font-family-primary: 'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3 +
4 +// 文字层级系统
5 +.text-h1 {
6 + font-family: $font-family-primary;
7 + font-size: 24px;
8 + font-weight: 600;
9 + line-height: 40px;
10 + letter-spacing: 0;
11 + color: var(--el-text-color-primary);
12 +}
13 +
14 +.text-h2 {
15 + font-family: $font-family-primary;
16 + font-size: 20px;
17 + font-weight: 600;
18 + line-height: 32px;
19 + letter-spacing: 0;
20 + color: var(--el-text-color-primary);
21 +}
22 +
23 +.text-h3 {
24 + font-family: $font-family-primary;
25 + font-size: 18px;
26 + font-weight: 600;
27 + line-height: 28px;
28 + letter-spacing: 0;
29 + color: var(--el-text-color-primary);
30 +}
31 +
32 +.text-h4 {
33 + font-family: $font-family-primary;
34 + font-size: 16px;
35 + font-weight: 600;
36 + line-height: 24px;
37 + letter-spacing: 0;
38 + color: var(--el-text-color-primary);
39 +}
40 +
41 +.text-body {
42 + font-family: $font-family-primary;
43 + font-size: 14px;
44 + font-weight: 400;
45 + line-height: 22px;
46 + letter-spacing: 0;
47 + color: var(--el-text-color-primary);
48 +}
49 +
50 +.text-caption {
51 + font-family: $font-family-primary;
52 + font-size: 12px;
53 + font-weight: 400;
54 + line-height: 18px;
55 + letter-spacing: 0;
56 + color: var(--el-text-color-regular);
57 +}
58 +
59 +.text-small {
60 + font-family: $font-family-primary;
61 + font-size: 11px;
62 + font-weight: 400;
63 + line-height: 16px;
64 + letter-spacing: 0;
65 + color: var(--el-text-color-secondary);
66 +}
67 +
68 +// 文字工具类
69 +.text-center { text-align: center; }
70 +.text-left { text-align: left; }
71 +.text-right { text-align: right; }
72 +
73 +.text-bold { font-weight: 600; }
74 +.text-medium { font-weight: 500; }
75 +.text-normal { font-weight: 400; }
76 +
77 +.text-ellipsis {
78 + overflow: hidden;
79 + text-overflow: ellipsis;
80 + white-space: nowrap;
81 +}
82 +
83 +.text-ellipsis-2 {
84 + display: -webkit-box;
85 + -webkit-line-clamp: 2;
86 + -webkit-box-orient: vertical;
87 + overflow: hidden;
88 +}
89 +
90 +.text-ellipsis-3 {
91 + display: -webkit-box;
92 + -webkit-line-clamp: 3;
93 + -webkit-box-orient: vertical;
94 + overflow: hidden;
95 +}
96 +
97 +// 全局文字样式重置
98 +* {
99 + font-family: $font-family-primary;
100 +}
101 +
102 +// 标题样式
103 +h1, .h1 {
104 + @extend .text-h1;
105 +}
106 +
107 +h2, .h2 {
108 + @extend .text-h2;
109 +}
110 +
111 +h3, .h3 {
112 + @extend .text-h3;
113 +}
114 +
115 +h4, .h4 {
116 + @extend .text-h4;
117 +}
118 +
119 +// 段落和文本样式
120 +p, .p {
121 + @extend .text-body;
122 + margin: 0 0 16px 0;
123 +}
124 +
125 +// 小文本样式
126 +small, .small {
127 + @extend .text-caption;
128 +}
129 +
130 +// 标签样式
131 +label, .label {
132 + @extend .text-caption;
133 + font-weight: 500;
134 + display: block;
135 + margin-bottom: 6px;
136 +}
137 +
138 +// 按钮文字样式
139 +button, .btn {
140 + font-family: $font-family-primary;
141 + font-weight: 500;
142 + letter-spacing: 0;
143 +}
144 +
145 +// 输入框文字样式
146 +input, textarea, select {
147 + font-family: $font-family-primary;
148 + font-size: 14px;
149 + line-height: 22px;
150 + letter-spacing: 0;
151 +}
152 +
153 +// 表格文字样式
154 +table {
155 + font-family: $font-family-primary;
156 +
157 + th {
158 + font-weight: 500;
159 + font-size: 12px;
160 + line-height: 18px;
161 + letter-spacing: 0;
162 + }
163 +
164 + td {
165 + font-size: 12px;
166 + line-height: 18px;
167 + letter-spacing: 0;
168 + }
169 +}
1 +# GCCPOP设计规范 0228
2 +
3 +## 📋 项目概述
4 +
5 +本目录包含基于GCCPOP设计规范的前端样式规范对齐详细修改计划,旨在将前端项目在8个基础规范维度与设计模板对齐。
6 +
7 +## 📁 目录结构
8 +
9 +```
10 +GCCPOP设计规范 0228/
11 +├── README.md # 项目说明文档
12 +├── 前端样式规范对齐详细修改计划.md # 详细修改计划
13 +├── html/
14 +│ └── 0 打开这个.html # 设计规范模板文件
15 +└── 实施指南/
16 + ├── 01-基础规范颜色/
17 + ├── 02-基础规范文字/
18 + ├── 03-基础规范栅格/
19 + ├── 04-基础规范导航/
20 + ├── 05-基础规范图标/
21 + ├── 06-基础规范控件/
22 + ├── 07-基础规范框/
23 + └── 08-基础规范弹窗/
24 +```
25 +
26 +## 🎯 8个基础规范维度
27 +
28 +1. **基础规范颜色**(色值、配色方案、应用场景)
29 +2. **基础规范文字**(字体、字号、行高、字重、文本样式)
30 +3. **基础规范栅格**(栅格系统参数、布局规则、响应式断点)
31 +4. **基础规范导航**(导航结构、交互样式、层级关系)
32 +5. **基础规范图标**(图标库、尺寸规范、风格统一、交互状态)
33 +6. **基础规范控件**(按钮、输入框、选择器等组件样式及交互)
34 +7. **基础规范框**(卡片、面板等容器组件的样式规范)
35 +8. **基础规范弹窗**(弹窗尺寸、层级、动画、交互逻辑)
36 +
37 +## 🎨 核心设计规范
38 +
39 +### 颜色系统
40 +- **主色调:** `#141F33` (RGB: 20, 31, 51)
41 +- **功能色:** 成功 `#52C41A`、警告 `#FAAD14`、危险 `#FF4D4F`、信息 `#13C2C2`
42 +
43 +### 字体系统
44 +- **字体族:** PingFang SC
45 +- **主标题:** 24px, 600, 40px行高
46 +- **正文:** 14px, 400, 22px行高
47 +
48 +### 布局系统
49 +- **圆角:** 6px (基础), 8px (容器), 12px (弹窗)
50 +- **间距:** 4px, 8px, 12px, 16px, 20px, 24px, 32px, 48px
51 +- **阴影:** 基于主色调的 rgba 阴影系统
52 +
53 +## 📊 实施计划
54 +
55 +### 第一阶段(第1-2周):基础系统搭建
56 +- 创建颜色变量系统
57 +- 建立文字层级规范
58 +- 实现栅格系统
59 +
60 +### 第二阶段(第3-4周):组件系统
61 +- 导航系统重构
62 +- 图标系统建立
63 +- 控件系统完善
64 +
65 +### 第三阶段(第5-6周):容器和弹窗
66 +- 框系统实现
67 +- 弹窗系统建立
68 +- Element Plus主题定制
69 +
70 +### 第四阶段(第7-8周):页面应用
71 +- 订单管理页面应用
72 +- 出库管理页面应用
73 +- 发票管理页面应用
74 +- 其他业务页面应用
75 +
76 +### 第五阶段(第9-10周):优化和测试
77 +- 响应式适配
78 +- 交互优化
79 +- 性能优化
80 +- 全面测试
81 +
82 +## 🎯 关键里程碑
83 +
84 +- 第2周末:基础系统完成
85 +- 第4周末:组件系统完成
86 +- 第6周末:容器弹窗系统完成
87 +- 第8周末:页面应用完成
88 +- 第10周末:项目交付
89 +
90 +## 📋 验收标准
91 +
92 +1. **颜色系统**:所有颜色值与应用场景符合设计规范
93 +2. **文字系统**:字体、字号、行高、字重完全对齐
94 +3. **栅格系统**:响应式布局在不同设备上表现一致
95 +4. **导航系统**:交互样式和层级关系符合规范
96 +5. **图标系统**:尺寸规范和风格统一
97 +6. **控件系统**:按钮、输入框等组件样式及交互一致
98 +7. **框系统**:卡片、面板等容器组件样式规范
99 +8. **弹窗系统**:弹窗尺寸、层级、动画、交互逻辑符合规范
100 +
101 +## 🔧 使用指南
102 +
103 +1. **查看详细计划**:阅读 `前端样式规范对齐详细修改计划.md` 了解完整的实施细节
104 +2. **参考设计模板**:查看 `html/0 打开这个.html` 了解原始设计规范
105 +3. **按阶段实施**:按照实施计划逐步完成各个阶段的开发工作
106 +4. **质量检查**:每个阶段结束后进行代码审查和设计规范符合度检查
107 +
108 +## 📞 联系方式
109 +
110 +如有疑问或需要技术支持,请联系项目团队。
111 +
112 +---
113 +
114 +*本规范基于GCCPOP设计规范制定,旨在提供一致、现代、专业的用户体验。*
This diff could not be displayed because it is too large.
1 +<meta http-equiv="refresh" content="0;url=../index.html#3">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=../index.html#8">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=../index.html#7">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=../index.html#5">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=../index.html#6">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=../index.html#4">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=../index.html#2">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=../index.html#1">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=../index.html#0">
...\ No newline at end of file ...\ No newline at end of file
1 +<meta http-equiv="refresh" content="0;url=index.html#p">
...\ No newline at end of file ...\ No newline at end of file
1 +# 前端样式规范对齐详细修改计划
2 +
3 +## 📋 项目概述
4 +
5 +基于GCCPOP设计规范,将前端项目在8个基础规范维度与设计模板对齐,提供一致、现代、专业的用户体验。
6 +
7 +## 🎯 8个基础规范维度
8 +
9 +1. **基础规范颜色**(色值、配色方案、应用场景)
10 +2. **基础规范文字**(字体、字号、行高、字重、文本样式)
11 +3. **基础规范栅格**(栅格系统参数、布局规则、响应式断点)
12 +4. **基础规范导航**(导航结构、交互样式、层级关系)
13 +5. **基础规范图标**(图标库、尺寸规范、风格统一、交互状态)
14 +6. **基础规范控件**(按钮、输入框、选择器等组件样式及交互)
15 +7. **基础规范框**(卡片、面板等容器组件的样式规范)
16 +8. **基础规范弹窗**(弹窗尺寸、层级、动画、交互逻辑)
17 +
18 +---
19 +
20 +## 🎨 1. 基础规范颜色系统
21 +
22 +### 从模板提取的核心颜色规范
23 +- **主色:** `#141F33` (RGB: 20, 31, 51, HSL: 220°, 44%, 14%)
24 +- **字体:** PingFang SC
25 +- **字体粗细:** 600 (Semibold)
26 +- **行高:** 40px (1.67倍)
27 +
28 +### 修改目标文件
29 +`frontend/src/assets/styles/variables.scss`
30 +
31 +### 具体修改内容
32 +
33 +```scss
34 +:root {
35 + // 主色调系统 - 基于设计规范 #141F33
36 + --el-color-primary: #141F33;
37 + --el-color-primary-light-3: #546477;
38 + --el-color-primary-light-5: #6A798C;
39 + --el-color-primary-light-7: #7F8EA1;
40 + --el-color-primary-light-8: #94A3B6;
41 + --el-color-primary-light-9: #A9B8CB;
42 + --el-color-primary-dark-2: #0F1A2A;
43 +
44 + // 功能色系 - 基于设计规范
45 + --el-color-success: #52C41A;
46 + --el-color-warning: #FAAD14;
47 + --el-color-danger: #FF4D4F;
48 + --el-color-info: #13C2C2;
49 +
50 + // 文本颜色系统
51 + --el-text-color-primary: #141F33;
52 + --el-text-color-regular: #4A5568;
53 + --el-text-color-secondary: #718096;
54 + --el-text-color-placeholder: #A0AEC0;
55 + --el-text-color-disabled: #CBD5E0;
56 +
57 + // 边框颜色系统
58 + --el-border-color: #E2E8F0;
59 + --el-border-color-light: #EDF2F7;
60 + --el-border-color-lighter: #F7FAFC;
61 + --el-border-color-extra-light: #FAFBFC;
62 +
63 + // 背景色系统
64 + --el-bg-color: #ffffff;
65 + --el-bg-color-page: #F8FAFC;
66 + --el-bg-color-overlay: #ffffff;
67 +
68 + // 布局相关 - 基于设计规范
69 + --sidebar-width: 240px;
70 + --sidebar-collapsed-width: 64px;
71 + --header-height: 60px;
72 + --breadcrumb-height: 40px;
73 +
74 + // 阴影系统 - 基于设计规范
75 + --el-box-shadow: 0 2px 8px rgba(20, 31, 51, 0.08);
76 + --el-box-shadow-light: 0 2px 12px rgba(20, 31, 51, 0.06);
77 + --el-box-shadow-base: 0 2px 8px rgba(20, 31, 51, 0.08);
78 + --el-box-shadow-dark: 0 4px 16px rgba(20, 31, 51, 0.12);
79 +
80 + // 圆角系统
81 + --el-border-radius-base: 6px;
82 + --el-border-radius-small: 4px;
83 + --el-border-radius-round: 20px;
84 + --el-border-radius-circle: 100%;
85 +
86 + // 字体系统 - 基于设计规范 PingFang SC
87 + --el-font-size-extra-large: 24px;
88 + --el-font-size-large: 20px;
89 + --el-font-size-medium: 18px;
90 + --el-font-size-base: 14px;
91 + --el-font-size-small: 12px;
92 + --el-font-size-extra-small: 11px;
93 +
94 + // 间距系统 - 基于设计规范
95 + --el-spacing-extra-large: 32px;
96 + --el-spacing-large: 24px;
97 + --el-spacing-medium: 16px;
98 + --el-spacing-base: 12px;
99 + --el-spacing-small: 8px;
100 + --el-spacing-extra-small: 4px;
101 +
102 + // 字体族系统
103 + --el-font-family: 'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
104 +}
105 +```
106 +
107 +---
108 +
109 +## 📝 2. 基础规范文字系统
110 +
111 +### 从模板提取的文字规范
112 +- **字体族:** PingFang SC
113 +- **主标题:** 24px, 600, 40px行高
114 +- **字间距:** 0
115 +- **对齐:** left
116 +
117 +### 修改目标文件
118 +`frontend/src/assets/styles/typography.scss` (新建)
119 +
120 +### 具体修改内容
121 +
122 +```scss
123 +// 字体系统
124 +$font-family-primary: 'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
125 +
126 +// 文字层级系统
127 +.text-h1 {
128 + font-family: $font-family-primary;
129 + font-size: 24px;
130 + font-weight: 600;
131 + line-height: 40px;
132 + letter-spacing: 0;
133 + color: var(--el-text-color-primary);
134 +}
135 +
136 +.text-h2 {
137 + font-family: $font-family-primary;
138 + font-size: 20px;
139 + font-weight: 600;
140 + line-height: 32px;
141 + letter-spacing: 0;
142 + color: var(--el-text-color-primary);
143 +}
144 +
145 +.text-h3 {
146 + font-family: $font-family-primary;
147 + font-size: 18px;
148 + font-weight: 600;
149 + line-height: 28px;
150 + letter-spacing: 0;
151 + color: var(--el-text-color-primary);
152 +}
153 +
154 +.text-h4 {
155 + font-family: $font-family-primary;
156 + font-size: 16px;
157 + font-weight: 600;
158 + line-height: 24px;
159 + letter-spacing: 0;
160 + color: var(--el-text-color-primary);
161 +}
162 +
163 +.text-body {
164 + font-family: $font-family-primary;
165 + font-size: 14px;
166 + font-weight: 400;
167 + line-height: 22px;
168 + letter-spacing: 0;
169 + color: var(--el-text-color-primary);
170 +}
171 +
172 +.text-caption {
173 + font-family: $font-family-primary;
174 + font-size: 12px;
175 + font-weight: 400;
176 + line-height: 18px;
177 + letter-spacing: 0;
178 + color: var(--el-text-color-regular);
179 +}
180 +
181 +.text-small {
182 + font-family: $font-family-primary;
183 + font-size: 11px;
184 + font-weight: 400;
185 + line-height: 16px;
186 + letter-spacing: 0;
187 + color: var(--el-text-color-secondary);
188 +}
189 +
190 +// 文字工具类
191 +.text-center { text-align: center; }
192 +.text-left { text-align: left; }
193 +.text-right { text-align: right; }
194 +
195 +.text-bold { font-weight: 600; }
196 +.text-medium { font-weight: 500; }
197 +.text-normal { font-weight: 400; }
198 +
199 +.text-ellipsis {
200 + overflow: hidden;
201 + text-overflow: ellipsis;
202 + white-space: nowrap;
203 +}
204 +
205 +.text-ellipsis-2 {
206 + display: -webkit-box;
207 + -webkit-line-clamp: 2;
208 + -webkit-box-orient: vertical;
209 + overflow: hidden;
210 +}
211 +
212 +.text-ellipsis-3 {
213 + display: -webkit-box;
214 + -webkit-line-clamp: 3;
215 + -webkit-box-orient: vertical;
216 + overflow: hidden;
217 +}
218 +```
219 +
220 +---
221 +
222 +## 📐 3. 基础规范栅格系统
223 +
224 +### 修改目标文件
225 +`frontend/src/assets/styles/grid-system.scss` (新建)
226 +
227 +### 具体修改内容
228 +
229 +```scss
230 +// 栅格系统参数
231 +$grid-columns: 24;
232 +$grid-gutter: 16px;
233 +$container-max-width: 1200px;
234 +
235 +// 响应式断点
236 +$breakpoint-xs: 480px;
237 +$breakpoint-sm: 768px;
238 +$breakpoint-md: 992px;
239 +$breakpoint-lg: 1200px;
240 +$breakpoint-xl: 1600px;
241 +
242 +// 容器系统
243 +.container {
244 + max-width: $container-max-width;
245 + margin: 0 auto;
246 + padding: 0 $grid-gutter;
247 +}
248 +
249 +.container-fluid {
250 + width: 100%;
251 + padding: 0 $grid-gutter;
252 +}
253 +
254 +// 栅格行
255 +.row {
256 + display: flex;
257 + flex-wrap: wrap;
258 + margin: 0 (-$grid-gutter / 2);
259 +}
260 +
261 +// 栅格列
262 +.col {
263 + flex: 1;
264 + padding: 0 ($grid-gutter / 2);
265 +}
266 +
267 +// 响应式栅格
268 +@for $i from 1 through $grid-columns {
269 + .col-#{$i} {
270 + flex: 0 0 percentage($i / $grid-columns);
271 + max-width: percentage($i / $grid-columns);
272 + padding: 0 ($grid-gutter / 2);
273 + }
274 +}
275 +
276 +// 响应式断点
277 +@media (max-width: $breakpoint-sm) {
278 + .container {
279 + padding: 0 12px;
280 + }
281 +
282 + .row {
283 + margin: 0 -6px;
284 + }
285 +
286 + .col, [class*="col-"] {
287 + padding: 0 6px;
288 + }
289 +}
290 +
291 +@media (max-width: $breakpoint-xs) {
292 + .container {
293 + padding: 0 8px;
294 + }
295 +
296 + .row {
297 + margin: 0 -4px;
298 + }
299 +
300 + .col, [class*="col-"] {
301 + padding: 0 4px;
302 + }
303 +}
304 +
305 +// 间距系统
306 +.spacing-xs { margin: 4px; }
307 +.spacing-sm { margin: 8px; }
308 +.spacing-md { margin: 16px; }
309 +.spacing-lg { margin: 24px; }
310 +.spacing-xl { margin: 32px; }
311 +.spacing-xxl { margin: 48px; }
312 +
313 +// 内边距系统
314 +.padding-xs { padding: 4px; }
315 +.padding-sm { padding: 8px; }
316 +.padding-md { padding: 16px; }
317 +.padding-lg { padding: 24px; }
318 +.padding-xl { padding: 32px; }
319 +.padding-xxl { padding: 48px; }
320 +
321 +// Flex 布局工具类
322 +.flex { display: flex; }
323 +.flex-column { flex-direction: column; }
324 +.flex-row { flex-direction: row; }
325 +.flex-wrap { flex-wrap: wrap; }
326 +.flex-nowrap { flex-wrap: nowrap; }
327 +
328 +.justify-start { justify-content: flex-start; }
329 +.justify-center { justify-content: center; }
330 +.justify-end { justify-content: flex-end; }
331 +.justify-between { justify-content: space-between; }
332 +.justify-around { justify-content: space-around; }
333 +
334 +.align-start { align-items: flex-start; }
335 +.align-center { align-items: center; }
336 +.align-end { align-items: flex-end; }
337 +.align-stretch { align-items: stretch; }
338 +
339 +// 显示/隐藏工具类
340 +.d-none { display: none; }
341 +.d-block { display: block; }
342 +.d-inline { display: inline; }
343 +.d-inline-block { display: inline-block; }
344 +.d-flex { display: flex; }
345 +.d-grid { display: grid; }
346 +
347 +// 响应式显示/隐藏
348 +@media (max-width: $breakpoint-sm) {
349 + .d-sm-none { display: none; }
350 + .d-sm-block { display: block; }
351 + .d-sm-flex { display: flex; }
352 +}
353 +
354 +@media (max-width: $breakpoint-xs) {
355 + .d-xs-none { display: none; }
356 + .d-xs-block { display: block; }
357 + .d-xs-flex { display: flex; }
358 +}
359 +```
360 +
361 +---
362 +
363 +## 🧭 4. 基础规范导航系统
364 +
365 +### 修改目标文件
366 +- `frontend/src/components/layout/Header.vue`
367 +- `frontend/src/components/layout/Sidebar.vue`
368 +- `frontend/src/assets/styles/navigation.scss` (新建)
369 +
370 +### 具体修改内容
371 +
372 +```scss
373 +// Header 导航规范
374 +.header {
375 + height: 60px;
376 + background: var(--el-bg-color);
377 + border-bottom: 1px solid var(--el-border-color);
378 + box-shadow: 0 2px 8px rgba(20, 31, 51, 0.08);
379 + display: flex;
380 + align-items: center;
381 + justify-content: space-between;
382 + padding: 0 24px;
383 + z-index: 1000;
384 +}
385 +
386 +.header-left {
387 + display: flex;
388 + align-items: center;
389 + gap: 16px;
390 +}
391 +
392 +.header-right {
393 + display: flex;
394 + align-items: center;
395 + gap: 12px;
396 +}
397 +
398 +// 折叠按钮
399 +.collapse-btn {
400 + background: none;
401 + border: none;
402 + cursor: pointer;
403 + padding: 8px;
404 + border-radius: 4px;
405 + color: var(--el-text-color-regular);
406 + transition: all 0.2s ease;
407 +
408 + &:hover {
409 + background: var(--el-bg-color-page);
410 + color: var(--el-text-color-primary);
411 + }
412 +}
413 +
414 +// 头部按钮
415 +.header-btn {
416 + background: none;
417 + border: none;
418 + cursor: pointer;
419 + padding: 8px;
420 + border-radius: 4px;
421 + color: var(--el-text-color-regular);
422 + transition: all 0.2s ease;
423 +
424 + &:hover {
425 + background: var(--el-bg-color-page);
426 + color: var(--el-text-color-primary);
427 + }
428 +}
429 +
430 +// 用户信息
431 +.user-info {
432 + display: flex;
433 + align-items: center;
434 + gap: 8px;
435 + padding: 4px 8px;
436 + border-radius: 4px;
437 + cursor: pointer;
438 + transition: background-color 0.2s ease;
439 +
440 + &:hover {
441 + background: var(--el-bg-color-page);
442 + }
443 +}
444 +
445 +.username {
446 + font-family: var(--el-font-family);
447 + font-size: 14px;
448 + font-weight: 500;
449 + color: var(--el-text-color-primary);
450 +}
451 +
452 +.dropdown-icon {
453 + color: var(--el-text-color-secondary);
454 + transition: color 0.2s ease;
455 +}
456 +
457 +// Sidebar 导航规范
458 +.sidebar {
459 + width: var(--sidebar-width);
460 + height: 100vh;
461 + background: var(--el-bg-color);
462 + border-right: 1px solid var(--el-border-color);
463 + box-shadow: 2px 0 8px rgba(20, 31, 51, 0.08);
464 + display: flex;
465 + flex-direction: column;
466 + transition: width 0.3s ease;
467 +}
468 +
469 +.sidebar.collapsed {
470 + width: var(--sidebar-collapsed-width);
471 +}
472 +
473 +.sidebar-logo {
474 + height: 60px;
475 + display: flex;
476 + align-items: center;
477 + padding: 0 24px;
478 + border-bottom: 1px solid var(--el-border-color);
479 +}
480 +
481 +.logo-link {
482 + display: flex;
483 + align-items: center;
484 + gap: 12px;
485 + text-decoration: none;
486 + color: var(--el-text-color-primary);
487 +}
488 +
489 +.logo-img {
490 + width: 32px;
491 + height: 32px;
492 +}
493 +
494 +.logo-text {
495 + font-family: var(--el-font-family);
496 + font-size: 18px;
497 + font-weight: 600;
498 + color: var(--el-text-color-primary);
499 +}
500 +
501 +.sidebar-scrollbar {
502 + flex: 1;
503 + overflow-y: auto;
504 +}
505 +
506 +// 菜单项样式
507 +.el-menu {
508 + border-right: none;
509 + background: var(--el-bg-color);
510 +}
511 +
512 +.el-menu-item {
513 + font-family: var(--el-font-family);
514 + font-size: 14px;
515 + font-weight: 500;
516 + line-height: 22px;
517 + color: var(--el-text-color-regular);
518 + height: 48px;
519 + line-height: 48px;
520 + margin: 2px 8px;
521 + border-radius: 6px;
522 + transition: all 0.2s ease;
523 +
524 + &.is-active {
525 + color: var(--el-color-primary);
526 + background-color: var(--el-bg-color-page);
527 + font-weight: 600;
528 + }
529 +
530 + &:hover {
531 + background-color: var(--el-bg-color-page);
532 + color: var(--el-text-color-primary);
533 + }
534 +}
535 +
536 +.el-submenu__title {
537 + font-family: var(--el-font-family);
538 + font-size: 14px;
539 + font-weight: 500;
540 + line-height: 22px;
541 + color: var(--el-text-color-regular);
542 + height: 48px;
543 + line-height: 48px;
544 + margin: 2px 8px;
545 + border-radius: 6px;
546 + transition: all 0.2s ease;
547 +
548 + &:hover {
549 + background-color: var(--el-bg-color-page);
550 + color: var(--el-text-color-primary);
551 + }
552 +}
553 +
554 +// 子菜单
555 +.el-submenu .el-menu-item {
556 + margin: 1px 16px;
557 + padding-left: 24px;
558 + height: 40px;
559 + line-height: 40px;
560 + font-size: 13px;
561 +}
562 +
563 +// 面包屑导航
564 +.breadcrumb {
565 + height: var(--breadcrumb-height);
566 + background: var(--el-bg-color);
567 + border-bottom: 1px solid var(--el-border-color);
568 + display: flex;
569 + align-items: center;
570 + padding: 0 24px;
571 +}
572 +
573 +.el-breadcrumb {
574 + font-family: var(--el-font-family);
575 + font-size: 14px;
576 +}
577 +
578 +.el-breadcrumb__item {
579 + .el-breadcrumb__inner {
580 + color: var(--el-text-color-regular);
581 + font-weight: 400;
582 +
583 + &:hover {
584 + color: var(--el-color-primary);
585 + }
586 + }
587 +
588 + &:last-child .el-breadcrumb__inner {
589 + color: var(--el-text-color-primary);
590 + font-weight: 500;
591 + }
592 +}
593 +```
594 +
595 +---
596 +
597 +## 🎯 5. 基础规范图标系统
598 +
599 +### 修改目标文件
600 +`frontend/src/assets/styles/icons.scss` (新建)
601 +
602 +### 具体修改内容
603 +
604 +```scss
605 +// 图标尺寸规范
606 +.icon-xs {
607 + width: 12px;
608 + height: 12px;
609 +}
610 +
611 +.icon-sm {
612 + width: 16px;
613 + height: 16px;
614 +}
615 +
616 +.icon-md {
617 + width: 20px;
618 + height: 20px;
619 +}
620 +
621 +.icon-lg {
622 + width: 24px;
623 + height: 24px;
624 +}
625 +
626 +.icon-xl {
627 + width: 32px;
628 + height: 32px;
629 +}
630 +
631 +.icon-xxl {
632 + width: 48px;
633 + height: 48px;
634 +}
635 +
636 +// 图标颜色规范
637 +.icon-primary {
638 + color: var(--el-color-primary);
639 +}
640 +
641 +.icon-secondary {
642 + color: var(--el-text-color-regular);
643 +}
644 +
645 +.icon-tertiary {
646 + color: var(--el-text-color-secondary);
647 +}
648 +
649 +.icon-success {
650 + color: var(--el-color-success);
651 +}
652 +
653 +.icon-warning {
654 + color: var(--el-color-warning);
655 +}
656 +
657 +.icon-error {
658 + color: var(--el-color-danger);
659 +}
660 +
661 +.icon-info {
662 + color: var(--el-color-info);
663 +}
664 +
665 +.icon-disabled {
666 + color: var(--el-text-color-disabled);
667 +}
668 +
669 +// 图标交互状态
670 +.icon-interactive {
671 + cursor: pointer;
672 + transition: all 0.2s ease;
673 +
674 + &:hover {
675 + color: var(--el-color-primary);
676 + transform: scale(1.1);
677 + }
678 +
679 + &:active {
680 + transform: scale(0.95);
681 + }
682 +}
683 +
684 +// 图标容器
685 +.icon-container {
686 + display: inline-flex;
687 + align-items: center;
688 + justify-content: center;
689 + border-radius: 4px;
690 + transition: background-color 0.2s ease;
691 +
692 + &:hover {
693 + background-color: var(--el-bg-color-page);
694 + }
695 +
696 + &.icon-container-sm {
697 + padding: 4px;
698 + }
699 +
700 + &.icon-container-md {
701 + padding: 6px;
702 + }
703 +
704 + &.icon-container-lg {
705 + padding: 8px;
706 + }
707 +}
708 +
709 +// 图标按钮
710 +.icon-btn {
711 + display: inline-flex;
712 + align-items: center;
713 + justify-content: center;
714 + background: none;
715 + border: none;
716 + cursor: pointer;
717 + border-radius: 4px;
718 + transition: all 0.2s ease;
719 +
720 + &:hover {
721 + background-color: var(--el-bg-color-page);
722 + }
723 +
724 + &:active {
725 + transform: scale(0.95);
726 + }
727 +
728 + &.icon-btn-sm {
729 + width: 24px;
730 + height: 24px;
731 + }
732 +
733 + &.icon-btn-md {
734 + width: 32px;
735 + height: 32px;
736 + }
737 +
738 + &.icon-btn-lg {
739 + width: 40px;
740 + height: 40px;
741 + }
742 +}
743 +
744 +// 图标组合
745 +.icon-group {
746 + display: inline-flex;
747 + align-items: center;
748 + gap: 4px;
749 +}
750 +
751 +.icon-with-text {
752 + display: inline-flex;
753 + align-items: center;
754 + gap: 6px;
755 +
756 + .icon-text {
757 + font-family: var(--el-font-family);
758 + font-size: 14px;
759 + color: var(--el-text-color-regular);
760 + }
761 +}
762 +
763 +// 状态图标
764 +.status-icon {
765 + &.status-success {
766 + color: var(--el-color-success);
767 + }
768 +
769 + &.status-warning {
770 + color: var(--el-color-warning);
771 + }
772 +
773 + &.status-error {
774 + color: var(--el-color-danger);
775 + }
776 +
777 + &.status-info {
778 + color: var(--el-color-info);
779 + }
780 +
781 + &.status-default {
782 + color: var(--el-text-color-secondary);
783 + }
784 +}
785 +
786 +// 加载图标动画
787 +.icon-loading {
788 + animation: spin 1s linear infinite;
789 +}
790 +
791 +@keyframes spin {
792 + from {
793 + transform: rotate(0deg);
794 + }
795 + to {
796 + transform: rotate(360deg);
797 + }
798 +}
799 +
800 +// 图标淡入动画
801 +.icon-fade-in {
802 + animation: fadeIn 0.3s ease-in;
803 +}
804 +
805 +@keyframes fadeIn {
806 + from {
807 + opacity: 0;
808 + transform: scale(0.8);
809 + }
810 + to {
811 + opacity: 1;
812 + transform: scale(1);
813 + }
814 +}
815 +```
816 +
817 +---
818 +
819 +## 🎛️ 6. 基础规范控件系统
820 +
821 +### 修改目标文件
822 +`frontend/src/assets/styles/controls.scss` (新建)
823 +
824 +### 具体修改内容
825 +
826 +```scss
827 +// 按钮系统
828 +.btn {
829 + font-family: var(--el-font-family);
830 + font-size: 14px;
831 + font-weight: 500;
832 + line-height: 22px;
833 + letter-spacing: 0;
834 + border-radius: 6px;
835 + border: none;
836 + cursor: pointer;
837 + transition: all 0.2s ease;
838 + display: inline-flex;
839 + align-items: center;
840 + justify-content: center;
841 + gap: 8px;
842 + text-decoration: none;
843 +
844 + // 按钮尺寸
845 + &.btn-sm {
846 + padding: 6px 12px;
847 + font-size: 12px;
848 + line-height: 18px;
849 + min-height: 28px;
850 + }
851 +
852 + &.btn-md {
853 + padding: 8px 16px;
854 + font-size: 14px;
855 + line-height: 22px;
856 + min-height: 36px;
857 + }
858 +
859 + &.btn-lg {
860 + padding: 12px 20px;
861 + font-size: 16px;
862 + line-height: 24px;
863 + min-height: 44px;
864 + }
865 +
866 + // 按钮类型
867 + &.btn-primary {
868 + background: var(--el-color-primary);
869 + color: white;
870 +
871 + &:hover {
872 + background: var(--el-color-primary-dark-2);
873 + }
874 +
875 + &:active {
876 + background: var(--el-color-primary-dark-2);
877 + transform: translateY(1px);
878 + }
879 +
880 + &:disabled {
881 + background: var(--el-text-color-disabled);
882 + cursor: not-allowed;
883 + transform: none;
884 + }
885 + }
886 +
887 + &.btn-secondary {
888 + background: var(--el-text-color-secondary);
889 + color: white;
890 +
891 + &:hover {
892 + background: var(--el-text-color-regular);
893 + }
894 +
895 + &:active {
896 + background: var(--el-text-color-regular);
897 + transform: translateY(1px);
898 + }
899 +
900 + &:disabled {
901 + background: var(--el-text-color-disabled);
902 + cursor: not-allowed;
903 + transform: none;
904 + }
905 + }
906 +
907 + &.btn-outline {
908 + background: transparent;
909 + color: var(--el-color-primary);
910 + border: 1px solid var(--el-color-primary);
911 +
912 + &:hover {
913 + background: var(--el-color-primary);
914 + color: white;
915 + }
916 +
917 + &:active {
918 + background: var(--el-color-primary-dark-2);
919 + color: white;
920 + transform: translateY(1px);
921 + }
922 +
923 + &:disabled {
924 + background: transparent;
925 + color: var(--el-text-color-disabled);
926 + border-color: var(--el-text-color-disabled);
927 + cursor: not-allowed;
928 + transform: none;
929 + }
930 + }
931 +
932 + &.btn-ghost {
933 + background: transparent;
934 + color: var(--el-text-color-regular);
935 + border: 1px solid var(--el-border-color);
936 +
937 + &:hover {
938 + background: var(--el-bg-color-page);
939 + color: var(--el-text-color-primary);
940 + border-color: var(--el-color-primary);
941 + }
942 +
943 + &:active {
944 + background: var(--el-bg-color-page);
945 + transform: translateY(1px);
946 + }
947 +
948 + &:disabled {
949 + background: transparent;
950 + color: var(--el-text-color-disabled);
951 + border-color: var(--el-text-color-disabled);
952 + cursor: not-allowed;
953 + transform: none;
954 + }
955 + }
956 +
957 + &.btn-text {
958 + background: transparent;
959 + color: var(--el-color-primary);
960 + border: none;
961 + padding: 4px 8px;
962 +
963 + &:hover {
964 + background: var(--el-bg-color-page);
965 + }
966 +
967 + &:active {
968 + background: var(--el-bg-color-page);
969 + }
970 +
971 + &:disabled {
972 + background: transparent;
973 + color: var(--el-text-color-disabled);
974 + cursor: not-allowed;
975 + }
976 + }
977 +}
978 +
979 +// 输入框系统
980 +.input {
981 + font-family: var(--el-font-family);
982 + font-size: 14px;
983 + font-weight: 400;
984 + line-height: 22px;
985 + letter-spacing: 0;
986 + border: 1px solid var(--el-border-color);
987 + border-radius: 6px;
988 + padding: 8px 12px;
989 + background: var(--el-bg-color);
990 + color: var(--el-text-color-primary);
991 + transition: all 0.2s ease;
992 + width: 100%;
993 +
994 + &:focus {
995 + border-color: var(--el-color-primary);
996 + outline: none;
997 + box-shadow: 0 0 0 2px rgba(20, 31, 51, 0.1);
998 + }
999 +
1000 + &:disabled {
1001 + background: var(--el-bg-color-page);
1002 + color: var(--el-text-color-disabled);
1003 + cursor: not-allowed;
1004 + border-color: var(--el-border-color-light);
1005 + }
1006 +
1007 + &::placeholder {
1008 + color: var(--el-text-color-placeholder);
1009 + }
1010 +
1011 + // 输入框尺寸
1012 + &.input-sm {
1013 + padding: 6px 10px;
1014 + font-size: 12px;
1015 + line-height: 18px;
1016 + min-height: 28px;
1017 + }
1018 +
1019 + &.input-md {
1020 + padding: 8px 12px;
1021 + font-size: 14px;
1022 + line-height: 22px;
1023 + min-height: 36px;
1024 + }
1025 +
1026 + &.input-lg {
1027 + padding: 12px 16px;
1028 + font-size: 16px;
1029 + line-height: 24px;
1030 + min-height: 44px;
1031 + }
1032 +
1033 + // 输入框状态
1034 + &.input-error {
1035 + border-color: var(--el-color-danger);
1036 +
1037 + &:focus {
1038 + box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.1);
1039 + }
1040 + }
1041 +
1042 + &.input-success {
1043 + border-color: var(--el-color-success);
1044 +
1045 + &:focus {
1046 + box-shadow: 0 0 0 2px rgba(82, 196, 26, 0.1);
1047 + }
1048 + }
1049 +}
1050 +
1051 +// 选择器系统
1052 +.select {
1053 + @extend .input;
1054 + cursor: pointer;
1055 + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
1056 + background-position: right 8px center;
1057 + background-repeat: no-repeat;
1058 + background-size: 16px;
1059 + padding-right: 32px;
1060 +
1061 + &:focus {
1062 + border-color: var(--el-color-primary);
1063 + box-shadow: 0 0 0 2px rgba(20, 31, 51, 0.1);
1064 + }
1065 +
1066 + &:disabled {
1067 + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23cbd5e0' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
1068 + }
1069 +}
1070 +
1071 +// 文本域
1072 +.textarea {
1073 + @extend .input;
1074 + min-height: 80px;
1075 + resize: vertical;
1076 + font-family: var(--el-font-family);
1077 +}
1078 +
1079 +// 复选框和单选框
1080 +.checkbox, .radio {
1081 + display: inline-flex;
1082 + align-items: center;
1083 + gap: 8px;
1084 + cursor: pointer;
1085 + font-family: var(--el-font-family);
1086 + font-size: 14px;
1087 + color: var(--el-text-color-primary);
1088 +
1089 + input[type="checkbox"], input[type="radio"] {
1090 + width: 16px;
1091 + height: 16px;
1092 + cursor: pointer;
1093 + }
1094 +
1095 + &:disabled {
1096 + color: var(--el-text-color-disabled);
1097 + cursor: not-allowed;
1098 + }
1099 +}
1100 +
1101 +// 开关
1102 +.switch {
1103 + position: relative;
1104 + display: inline-block;
1105 + width: 44px;
1106 + height: 24px;
1107 +
1108 + input {
1109 + opacity: 0;
1110 + width: 0;
1111 + height: 0;
1112 + }
1113 +
1114 + .slider {
1115 + position: absolute;
1116 + cursor: pointer;
1117 + top: 0;
1118 + left: 0;
1119 + right: 0;
1120 + bottom: 0;
1121 + background-color: var(--el-border-color);
1122 + transition: 0.2s;
1123 + border-radius: 24px;
1124 +
1125 + &:before {
1126 + position: absolute;
1127 + content: "";
1128 + height: 18px;
1129 + width: 18px;
1130 + left: 3px;
1131 + bottom: 3px;
1132 + background-color: white;
1133 + transition: 0.2s;
1134 + border-radius: 50%;
1135 + }
1136 + }
1137 +
1138 + input:checked + .slider {
1139 + background-color: var(--el-color-primary);
1140 + }
1141 +
1142 + input:checked + .slider:before {
1143 + transform: translateX(20px);
1144 + }
1145 +
1146 + &:disabled .slider {
1147 + background-color: var(--el-text-color-disabled);
1148 + cursor: not-allowed;
1149 + }
1150 +}
1151 +
1152 +// 表单组
1153 +.form-group {
1154 + margin-bottom: 16px;
1155 +
1156 + .form-label {
1157 + display: block;
1158 + margin-bottom: 6px;
1159 + font-family: var(--el-font-family);
1160 + font-size: 14px;
1161 + font-weight: 500;
1162 + color: var(--el-text-color-primary);
1163 + }
1164 +
1165 + .form-help {
1166 + margin-top: 4px;
1167 + font-family: var(--el-font-family);
1168 + font-size: 12px;
1169 + color: var(--el-text-color-secondary);
1170 + }
1171 +
1172 + .form-error {
1173 + margin-top: 4px;
1174 + font-family: var(--el-font-family);
1175 + font-size: 12px;
1176 + color: var(--el-color-danger);
1177 + }
1178 +}
1179 +```
1180 +
1181 +---
1182 +
1183 +## 📦 7. 基础规范框系统
1184 +
1185 +### 修改目标文件
1186 +`frontend/src/assets/styles/containers.scss` (新建)
1187 +
1188 +### 具体修改内容
1189 +
1190 +```scss
1191 +// 卡片容器
1192 +.card {
1193 + background: var(--el-bg-color);
1194 + border-radius: 8px;
1195 + box-shadow: 0 2px 8px rgba(20, 31, 51, 0.08);
1196 + border: 1px solid var(--el-border-color);
1197 + overflow: hidden;
1198 + transition: box-shadow 0.2s ease;
1199 +
1200 + &:hover {
1201 + box-shadow: 0 4px 16px rgba(20, 31, 51, 0.12);
1202 + }
1203 +}
1204 +
1205 +.card-header {
1206 + padding: 16px 20px;
1207 + border-bottom: 1px solid var(--el-border-color);
1208 + background: var(--el-bg-color-page);
1209 +
1210 + .card-title {
1211 + @extend .text-h4;
1212 + margin: 0;
1213 + color: var(--el-text-color-primary);
1214 + }
1215 +
1216 + .card-subtitle {
1217 + @extend .text-caption;
1218 + margin: 4px 0 0 0;
1219 + color: var(--el-text-color-secondary);
1220 + }
1221 +
1222 + .card-actions {
1223 + display: flex;
1224 + align-items: center;
1225 + gap: 8px;
1226 + margin-top: 8px;
1227 + }
1228 +}
1229 +
1230 +.card-body {
1231 + padding: 20px;
1232 +}
1233 +
1234 +.card-footer {
1235 + padding: 16px 20px;
1236 + border-top: 1px solid var(--el-border-color);
1237 + background: var(--el-bg-color-page);
1238 +}
1239 +
1240 +// 面板容器
1241 +.panel {
1242 + background: var(--el-bg-color);
1243 + border-radius: 8px;
1244 + border: 1px solid var(--el-border-color);
1245 + overflow: hidden;
1246 +}
1247 +
1248 +.panel-header {
1249 + padding: 12px 16px;
1250 + background: var(--el-bg-color-page);
1251 + border-bottom: 1px solid var(--el-border-color);
1252 +
1253 + .panel-title {
1254 + @extend .text-h4;
1255 + margin: 0;
1256 + color: var(--el-text-color-primary);
1257 + }
1258 +}
1259 +
1260 +.panel-body {
1261 + padding: 16px;
1262 +}
1263 +
1264 +.panel-footer {
1265 + padding: 12px 16px;
1266 + border-top: 1px solid var(--el-border-color);
1267 + background: var(--el-bg-color-page);
1268 +}
1269 +
1270 +// 表格容器
1271 +.table-container {
1272 + background: var(--el-bg-color);
1273 + border-radius: 8px;
1274 + box-shadow: 0 2px 8px rgba(20, 31, 51, 0.08);
1275 + overflow: hidden;
1276 +}
1277 +
1278 +.table-header {
1279 + padding: 12px 16px;
1280 + background: var(--el-bg-color-page);
1281 + border-bottom: 1px solid var(--el-border-color);
1282 +
1283 + .table-title {
1284 + @extend .text-h4;
1285 + margin: 0;
1286 + color: var(--el-text-color-primary);
1287 + }
1288 +
1289 + .table-actions {
1290 + display: flex;
1291 + align-items: center;
1292 + gap: 8px;
1293 + margin-top: 8px;
1294 + }
1295 +}
1296 +
1297 +.table-content {
1298 + overflow-x: auto;
1299 +}
1300 +
1301 +// 搜索表单容器
1302 +.search-form {
1303 + background: var(--el-bg-color);
1304 + border-radius: 8px;
1305 + box-shadow: 0 2px 8px rgba(20, 31, 51, 0.08);
1306 + padding: 20px;
1307 + margin-bottom: 16px;
1308 +
1309 + .search-form-title {
1310 + @extend .text-h4;
1311 + margin: 0 0 16px 0;
1312 + color: var(--el-text-color-primary);
1313 + }
1314 +
1315 + .search-form-content {
1316 + display: flex;
1317 + flex-wrap: wrap;
1318 + gap: 16px;
1319 + align-items: end;
1320 + }
1321 +
1322 + .search-form-actions {
1323 + display: flex;
1324 + gap: 8px;
1325 + margin-left: auto;
1326 + }
1327 +}
1328 +
1329 +// 统计卡片
1330 +.stat-card {
1331 + background: var(--el-bg-color);
1332 + border-radius: 8px;
1333 + box-shadow: 0 2px 8px rgba(20, 31, 51, 0.08);
1334 + padding: 20px;
1335 + border: 1px solid var(--el-border-color);
1336 + transition: all 0.2s ease;
1337 +
1338 + &:hover {
1339 + box-shadow: 0 4px 16px rgba(20, 31, 51, 0.12);
1340 + transform: translateY(-2px);
1341 + }
1342 +
1343 + .stat-value {
1344 + @extend .text-h2;
1345 + margin: 0;
1346 + color: var(--el-color-primary);
1347 + }
1348 +
1349 + .stat-label {
1350 + @extend .text-caption;
1351 + margin: 4px 0 0 0;
1352 + color: var(--el-text-color-secondary);
1353 + }
1354 +
1355 + .stat-icon {
1356 + width: 40px;
1357 + height: 40px;
1358 + color: var(--el-color-primary);
1359 + margin-bottom: 12px;
1360 + }
1361 +
1362 + .stat-trend {
1363 + display: flex;
1364 + align-items: center;
1365 + gap: 4px;
1366 + margin-top: 8px;
1367 + font-size: 12px;
1368 +
1369 + &.trend-up {
1370 + color: var(--el-color-success);
1371 + }
1372 +
1373 + &.trend-down {
1374 + color: var(--el-color-danger);
1375 + }
1376 +
1377 + &.trend-neutral {
1378 + color: var(--el-text-color-secondary);
1379 + }
1380 + }
1381 +}
1382 +
1383 +// 信息面板
1384 +.info-panel {
1385 + background: var(--el-bg-color);
1386 + border-radius: 8px;
1387 + border: 1px solid var(--el-border-color);
1388 + padding: 16px;
1389 +
1390 + .info-item {
1391 + display: flex;
1392 + justify-content: space-between;
1393 + align-items: center;
1394 + padding: 8px 0;
1395 + border-bottom: 1px solid var(--el-border-color-light);
1396 +
1397 + &:last-child {
1398 + border-bottom: none;
1399 + }
1400 +
1401 + .info-label {
1402 + @extend .text-body;
1403 + color: var(--el-text-color-secondary);
1404 + font-weight: 500;
1405 + }
1406 +
1407 + .info-value {
1408 + @extend .text-body;
1409 + color: var(--el-text-color-primary);
1410 + font-weight: 400;
1411 + }
1412 + }
1413 +}
1414 +
1415 +// 步骤容器
1416 +.steps-container {
1417 + background: var(--el-bg-color);
1418 + border-radius: 8px;
1419 + box-shadow: 0 2px 8px rgba(20, 31, 51, 0.08);
1420 + padding: 24px;
1421 +
1422 + .steps-header {
1423 + margin-bottom: 24px;
1424 +
1425 + .steps-title {
1426 + @extend .text-h3;
1427 + margin: 0 0 8px 0;
1428 + color: var(--el-text-color-primary);
1429 + }
1430 +
1431 + .steps-description {
1432 + @extend .text-body;
1433 + color: var(--el-text-color-secondary);
1434 + margin: 0;
1435 + }
1436 + }
1437 +
1438 + .steps-content {
1439 + margin-bottom: 24px;
1440 + }
1441 +
1442 + .steps-actions {
1443 + display: flex;
1444 + justify-content: space-between;
1445 + align-items: center;
1446 + }
1447 +}
1448 +
1449 +// 标签页容器
1450 +.tabs-container {
1451 + background: var(--el-bg-color);
1452 + border-radius: 8px;
1453 + box-shadow: 0 2px 8px rgba(20, 31, 51, 0.08);
1454 + overflow: hidden;
1455 +
1456 + .tabs-header {
1457 + background: var(--el-bg-color-page);
1458 + border-bottom: 1px solid var(--el-border-color);
1459 + padding: 0 20px;
1460 + }
1461 +
1462 + .tabs-content {
1463 + padding: 20px;
1464 + }
1465 +}
1466 +
1467 +// 分割线
1468 +.divider {
1469 + height: 1px;
1470 + background: var(--el-border-color);
1471 + margin: 16px 0;
1472 +
1473 + &.divider-vertical {
1474 + width: 1px;
1475 + height: auto;
1476 + margin: 0 16px;
1477 + }
1478 +
1479 + &.divider-dashed {
1480 + background: none;
1481 + border-top: 1px dashed var(--el-border-color);
1482 + }
1483 +}
1484 +
1485 +// 空状态容器
1486 +.empty-container {
1487 + display: flex;
1488 + flex-direction: column;
1489 + align-items: center;
1490 + justify-content: center;
1491 + padding: 48px 24px;
1492 + text-align: center;
1493 +
1494 + .empty-icon {
1495 + width: 64px;
1496 + height: 64px;
1497 + color: var(--el-text-color-disabled);
1498 + margin-bottom: 16px;
1499 + }
1500 +
1501 + .empty-title {
1502 + @extend .text-h4;
1503 + margin: 0 0 8px 0;
1504 + color: var(--el-text-color-secondary);
1505 + }
1506 +
1507 + .empty-description {
1508 + @extend .text-body;
1509 + color: var(--el-text-color-secondary);
1510 + margin: 0 0 16px 0;
1511 + }
1512 +
1513 + .empty-actions {
1514 + display: flex;
1515 + gap: 8px;
1516 + }
1517 +}
1518 +```
1519 +
1520 +---
1521 +
1522 +## 🪟 8. 基础规范弹窗系统
1523 +
1524 +### 修改目标文件
1525 +`frontend/src/assets/styles/modals.scss` (新建)
1526 +
1527 +### 具体修改内容
1528 +
1529 +```scss
1530 +// 弹窗遮罩
1531 +.modal-overlay {
1532 + position: fixed;
1533 + top: 0;
1534 + left: 0;
1535 + right: 0;
1536 + bottom: 0;
1537 + background: rgba(20, 31, 51, 0.5);
1538 + display: flex;
1539 + align-items: center;
1540 + justify-content: center;
1541 + z-index: 1000;
1542 + animation: fadeIn 0.2s ease;
1543 + backdrop-filter: blur(2px);
1544 +}
1545 +
1546 +// 弹窗内容
1547 +.modal-content {
1548 + background: var(--el-bg-color);
1549 + border-radius: 12px;
1550 + box-shadow: 0 8px 32px rgba(20, 31, 51, 0.2);
1551 + max-width: 500px;
1552 + width: 90%;
1553 + max-height: 80vh;
1554 + overflow-y: auto;
1555 + animation: slideIn 0.3s ease;
1556 + position: relative;
1557 +}
1558 +
1559 +// 弹窗尺寸变体
1560 +.modal-sm {
1561 + max-width: 400px;
1562 +}
1563 +
1564 +.modal-md {
1565 + max-width: 500px;
1566 +}
1567 +
1568 +.modal-lg {
1569 + max-width: 800px;
1570 +}
1571 +
1572 +.modal-xl {
1573 + max-width: 1000px;
1574 +}
1575 +
1576 +.modal-full {
1577 + max-width: 95vw;
1578 + max-height: 95vh;
1579 + width: 95vw;
1580 + height: 95vh;
1581 +}
1582 +
1583 +// 弹窗头部
1584 +.modal-header {
1585 + padding: 20px 24px;
1586 + border-bottom: 1px solid var(--el-border-color);
1587 + display: flex;
1588 + align-items: center;
1589 + justify-content: space-between;
1590 + background: var(--el-bg-color-page);
1591 + border-radius: 12px 12px 0 0;
1592 +
1593 + .modal-title {
1594 + @extend .text-h3;
1595 + margin: 0;
1596 + color: var(--el-text-color-primary);
1597 + }
1598 +
1599 + .modal-subtitle {
1600 + @extend .text-caption;
1601 + margin: 4px 0 0 0;
1602 + color: var(--el-text-color-secondary);
1603 + }
1604 +
1605 + .modal-close {
1606 + background: none;
1607 + border: none;
1608 + cursor: pointer;
1609 + padding: 4px;
1610 + border-radius: 4px;
1611 + color: var(--el-text-color-secondary);
1612 + transition: all 0.2s ease;
1613 + display: flex;
1614 + align-items: center;
1615 + justify-content: center;
1616 +
1617 + &:hover {
1618 + background: var(--el-bg-color);
1619 + color: var(--el-text-color-primary);
1620 + }
1621 +
1622 + &:active {
1623 + transform: scale(0.95);
1624 + }
1625 + }
1626 +}
1627 +
1628 +// 弹窗主体
1629 +.modal-body {
1630 + padding: 24px;
1631 +
1632 + .modal-description {
1633 + @extend .text-body;
1634 + color: var(--el-text-color-secondary);
1635 + margin: 0 0 16px 0;
1636 + }
1637 +}
1638 +
1639 +// 弹窗底部
1640 +.modal-footer {
1641 + padding: 16px 24px;
1642 + border-top: 1px solid var(--el-border-color);
1643 + display: flex;
1644 + justify-content: flex-end;
1645 + gap: 12px;
1646 + background: var(--el-bg-color-page);
1647 + border-radius: 0 0 12px 12px;
1648 +
1649 + &.modal-footer-center {
1650 + justify-content: center;
1651 + }
1652 +
1653 + &.modal-footer-space-between {
1654 + justify-content: space-between;
1655 + }
1656 +}
1657 +
1658 +// 确认对话框
1659 +.confirm-dialog {
1660 + .modal-content {
1661 + max-width: 400px;
1662 + }
1663 +
1664 + .modal-body {
1665 + text-align: center;
1666 + padding: 32px 24px;
1667 +
1668 + .confirm-icon {
1669 + width: 48px;
1670 + height: 48px;
1671 + margin: 0 auto 16px;
1672 + color: var(--el-color-warning);
1673 + }
1674 +
1675 + .confirm-title {
1676 + @extend .text-h4;
1677 + margin: 0 0 8px 0;
1678 + color: var(--el-text-color-primary);
1679 + }
1680 +
1681 + .confirm-message {
1682 + @extend .text-body;
1683 + color: var(--el-text-color-secondary);
1684 + margin: 0;
1685 + }
1686 + }
1687 +}
1688 +
1689 +// 表单对话框
1690 +.form-dialog {
1691 + .modal-content {
1692 + max-width: 600px;
1693 + }
1694 +
1695 + .form-dialog-body {
1696 + max-height: 60vh;
1697 + overflow-y: auto;
1698 + }
1699 +}
1700 +
1701 +// 详情对话框
1702 +.detail-dialog {
1703 + .modal-content {
1704 + max-width: 800px;
1705 + }
1706 +
1707 + .detail-dialog-body {
1708 + max-height: 70vh;
1709 + overflow-y: auto;
1710 + }
1711 +}
1712 +
1713 +// 全屏对话框
1714 +.fullscreen-dialog {
1715 + .modal-overlay {
1716 + align-items: stretch;
1717 + justify-content: stretch;
1718 + padding: 0;
1719 + }
1720 +
1721 + .modal-content {
1722 + max-width: none;
1723 + max-height: none;
1724 + width: 100%;
1725 + height: 100%;
1726 + border-radius: 0;
1727 + display: flex;
1728 + flex-direction: column;
1729 + }
1730 +
1731 + .modal-body {
1732 + flex: 1;
1733 + overflow-y: auto;
1734 + }
1735 +}
1736 +
1737 +// 抽屉
1738 +.drawer {
1739 + position: fixed;
1740 + top: 0;
1741 + right: 0;
1742 + bottom: 0;
1743 + width: 400px;
1744 + background: var(--el-bg-color);
1745 + box-shadow: -4px 0 16px rgba(20, 31, 51, 0.1);
1746 + z-index: 1001;
1747 + display: flex;
1748 + flex-direction: column;
1749 + animation: slideInRight 0.3s ease;
1750 +
1751 + &.drawer-left {
1752 + right: auto;
1753 + left: 0;
1754 + box-shadow: 4px 0 16px rgba(20, 31, 51, 0.1);
1755 + animation: slideInLeft 0.3s ease;
1756 + }
1757 +
1758 + &.drawer-sm {
1759 + width: 300px;
1760 + }
1761 +
1762 + &.drawer-lg {
1763 + width: 600px;
1764 + }
1765 +
1766 + &.drawer-xl {
1767 + width: 800px;
1768 + }
1769 +
1770 + .drawer-header {
1771 + padding: 20px 24px;
1772 + border-bottom: 1px solid var(--el-border-color);
1773 + display: flex;
1774 + align-items: center;
1775 + justify-content: space-between;
1776 + background: var(--el-bg-color-page);
1777 +
1778 + .drawer-title {
1779 + @extend .text-h3;
1780 + margin: 0;
1781 + color: var(--el-text-color-primary);
1782 + }
1783 +
1784 + .drawer-close {
1785 + background: none;
1786 + border: none;
1787 + cursor: pointer;
1788 + padding: 4px;
1789 + border-radius: 4px;
1790 + color: var(--el-text-color-secondary);
1791 + transition: all 0.2s ease;
1792 +
1793 + &:hover {
1794 + background: var(--el-bg-color);
1795 + color: var(--el-text-color-primary);
1796 + }
1797 + }
1798 + }
1799 +
1800 + .drawer-body {
1801 + flex: 1;
1802 + padding: 24px;
1803 + overflow-y: auto;
1804 + }
1805 +
1806 + .drawer-footer {
1807 + padding: 16px 24px;
1808 + border-top: 1px solid var(--el-border-color);
1809 + display: flex;
1810 + justify-content: flex-end;
1811 + gap: 12px;
1812 + background: var(--el-bg-color-page);
1813 + }
1814 +}
1815 +
1816 +// 动画效果
1817 +@keyframes fadeIn {
1818 + from {
1819 + opacity: 0;
1820 + }
1821 + to {
1822 + opacity: 1;
1823 + }
1824 +}
1825 +
1826 +@keyframes slideIn {
1827 + from {
1828 + opacity: 0;
1829 + transform: translateY(-20px) scale(0.95);
1830 + }
1831 + to {
1832 + opacity: 1;
1833 + transform: translateY(0) scale(1);
1834 + }
1835 +}
1836 +
1837 +@keyframes slideInRight {
1838 + from {
1839 + transform: translateX(100%);
1840 + }
1841 + to {
1842 + transform: translateX(0);
1843 + }
1844 +}
1845 +
1846 +@keyframes slideInLeft {
1847 + from {
1848 + transform: translateX(-100%);
1849 + }
1850 + to {
1851 + transform: translateX(0);
1852 + }
1853 +}
1854 +
1855 +// 弹窗层级管理
1856 +.modal-overlay {
1857 + &.z-index-1000 { z-index: 1000; }
1858 + &.z-index-1001 { z-index: 1001; }
1859 + &.z-index-1002 { z-index: 1002; }
1860 + &.z-index-1003 { z-index: 1003; }
1861 + &.z-index-1004 { z-index: 1004; }
1862 +}
1863 +
1864 +// 响应式适配
1865 +@media (max-width: 768px) {
1866 + .modal-content {
1867 + width: 95%;
1868 + max-width: none;
1869 + margin: 20px;
1870 + }
1871 +
1872 + .modal-header,
1873 + .modal-body,
1874 + .modal-footer {
1875 + padding: 16px;
1876 + }
1877 +
1878 + .drawer {
1879 + width: 100%;
1880 + }
1881 +
1882 + .drawer-header,
1883 + .drawer-body,
1884 + .drawer-footer {
1885 + padding: 16px;
1886 + }
1887 +}
1888 +
1889 +// 加载状态
1890 +.modal-loading {
1891 + .modal-content {
1892 + position: relative;
1893 + }
1894 +
1895 + .modal-loading-overlay {
1896 + position: absolute;
1897 + top: 0;
1898 + left: 0;
1899 + right: 0;
1900 + bottom: 0;
1901 + background: rgba(255, 255, 255, 0.8);
1902 + display: flex;
1903 + align-items: center;
1904 + justify-content: center;
1905 + border-radius: 12px;
1906 + z-index: 1;
1907 + }
1908 +}
1909 +```
1910 +
1911 +---
1912 +
1913 +## 📊 实施计划和时间安排
1914 +
1915 +### **第一阶段(第1-2周):基础系统搭建**
1916 +**目标:** 建立核心设计系统基础
1917 +
1918 +**第1周:**
1919 +- [ ] 创建颜色变量系统 (variables.scss)
1920 +- [ ] 建立文字层级规范 (typography.scss)
1921 +- [ ] 更新 Element Plus 主题变量
1922 +
1923 +**第2周:**
1924 +- [ ] 实现栅格系统 (grid-system.scss)
1925 +- [ ] 创建基础工具类
1926 +- [ ] 测试基础系统兼容性
1927 +
1928 +### **第二阶段(第3-4周):组件系统**
1929 +**目标:** 建立核心组件样式规范
1930 +
1931 +**第3周:**
1932 +- [ ] 导航系统重构 (navigation.scss)
1933 +- [ ] 图标系统建立 (icons.scss)
1934 +- [ ] 更新 Header.vue 和 Sidebar.vue
1935 +
1936 +**第4周:**
1937 +- [ ] 控件系统完善 (controls.scss)
1938 +- [ ] 按钮、输入框、选择器样式
1939 +- [ ] 组件交互测试
1940 +
1941 +### **第三阶段(第5-6周):容器和弹窗**
1942 +**目标:** 完善容器和弹窗系统
1943 +
1944 +**第5周:**
1945 +- [ ] 框系统实现 (containers.scss)
1946 +- [ ] 卡片、面板、表格容器
1947 +- [ ] 搜索表单容器
1948 +
1949 +**第6周:**
1950 +- [ ] 弹窗系统建立 (modals.scss)
1951 +- [ ] 弹窗尺寸、层级、动画
1952 +- [ ] Element Plus主题定制
1953 +
1954 +### **第四阶段(第7-8周):页面应用**
1955 +**目标:** 将设计系统应用到业务页面
1956 +
1957 +**第7周:**
1958 +- [ ] 订单管理页面应用
1959 +- [ ] 出库管理页面应用
1960 +- [ ] 发票管理页面应用
1961 +
1962 +**第8周:**
1963 +- [ ] 经销商管理页面应用
1964 +- [ ] 产品管理页面应用
1965 +- [ ] 其他业务页面应用
1966 +
1967 +### **第五阶段(第9-10周):优化和测试**
1968 +**目标:** 完善和优化整体系统
1969 +
1970 +**第9周:**
1971 +- [ ] 响应式适配优化
1972 +- [ ] 交互体验优化
1973 +- [ ] 性能优化
1974 +
1975 +**第10周:**
1976 +- [ ] 全面测试
1977 +- [ ] 文档完善
1978 +- [ ] 部署和验收
1979 +
1980 +## 🎯 关键里程碑
1981 +- 第2周末:基础系统完成
1982 +- 第4周末:组件系统完成
1983 +- 第6周末:容器弹窗系统完成
1984 +- 第8周末:页面应用完成
1985 +- 第10周末:项目交付
1986 +
1987 +## 📁 文件结构
1988 +
1989 +```
1990 +frontend/src/assets/styles/
1991 +├── variables.scss # 颜色和主题变量
1992 +├── typography.scss # 文字层级系统
1993 +├── grid-system.scss # 栅格系统
1994 +├── navigation.scss # 导航系统
1995 +├── icons.scss # 图标系统
1996 +├── controls.scss # 控件系统
1997 +├── containers.scss # 容器系统
1998 +├── modals.scss # 弹窗系统
1999 +├── element-theme.scss # Element Plus 主题定制
2000 +└── index.scss # 样式入口文件
2001 +```
2002 +
2003 +## 🎨 核心设计规范
2004 +
2005 +- **主色调:** `#141F33` (RGB: 20, 31, 51)
2006 +- **字体:** PingFang SC
2007 +- **圆角:** 6px (基础), 8px (容器), 12px (弹窗)
2008 +- **阴影:** 基于主色调的 rgba 阴影系统
2009 +- **间距:** 4px, 8px, 12px, 16px, 20px, 24px, 32px, 48px
2010 +
2011 +## 🔧 质量检查点
2012 +
2013 +- 每个阶段结束进行代码审查
2014 +- 每周进行设计规范符合度检查
2015 +- 关键节点进行用户体验测试
2016 +
2017 +## 📋 验收标准
2018 +
2019 +1. **颜色系统**:所有颜色值与应用场景符合设计规范
2020 +2. **文字系统**:字体、字号、行高、字重完全对齐
2021 +3. **栅格系统**:响应式布局在不同设备上表现一致
2022 +4. **导航系统**:交互样式和层级关系符合规范
2023 +5. **图标系统**:尺寸规范和风格统一
2024 +6. **控件系统**:按钮、输入框等组件样式及交互一致
2025 +7. **框系统**:卡片、面板等容器组件样式规范
2026 +8. **弹窗系统**:弹窗尺寸、层级、动画、交互逻辑符合规范
2027 +
2028 +---
2029 +
2030 +*本计划基于GCCPOP设计规范制定,旨在提供一致、现代、专业的用户体验。*