xto-fronted 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-BO31bICK.js → index-D73_-C9m.js} +2 -2
- package/dist/index-DBjV4kzh.js +249 -0
- package/dist/{index-k2XmHxrU.js → index-DJ1oHe08.js} +988 -933
- package/dist/{index-DkG24eV5.js → index-D_TGEwDg.js} +190 -138
- package/dist/{index-QdDB_2uu.js → index-DauAWAHG.js} +11 -11
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +9 -9
- package/src/App.vue +1 -1
- package/src/assets/styles/_dark.scss +31 -31
- package/src/assets/styles/_reset.scss +4 -4
- package/src/assets/styles/_root.scss +87 -83
- package/src/assets/styles/_variables.scss +5 -5
- package/src/assets/styles/index.scss +11 -11
- package/src/components/Layout/Header.vue +21 -22
- package/src/components/Layout/MixTopMenu.vue +19 -20
- package/src/components/Layout/Sidebar.vue +2 -2
- package/src/components/Layout/SidebarMenuItem.vue +2 -2
- package/src/components/Layout/Tabs.vue +3 -3
- package/src/components/Layout/TopMenu.vue +19 -20
- package/src/stores/app.ts +28 -4
- package/src/views/dashboard/index.vue +109 -88
- package/src/views/error/404.vue +7 -7
- package/src/views/login/index.vue +11 -44
- package/src/views/system/menu/index.vue +14 -14
- package/src/views/system/role/index.vue +2 -2
- package/src/views/system/user/index.vue +3 -3
- package/vite.config.ts +4 -1
- package/dist/index-D4K3OfZa.js +0 -189
|
@@ -3,10 +3,38 @@ import { ref } from 'vue'
|
|
|
3
3
|
import { Progress } from '@xto/data'
|
|
4
4
|
|
|
5
5
|
const stats = ref([
|
|
6
|
-
{
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
{
|
|
7
|
+
title: '用户总数',
|
|
8
|
+
value: 1234,
|
|
9
|
+
icon: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-7 8a7 7 0 0 1 14 0',
|
|
10
|
+
color: 'var(--xto-color-primary, #4F46E5)',
|
|
11
|
+
trend: '+12.5%',
|
|
12
|
+
trendUp: true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
title: '今日访问',
|
|
16
|
+
value: 567,
|
|
17
|
+
icon: 'M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6-10-6-10-6Zm10 2.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z',
|
|
18
|
+
color: 'var(--xto-color-success, #00A870)',
|
|
19
|
+
trend: '+8.2%',
|
|
20
|
+
trendUp: true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
title: '订单数量',
|
|
24
|
+
value: 890,
|
|
25
|
+
icon: 'M21 8l-9-5-9 5v8l9 5 9-5V8Zm-9-2.7L18.6 8 12 11.7 5.4 8 12 5.3Z',
|
|
26
|
+
color: 'var(--xto-color-warning, #FF7D00)',
|
|
27
|
+
trend: '-3.1%',
|
|
28
|
+
trendUp: false
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: '销售金额',
|
|
32
|
+
value: 123456,
|
|
33
|
+
icon: 'M3 7h18v10H3V7Zm9 5a2.5 2.5 0 1 0 0 .01M6.5 12h.01M17.5 12h.01',
|
|
34
|
+
color: 'var(--xto-color-danger, #F53F3F)',
|
|
35
|
+
trend: '+15.8%',
|
|
36
|
+
trendUp: true
|
|
37
|
+
}
|
|
10
38
|
])
|
|
11
39
|
|
|
12
40
|
const activities = ref([
|
|
@@ -18,10 +46,30 @@ const activities = ref([
|
|
|
18
46
|
])
|
|
19
47
|
|
|
20
48
|
const quickLinks = ref([
|
|
21
|
-
{
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
49
|
+
{
|
|
50
|
+
title: '用户管理',
|
|
51
|
+
path: '/system/user',
|
|
52
|
+
icon: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-7 8a7 7 0 0 1 14 0',
|
|
53
|
+
desc: '管理系统用户'
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
title: '角色管理',
|
|
57
|
+
path: '/system/role',
|
|
58
|
+
icon: 'M8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm8 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM2 19a6 6 0 0 1 12 0m2-6a6 6 0 0 1 6 6',
|
|
59
|
+
desc: '角色权限配置'
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
title: '菜单管理',
|
|
63
|
+
path: '/system/menu',
|
|
64
|
+
icon: 'M4 6h16M4 12h16M4 18h10',
|
|
65
|
+
desc: '菜单路由管理'
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
title: '系统设置',
|
|
69
|
+
path: '/system',
|
|
70
|
+
icon: 'M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm7.4-3a7.4 7.4 0 0 0-.1-1.2l2-1.6-2-3.4-2.4 1a7.6 7.6 0 0 0-2-1.2L14.5 3h-5l-.4 2.6a7.6 7.6 0 0 0-2 1.2l-2.4-1-2 3.4 2 1.6a7.4 7.4 0 0 0 0 2.4l-2 1.6 2 3.4 2.4-1a7.6 7.6 0 0 0 2 1.2l.4 2.6h5l.4-2.6a7.6 7.6 0 0 0 2-1.2l2.4 1 2-3.4-2-1.6c.1-.4.1-.8.1-1.2Z',
|
|
71
|
+
desc: '系统参数配置'
|
|
72
|
+
}
|
|
25
73
|
])
|
|
26
74
|
|
|
27
75
|
const systemInfo = ref([
|
|
@@ -37,14 +85,14 @@ const systemInfo = ref([
|
|
|
37
85
|
<!-- 统计卡片 -->
|
|
38
86
|
<div class="stats-section">
|
|
39
87
|
<div v-for="stat in stats" :key="stat.title" class="stat-card">
|
|
40
|
-
<div class="stat-icon"
|
|
41
|
-
<
|
|
88
|
+
<div class="stat-icon">
|
|
89
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" :style="{ color: stat.color }">
|
|
90
|
+
<path :d="stat.icon" />
|
|
91
|
+
</svg>
|
|
42
92
|
</div>
|
|
43
93
|
<div class="stat-content">
|
|
44
94
|
<div class="stat-title">{{ stat.title }}</div>
|
|
45
|
-
<div class="stat-value"
|
|
46
|
-
{{ stat.value.toLocaleString() }}
|
|
47
|
-
</div>
|
|
95
|
+
<div class="stat-value">{{ stat.value.toLocaleString() }}</div>
|
|
48
96
|
<div class="stat-trend" :class="{ up: stat.trendUp, down: !stat.trendUp }">
|
|
49
97
|
<svg v-if="stat.trendUp" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
50
98
|
<path d="M7 17l5-5 5 5M7 7l5 5 5-5"/>
|
|
@@ -55,7 +103,6 @@ const systemInfo = ref([
|
|
|
55
103
|
<span>{{ stat.trend }}</span>
|
|
56
104
|
</div>
|
|
57
105
|
</div>
|
|
58
|
-
<div class="stat-decoration" :style="{ background: `linear-gradient(135deg, ${stat.color}08 0%, transparent 100%)` }"></div>
|
|
59
106
|
</div>
|
|
60
107
|
</div>
|
|
61
108
|
|
|
@@ -74,7 +121,11 @@ const systemInfo = ref([
|
|
|
74
121
|
:to="link.path"
|
|
75
122
|
class="quick-card"
|
|
76
123
|
>
|
|
77
|
-
<div class="quick-icon">
|
|
124
|
+
<div class="quick-icon">
|
|
125
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
|
|
126
|
+
<path :d="link.icon" />
|
|
127
|
+
</svg>
|
|
128
|
+
</div>
|
|
78
129
|
<div class="quick-info">
|
|
79
130
|
<div class="quick-title">{{ link.title }}</div>
|
|
80
131
|
<div class="quick-desc">{{ link.desc }}</div>
|
|
@@ -106,7 +157,6 @@ const systemInfo = ref([
|
|
|
106
157
|
</div>
|
|
107
158
|
<div class="activity-time">{{ activity.time }}</div>
|
|
108
159
|
</div>
|
|
109
|
-
<div class="activity-dot" :class="activity.type"></div>
|
|
110
160
|
</div>
|
|
111
161
|
</div>
|
|
112
162
|
</div>
|
|
@@ -176,24 +226,17 @@ const systemInfo = ref([
|
|
|
176
226
|
}
|
|
177
227
|
|
|
178
228
|
.stat-card {
|
|
179
|
-
position: relative;
|
|
180
229
|
display: flex;
|
|
181
230
|
align-items: flex-start;
|
|
182
231
|
gap: 16px;
|
|
183
232
|
padding: 20px;
|
|
184
233
|
background: var(--xto-bg-color, #FFFFFF);
|
|
185
|
-
border-radius: var(--xto-border-radius-large,
|
|
186
|
-
box-shadow: var(--xto-shadow-subtle, 0 1px 2px
|
|
187
|
-
transition:
|
|
188
|
-
overflow: hidden;
|
|
234
|
+
border-radius: var(--xto-border-radius-large, 12px);
|
|
235
|
+
box-shadow: var(--xto-shadow-subtle, 0 1px 2px rgba(31, 35, 41, 0.06));
|
|
236
|
+
transition: box-shadow 0.2s ease;
|
|
189
237
|
|
|
190
238
|
&:hover {
|
|
191
|
-
box-shadow: var(--xto-shadow-
|
|
192
|
-
transform: translateY(-4px);
|
|
193
|
-
|
|
194
|
-
.stat-decoration {
|
|
195
|
-
opacity: 1;
|
|
196
|
-
}
|
|
239
|
+
box-shadow: var(--xto-shadow-base, 0 1px 3px rgba(31, 35, 41, 0.08), 0 4px 12px rgba(31, 35, 41, 0.06));
|
|
197
240
|
}
|
|
198
241
|
|
|
199
242
|
.stat-icon {
|
|
@@ -202,11 +245,13 @@ const systemInfo = ref([
|
|
|
202
245
|
display: flex;
|
|
203
246
|
align-items: center;
|
|
204
247
|
justify-content: center;
|
|
205
|
-
|
|
248
|
+
background: var(--xto-fill-color, #F2F3F5);
|
|
249
|
+
border-radius: var(--xto-border-radius-large, 12px);
|
|
206
250
|
flex-shrink: 0;
|
|
207
251
|
|
|
208
|
-
|
|
209
|
-
|
|
252
|
+
svg {
|
|
253
|
+
width: 24px;
|
|
254
|
+
height: 24px;
|
|
210
255
|
}
|
|
211
256
|
}
|
|
212
257
|
|
|
@@ -226,6 +271,8 @@ const systemInfo = ref([
|
|
|
226
271
|
font-weight: 600;
|
|
227
272
|
line-height: 1.2;
|
|
228
273
|
margin-bottom: 8px;
|
|
274
|
+
color: var(--xto-color-text-primary, #1F2329);
|
|
275
|
+
font-variant-numeric: tabular-nums;
|
|
229
276
|
}
|
|
230
277
|
|
|
231
278
|
.stat-trend {
|
|
@@ -234,7 +281,7 @@ const systemInfo = ref([
|
|
|
234
281
|
gap: 4px;
|
|
235
282
|
font-size: 12px;
|
|
236
283
|
padding: 2px 8px;
|
|
237
|
-
border-radius:
|
|
284
|
+
border-radius: var(--xto-border-radius-small, 4px);
|
|
238
285
|
|
|
239
286
|
svg {
|
|
240
287
|
width: 14px;
|
|
@@ -242,26 +289,15 @@ const systemInfo = ref([
|
|
|
242
289
|
}
|
|
243
290
|
|
|
244
291
|
&.up {
|
|
245
|
-
color: var(--xto-color-success, #
|
|
246
|
-
background: var(--xto-color-success-lighter, #
|
|
292
|
+
color: var(--xto-color-success, #00A870);
|
|
293
|
+
background: var(--xto-color-success-lighter, #EAFBF3);
|
|
247
294
|
}
|
|
248
295
|
|
|
249
296
|
&.down {
|
|
250
297
|
color: var(--xto-color-danger, #F53F3F);
|
|
251
|
-
background: var(--xto-color-danger-lighter, #
|
|
298
|
+
background: var(--xto-color-danger-lighter, #FEF2F2);
|
|
252
299
|
}
|
|
253
300
|
}
|
|
254
|
-
|
|
255
|
-
.stat-decoration {
|
|
256
|
-
position: absolute;
|
|
257
|
-
top: 0;
|
|
258
|
-
right: 0;
|
|
259
|
-
width: 100px;
|
|
260
|
-
height: 100px;
|
|
261
|
-
border-radius: 50%;
|
|
262
|
-
opacity: 0;
|
|
263
|
-
transition: opacity 0.3s ease;
|
|
264
|
-
}
|
|
265
301
|
}
|
|
266
302
|
|
|
267
303
|
// 主体内容
|
|
@@ -293,12 +329,12 @@ const systemInfo = ref([
|
|
|
293
329
|
color: var(--xto-color-text-placeholder, #A9AEB8);
|
|
294
330
|
background: var(--xto-fill-color, #F2F3F5);
|
|
295
331
|
padding: 4px 10px;
|
|
296
|
-
border-radius:
|
|
332
|
+
border-radius: var(--xto-border-radius-small, 4px);
|
|
297
333
|
}
|
|
298
334
|
|
|
299
335
|
.section-link {
|
|
300
336
|
font-size: 14px;
|
|
301
|
-
color: var(--xto-color-primary, #
|
|
337
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
302
338
|
text-decoration: none;
|
|
303
339
|
transition: color 0.2s;
|
|
304
340
|
|
|
@@ -311,9 +347,9 @@ const systemInfo = ref([
|
|
|
311
347
|
// 快捷入口
|
|
312
348
|
.quick-section {
|
|
313
349
|
background: var(--xto-bg-color, #FFFFFF);
|
|
314
|
-
border-radius: var(--xto-border-radius-large,
|
|
350
|
+
border-radius: var(--xto-border-radius-large, 12px);
|
|
315
351
|
padding: 20px;
|
|
316
|
-
box-shadow: var(--xto-shadow-subtle, 0 1px 2px
|
|
352
|
+
box-shadow: var(--xto-shadow-subtle, 0 1px 2px rgba(31, 35, 41, 0.06));
|
|
317
353
|
}
|
|
318
354
|
|
|
319
355
|
.quick-grid {
|
|
@@ -328,17 +364,15 @@ const systemInfo = ref([
|
|
|
328
364
|
gap: 16px;
|
|
329
365
|
padding: 16px;
|
|
330
366
|
background: var(--xto-fill-color-light, #F7F8FA);
|
|
331
|
-
border-radius: var(--xto-border-radius-base,
|
|
367
|
+
border-radius: var(--xto-border-radius-base, 8px);
|
|
332
368
|
text-decoration: none;
|
|
333
|
-
transition:
|
|
369
|
+
transition: background-color 0.2s ease;
|
|
334
370
|
|
|
335
371
|
&:hover {
|
|
336
|
-
background: var(--xto-color-primary-light-
|
|
337
|
-
transform: translateX(4px);
|
|
372
|
+
background: var(--xto-color-primary-light-9, #EDEDFC);
|
|
338
373
|
|
|
339
374
|
.quick-arrow {
|
|
340
|
-
color: var(--xto-color-primary, #
|
|
341
|
-
transform: translateX(4px);
|
|
375
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
342
376
|
}
|
|
343
377
|
}
|
|
344
378
|
|
|
@@ -349,9 +383,14 @@ const systemInfo = ref([
|
|
|
349
383
|
align-items: center;
|
|
350
384
|
justify-content: center;
|
|
351
385
|
background: var(--xto-bg-color, #FFFFFF);
|
|
352
|
-
border-radius: var(--xto-border-radius-base,
|
|
353
|
-
|
|
386
|
+
border-radius: var(--xto-border-radius-base, 8px);
|
|
387
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
354
388
|
flex-shrink: 0;
|
|
389
|
+
|
|
390
|
+
svg {
|
|
391
|
+
width: 20px;
|
|
392
|
+
height: 20px;
|
|
393
|
+
}
|
|
355
394
|
}
|
|
356
395
|
|
|
357
396
|
.quick-info {
|
|
@@ -378,7 +417,7 @@ const systemInfo = ref([
|
|
|
378
417
|
align-items: center;
|
|
379
418
|
justify-content: center;
|
|
380
419
|
color: var(--xto-color-text-placeholder, #A9AEB8);
|
|
381
|
-
transition:
|
|
420
|
+
transition: color 0.2s ease;
|
|
382
421
|
|
|
383
422
|
svg {
|
|
384
423
|
width: 16px;
|
|
@@ -390,9 +429,9 @@ const systemInfo = ref([
|
|
|
390
429
|
// 最近活动
|
|
391
430
|
.activity-section {
|
|
392
431
|
background: var(--xto-bg-color, #FFFFFF);
|
|
393
|
-
border-radius: var(--xto-border-radius-large,
|
|
432
|
+
border-radius: var(--xto-border-radius-large, 12px);
|
|
394
433
|
padding: 20px;
|
|
395
|
-
box-shadow: var(--xto-shadow-subtle, 0 1px 2px
|
|
434
|
+
box-shadow: var(--xto-shadow-subtle, 0 1px 2px rgba(31, 35, 41, 0.06));
|
|
396
435
|
}
|
|
397
436
|
|
|
398
437
|
.activity-list {
|
|
@@ -405,8 +444,7 @@ const systemInfo = ref([
|
|
|
405
444
|
align-items: flex-start;
|
|
406
445
|
gap: 12px;
|
|
407
446
|
padding: 14px 0;
|
|
408
|
-
border-bottom: 1px solid var(--xto-border-color-lighter, #
|
|
409
|
-
position: relative;
|
|
447
|
+
border-bottom: 1px solid var(--xto-border-color-lighter, #EDEEF1);
|
|
410
448
|
|
|
411
449
|
&:last-child {
|
|
412
450
|
border-bottom: none;
|
|
@@ -424,11 +462,11 @@ const systemInfo = ref([
|
|
|
424
462
|
font-weight: 500;
|
|
425
463
|
flex-shrink: 0;
|
|
426
464
|
|
|
427
|
-
&.success { background: var(--xto-color-success-lighter, #
|
|
428
|
-
&.warning { background: var(--xto-color-warning-lighter, #
|
|
429
|
-
&.info { background: var(--xto-color-info-lighter, #
|
|
430
|
-
&.danger { background: var(--xto-color-danger-lighter, #
|
|
431
|
-
&.primary { background: var(--xto-color-primary-light-
|
|
465
|
+
&.success { background: var(--xto-color-success-lighter, #EAFBF3); color: var(--xto-color-success, #00A870); }
|
|
466
|
+
&.warning { background: var(--xto-color-warning-lighter, #FFF3E8); color: var(--xto-color-warning, #FF7D00); }
|
|
467
|
+
&.info { background: var(--xto-color-info-lighter, #F2F3F5); color: var(--xto-color-info, #86909C); }
|
|
468
|
+
&.danger { background: var(--xto-color-danger-lighter, #FEF2F2); color: var(--xto-color-danger, #F53F3F); }
|
|
469
|
+
&.primary { background: var(--xto-color-primary-light-9, #EDEDFC); color: var(--xto-color-primary, #4F46E5); }
|
|
432
470
|
}
|
|
433
471
|
|
|
434
472
|
.activity-content {
|
|
@@ -457,29 +495,12 @@ const systemInfo = ref([
|
|
|
457
495
|
color: var(--xto-color-text-placeholder, #A9AEB8);
|
|
458
496
|
}
|
|
459
497
|
|
|
460
|
-
.activity-dot {
|
|
461
|
-
position: absolute;
|
|
462
|
-
left: -20px;
|
|
463
|
-
top: 50%;
|
|
464
|
-
transform: translateY(-50%);
|
|
465
|
-
width: 8px;
|
|
466
|
-
height: 8px;
|
|
467
|
-
border-radius: 50%;
|
|
468
|
-
opacity: 0.6;
|
|
469
|
-
|
|
470
|
-
&.success { background: var(--xto-color-success, #2BC48A); }
|
|
471
|
-
&.warning { background: var(--xto-color-warning, #FF7D00); }
|
|
472
|
-
&.info { background: var(--xto-color-info, #86909C); }
|
|
473
|
-
&.danger { background: var(--xto-color-danger, #F53F3F); }
|
|
474
|
-
&.primary { background: var(--xto-color-primary, #12B6AF); }
|
|
475
|
-
}
|
|
476
|
-
|
|
477
498
|
// 系统信息
|
|
478
499
|
.system-section {
|
|
479
500
|
background: var(--xto-bg-color, #FFFFFF);
|
|
480
|
-
border-radius: var(--xto-border-radius-large,
|
|
501
|
+
border-radius: var(--xto-border-radius-large, 12px);
|
|
481
502
|
padding: 20px;
|
|
482
|
-
box-shadow: var(--xto-shadow-subtle, 0 1px 2px
|
|
503
|
+
box-shadow: var(--xto-shadow-subtle, 0 1px 2px rgba(31, 35, 41, 0.06));
|
|
483
504
|
}
|
|
484
505
|
|
|
485
506
|
.system-grid {
|
|
@@ -504,7 +525,7 @@ const systemInfo = ref([
|
|
|
504
525
|
align-items: center;
|
|
505
526
|
padding: 12px 16px;
|
|
506
527
|
background: var(--xto-fill-color-light, #F7F8FA);
|
|
507
|
-
border-radius: var(--xto-border-radius-base,
|
|
528
|
+
border-radius: var(--xto-border-radius-base, 8px);
|
|
508
529
|
|
|
509
530
|
.info-label {
|
|
510
531
|
font-size: 14px;
|
|
@@ -543,4 +564,4 @@ const systemInfo = ref([
|
|
|
543
564
|
color: var(--xto-color-text-primary, #1F2329);
|
|
544
565
|
}
|
|
545
566
|
}
|
|
546
|
-
</style>
|
|
567
|
+
</style>
|
package/src/views/error/404.vue
CHANGED
|
@@ -38,10 +38,10 @@ const goBack = () => {
|
|
|
38
38
|
<line x1="60" y1="55" x2="120" y2="55" stroke="var(--xto-border-color-light, #E5E6EB)" stroke-width="2"/>
|
|
39
39
|
<line x1="60" y1="65" x2="100" y2="65" stroke="var(--xto-border-color-light, #E5E6EB)" stroke-width="2"/>
|
|
40
40
|
<!-- 问号 -->
|
|
41
|
-
<text x="100" y="75" text-anchor="middle" fill="var(--xto-color-primary, #
|
|
41
|
+
<text x="100" y="75" text-anchor="middle" fill="var(--xto-color-primary, #4F46E5)" font-size="24" font-weight="600">?</text>
|
|
42
42
|
<!-- 搜索图标 -->
|
|
43
|
-
<circle cx="150" cy="35" r="12" stroke="var(--xto-color-primary, #
|
|
44
|
-
<line x1="158" y1="43" x2="168" y2="53" stroke="var(--xto-color-primary, #
|
|
43
|
+
<circle cx="150" cy="35" r="12" stroke="var(--xto-color-primary, #4F46E5)" stroke-width="2" fill="none"/>
|
|
44
|
+
<line x1="158" y1="43" x2="168" y2="53" stroke="var(--xto-color-primary, #4F46E5)" stroke-width="2" stroke-linecap="round"/>
|
|
45
45
|
</svg>
|
|
46
46
|
</div>
|
|
47
47
|
|
|
@@ -117,7 +117,7 @@ const goBack = () => {
|
|
|
117
117
|
height: 400px;
|
|
118
118
|
top: -100px;
|
|
119
119
|
right: -100px;
|
|
120
|
-
background: var(--xto-color-primary, #
|
|
120
|
+
background: var(--xto-color-primary, #4F46E5);
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
&.circle-2 {
|
|
@@ -134,7 +134,7 @@ const goBack = () => {
|
|
|
134
134
|
top: 50%;
|
|
135
135
|
left: 50%;
|
|
136
136
|
transform: translate(-50%, -50%);
|
|
137
|
-
background: var(--xto-color-primary-light-3, #
|
|
137
|
+
background: var(--xto-color-primary-light-3, #847DEC);
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
}
|
|
@@ -164,7 +164,7 @@ const goBack = () => {
|
|
|
164
164
|
display: flex;
|
|
165
165
|
align-items: center;
|
|
166
166
|
justify-content: center;
|
|
167
|
-
background: linear-gradient(135deg, var(--xto-color-primary, #
|
|
167
|
+
background: linear-gradient(135deg, var(--xto-color-primary, #4F46E5) 0%, var(--xto-color-primary-light-1, #6158E7) 100%);
|
|
168
168
|
border-radius: 50%;
|
|
169
169
|
|
|
170
170
|
.zero-inner {
|
|
@@ -244,7 +244,7 @@ const goBack = () => {
|
|
|
244
244
|
transform: translateY(-50%);
|
|
245
245
|
width: 6px;
|
|
246
246
|
height: 6px;
|
|
247
|
-
background: var(--xto-color-primary, #
|
|
247
|
+
background: var(--xto-color-primary, #4F46E5);
|
|
248
248
|
border-radius: 50%;
|
|
249
249
|
opacity: 0.6;
|
|
250
250
|
}
|
|
@@ -142,8 +142,6 @@ const handleLogin = async () => {
|
|
|
142
142
|
<!-- 背景装饰 -->
|
|
143
143
|
<div class="brand-bg">
|
|
144
144
|
<div class="bg-grid"></div>
|
|
145
|
-
<div class="bg-glow"></div>
|
|
146
|
-
<div class="bg-pattern"></div>
|
|
147
145
|
</div>
|
|
148
146
|
</div>
|
|
149
147
|
|
|
@@ -255,14 +253,14 @@ const handleLogin = async () => {
|
|
|
255
253
|
background: var(--xto-bg-color-page, #F7F8FA);
|
|
256
254
|
}
|
|
257
255
|
|
|
258
|
-
//
|
|
256
|
+
// 左侧品牌区域(企业级纯色品牌底 + 细网格纹理)
|
|
259
257
|
.login-brand {
|
|
260
258
|
flex: 1;
|
|
261
259
|
position: relative;
|
|
262
260
|
display: flex;
|
|
263
261
|
align-items: center;
|
|
264
262
|
justify-content: center;
|
|
265
|
-
background:
|
|
263
|
+
background: var(--xto-color-primary-dark-1, #4338CA);
|
|
266
264
|
overflow: hidden;
|
|
267
265
|
|
|
268
266
|
@media (max-width: 992px) {
|
|
@@ -323,14 +321,12 @@ const handleLogin = async () => {
|
|
|
323
321
|
align-items: flex-start;
|
|
324
322
|
gap: 16px;
|
|
325
323
|
padding: 16px;
|
|
326
|
-
background: rgba(255, 255, 255, 0.
|
|
327
|
-
border-radius: var(--xto-border-radius-large,
|
|
328
|
-
|
|
329
|
-
transition: all 0.3s ease;
|
|
324
|
+
background: rgba(255, 255, 255, 0.08);
|
|
325
|
+
border-radius: var(--xto-border-radius-large, 12px);
|
|
326
|
+
transition: background-color 0.2s ease;
|
|
330
327
|
|
|
331
328
|
&:hover {
|
|
332
|
-
background: rgba(255, 255, 255, 0.
|
|
333
|
-
transform: translateX(8px);
|
|
329
|
+
background: rgba(255, 255, 255, 0.14);
|
|
334
330
|
}
|
|
335
331
|
}
|
|
336
332
|
|
|
@@ -408,33 +404,9 @@ const handleLogin = async () => {
|
|
|
408
404
|
linear-gradient(90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px);
|
|
409
405
|
background-size: 28px 28px, 56px 56px, 56px 56px;
|
|
410
406
|
}
|
|
411
|
-
|
|
412
|
-
.bg-glow {
|
|
413
|
-
position: absolute;
|
|
414
|
-
top: -20%;
|
|
415
|
-
right: -10%;
|
|
416
|
-
width: 60%;
|
|
417
|
-
height: 60%;
|
|
418
|
-
background: radial-gradient(circle, rgba(147, 197, 253, 0.35) 0%, transparent 70%);
|
|
419
|
-
animation: glow-pulse 8s ease-in-out infinite;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
.bg-pattern {
|
|
423
|
-
position: absolute;
|
|
424
|
-
bottom: -10%;
|
|
425
|
-
left: -10%;
|
|
426
|
-
width: 40%;
|
|
427
|
-
height: 40%;
|
|
428
|
-
background: radial-gradient(circle, rgba(196, 181, 253, 0.28) 0%, transparent 60%);
|
|
429
|
-
}
|
|
430
407
|
}
|
|
431
408
|
}
|
|
432
409
|
|
|
433
|
-
@keyframes glow-pulse {
|
|
434
|
-
0%, 100% { opacity: 0.6; transform: scale(1); }
|
|
435
|
-
50% { opacity: 1; transform: scale(1.1); }
|
|
436
|
-
}
|
|
437
|
-
|
|
438
410
|
// 右侧登录区域
|
|
439
411
|
.login-form-section {
|
|
440
412
|
width: 500px;
|
|
@@ -507,12 +479,12 @@ const handleLogin = async () => {
|
|
|
507
479
|
|
|
508
480
|
.forgot-link {
|
|
509
481
|
font-size: 14px;
|
|
510
|
-
color: var(--xto-color-primary, #
|
|
482
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
511
483
|
text-decoration: none;
|
|
512
484
|
transition: color 0.2s;
|
|
513
485
|
|
|
514
486
|
&:hover {
|
|
515
|
-
color: var(--xto-color-primary-dark-1, #
|
|
487
|
+
color: var(--xto-color-primary-dark-1, #4338CA);
|
|
516
488
|
}
|
|
517
489
|
}
|
|
518
490
|
}
|
|
@@ -527,12 +499,7 @@ const handleLogin = async () => {
|
|
|
527
499
|
transition: all 0.3s ease;
|
|
528
500
|
|
|
529
501
|
&:hover:not(:disabled) {
|
|
530
|
-
|
|
531
|
-
box-shadow: 0 4px 12px rgba(29, 78, 216, 0.35);
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
&:active:not(:disabled) {
|
|
535
|
-
transform: translateY(0);
|
|
502
|
+
background-color: var(--xto-color-primary-light-1, #6158E7);
|
|
536
503
|
}
|
|
537
504
|
}
|
|
538
505
|
|
|
@@ -573,8 +540,8 @@ const handleLogin = async () => {
|
|
|
573
540
|
}
|
|
574
541
|
|
|
575
542
|
&:hover {
|
|
576
|
-
background: var(--xto-color-primary-light-8, #
|
|
577
|
-
color: var(--xto-color-primary, #
|
|
543
|
+
background: var(--xto-color-primary-light-8, #DCDAFC);
|
|
544
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
578
545
|
transform: translateY(-2px);
|
|
579
546
|
}
|
|
580
547
|
}
|
|
@@ -191,14 +191,14 @@ const handleSubmit = async () => {
|
|
|
191
191
|
// 菜单图标
|
|
192
192
|
const getMenuIcon = (icon?: string) => {
|
|
193
193
|
const iconMap: Record<string, string> = {
|
|
194
|
-
dashboard: '
|
|
195
|
-
system: '
|
|
196
|
-
user: '
|
|
197
|
-
role: '
|
|
198
|
-
menu: '
|
|
199
|
-
setting: '
|
|
194
|
+
dashboard: 'M4 5h16v11H4zM9 20h6M12 16v4',
|
|
195
|
+
system: 'M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm7.4-3c0-.4 0-.8-.1-1.2l2-1.6-2-3.4-2.4 1a7.6 7.6 0 0 0-2-1.2L14.5 3h-5l-.4 2.6a7.6 7.6 0 0 0-2 1.2l-2.4-1-2 3.4 2 1.6a7.4 7.4 0 0 0 0 2.4l-2 1.6 2 3.4 2.4-1a7.6 7.6 0 0 0 2 1.2l.4 2.6h5l.4-2.6a7.6 7.6 0 0 0 2-1.2l2.4 1 2-3.4-2-1.6c.1-.4.1-.8.1-1.2Z',
|
|
196
|
+
user: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-7 8a7 7 0 0 1 14 0',
|
|
197
|
+
role: 'M8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm8 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM2 19a6 6 0 0 1 12 0m2-6a6 6 0 0 1 6 6',
|
|
198
|
+
menu: 'M4 6h16M4 12h16M4 18h10',
|
|
199
|
+
setting: 'M4 6h16M4 12h16M4 18h16'
|
|
200
200
|
}
|
|
201
|
-
return iconMap[icon || ''] || '
|
|
201
|
+
return iconMap[icon || ''] || 'M4 6h16M4 12h16M4 18h10'
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
// 获取类型标签类型
|
|
@@ -289,12 +289,12 @@ onMounted(() => {
|
|
|
289
289
|
<tr class="data-row tree-row--level-0">
|
|
290
290
|
<td class="col-name">
|
|
291
291
|
<div class="menu-info">
|
|
292
|
-
<span class="menu-icon-wrapper"
|
|
292
|
+
<span class="menu-icon-wrapper"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path :d="getMenuIcon(menu.icon)" /></svg></span>
|
|
293
293
|
<span class="menu-title" @click="handleEdit(menu)">{{ menu.title }}</span>
|
|
294
294
|
</div>
|
|
295
295
|
</td>
|
|
296
296
|
<td class="col-icon">
|
|
297
|
-
<span class="icon-text"
|
|
297
|
+
<span class="icon-text"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path :d="getMenuIcon(menu.icon)" /></svg></span>
|
|
298
298
|
</td>
|
|
299
299
|
<td class="col-path">
|
|
300
300
|
<code class="path-code">{{ menu.path }}</code>
|
|
@@ -341,12 +341,12 @@ onMounted(() => {
|
|
|
341
341
|
<div class="menu-info">
|
|
342
342
|
<span class="tree-indent"></span>
|
|
343
343
|
<span class="tree-line"></span>
|
|
344
|
-
<span class="menu-icon-wrapper"
|
|
344
|
+
<span class="menu-icon-wrapper"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path :d="getMenuIcon(child.icon)" /></svg></span>
|
|
345
345
|
<span class="menu-title" @click="handleEdit(child)">{{ child.title }}</span>
|
|
346
346
|
</div>
|
|
347
347
|
</td>
|
|
348
348
|
<td class="col-icon">
|
|
349
|
-
<span class="icon-text"
|
|
349
|
+
<span class="icon-text"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path :d="getMenuIcon(child.icon)" /></svg></span>
|
|
350
350
|
</td>
|
|
351
351
|
<td class="col-path">
|
|
352
352
|
<code class="path-code">{{ child.path }}</code>
|
|
@@ -503,7 +503,7 @@ onMounted(() => {
|
|
|
503
503
|
transition: background-color 0.2s;
|
|
504
504
|
|
|
505
505
|
&:hover {
|
|
506
|
-
background: var(--xto-color-primary-light-6, #
|
|
506
|
+
background: var(--xto-color-primary-light-6, #CAC7F9);
|
|
507
507
|
}
|
|
508
508
|
}
|
|
509
509
|
|
|
@@ -534,7 +534,7 @@ onMounted(() => {
|
|
|
534
534
|
width: 32px;
|
|
535
535
|
height: 32px;
|
|
536
536
|
border: 3px solid var(--xto-border-color-lighter, #F2F3F5);
|
|
537
|
-
border-top-color: var(--xto-color-primary, #
|
|
537
|
+
border-top-color: var(--xto-color-primary, #4F46E5);
|
|
538
538
|
border-radius: 50%;
|
|
539
539
|
animation: spin 0.8s linear infinite;
|
|
540
540
|
}
|
|
@@ -596,7 +596,7 @@ onMounted(() => {
|
|
|
596
596
|
transition: color 0.2s;
|
|
597
597
|
|
|
598
598
|
&:hover {
|
|
599
|
-
color: var(--xto-color-primary, #
|
|
599
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
600
600
|
}
|
|
601
601
|
}
|
|
602
602
|
|
|
@@ -432,7 +432,7 @@ onMounted(() => {
|
|
|
432
432
|
transition: background-color 0.2s;
|
|
433
433
|
|
|
434
434
|
&:hover {
|
|
435
|
-
background: var(--xto-color-primary-light-6, #
|
|
435
|
+
background: var(--xto-color-primary-light-6, #CAC7F9);
|
|
436
436
|
}
|
|
437
437
|
}
|
|
438
438
|
|
|
@@ -463,7 +463,7 @@ onMounted(() => {
|
|
|
463
463
|
width: 32px;
|
|
464
464
|
height: 32px;
|
|
465
465
|
border: 3px solid var(--xto-border-color-lighter, #F2F3F5);
|
|
466
|
-
border-top-color: var(--xto-color-primary, #
|
|
466
|
+
border-top-color: var(--xto-color-primary, #4F46E5);
|
|
467
467
|
border-radius: 50%;
|
|
468
468
|
animation: spin 0.8s linear infinite;
|
|
469
469
|
}
|
|
@@ -458,7 +458,7 @@ onMounted(() => {
|
|
|
458
458
|
transition: background-color 0.2s;
|
|
459
459
|
|
|
460
460
|
&:hover {
|
|
461
|
-
background: var(--xto-color-primary-light-6, #
|
|
461
|
+
background: var(--xto-color-primary-light-6, #B9B5F5);
|
|
462
462
|
}
|
|
463
463
|
}
|
|
464
464
|
|
|
@@ -489,7 +489,7 @@ onMounted(() => {
|
|
|
489
489
|
width: 32px;
|
|
490
490
|
height: 32px;
|
|
491
491
|
border: 3px solid var(--xto-border-color-lighter, #F2F3F5);
|
|
492
|
-
border-top-color: var(--xto-color-primary, #
|
|
492
|
+
border-top-color: var(--xto-color-primary, #4F46E5);
|
|
493
493
|
border-radius: 50%;
|
|
494
494
|
animation: spin 0.8s linear infinite;
|
|
495
495
|
}
|
|
@@ -532,7 +532,7 @@ onMounted(() => {
|
|
|
532
532
|
display: flex;
|
|
533
533
|
align-items: center;
|
|
534
534
|
justify-content: center;
|
|
535
|
-
background: linear-gradient(135deg, var(--xto-color-primary, #
|
|
535
|
+
background: linear-gradient(135deg, var(--xto-color-primary, #4F46E5) 0%, var(--xto-color-primary-light-1, #6158E7) 100%);
|
|
536
536
|
border-radius: 50%;
|
|
537
537
|
font-size: 16px;
|
|
538
538
|
font-weight: 500;
|