zant-admin 1.0.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.
Files changed (82) hide show
  1. package/README.en.md +36 -0
  2. package/README.md +248 -0
  3. package/SCAFFOLD_README.md +215 -0
  4. package/bin/cli.js +99 -0
  5. package/bin/generator.js +503 -0
  6. package/bin/prompts.js +159 -0
  7. package/bin/utils.js +134 -0
  8. package/package.json +74 -0
  9. package/public/logo.png +0 -0
  10. package/src/App.vue +16 -0
  11. package/src/api/methods/logError.js +8 -0
  12. package/src/api/methods/logOperation.js +8 -0
  13. package/src/api/methods/login.js +6 -0
  14. package/src/api/methods/quartz.js +36 -0
  15. package/src/api/methods/region.js +16 -0
  16. package/src/api/methods/sysAccount.js +30 -0
  17. package/src/api/methods/sysDict.js +29 -0
  18. package/src/api/methods/sysDictItem.js +26 -0
  19. package/src/api/methods/sysMenu.js +42 -0
  20. package/src/api/methods/sysRole.js +35 -0
  21. package/src/api/methods/sysUser.js +25 -0
  22. package/src/api/methods/system.js +16 -0
  23. package/src/api/request.js +225 -0
  24. package/src/assets/css/style.css +70 -0
  25. package/src/assets/css/zcui.css +340 -0
  26. package/src/assets/imgs/loginbackground.svg +69 -0
  27. package/src/assets/imgs/logo.png +0 -0
  28. package/src/assets/imgs/md/1.png +0 -0
  29. package/src/assets/imgs/md/10.png +0 -0
  30. package/src/assets/imgs/md/11.png +0 -0
  31. package/src/assets/imgs/md/2.png +0 -0
  32. package/src/assets/imgs/md/3.png +0 -0
  33. package/src/assets/imgs/md/4.png +0 -0
  34. package/src/assets/imgs/md/5.png +0 -0
  35. package/src/assets/imgs/md/6.png +0 -0
  36. package/src/assets/imgs/md/7.png +0 -0
  37. package/src/assets/imgs/md/8.png +0 -0
  38. package/src/assets/imgs/md/9.png +0 -0
  39. package/src/components/FormTable.vue +875 -0
  40. package/src/components/IconPicker.vue +344 -0
  41. package/src/components/MainPage.vue +957 -0
  42. package/src/components/details/logErrorDetails.vue +58 -0
  43. package/src/components/details/logOperationDetails.vue +76 -0
  44. package/src/components/edit/QuartzEdit.vue +221 -0
  45. package/src/components/edit/SysAccountEdit.vue +178 -0
  46. package/src/components/edit/SysDictEdit.vue +114 -0
  47. package/src/components/edit/SysDictItemEdit.vue +134 -0
  48. package/src/components/edit/SysRoleEdit.vue +109 -0
  49. package/src/components/edit/sysMenuEdit.vue +305 -0
  50. package/src/config/index.js +74 -0
  51. package/src/directives/permission.js +45 -0
  52. package/src/main.js +38 -0
  53. package/src/router/index.js +270 -0
  54. package/src/stores/config.js +37 -0
  55. package/src/stores/dict.js +33 -0
  56. package/src/stores/menu.js +57 -0
  57. package/src/stores/user.js +21 -0
  58. package/src/utils/baseEcharts.js +661 -0
  59. package/src/utils/dictTemplate.js +26 -0
  60. package/src/utils/regionUtils.js +169 -0
  61. package/src/utils/useFormCRUD.js +60 -0
  62. package/src/views/baiscstatis/center.vue +463 -0
  63. package/src/views/baiscstatis/iframePage.vue +31 -0
  64. package/src/views/baiscstatis/notFound.vue +192 -0
  65. package/src/views/console.vue +771 -0
  66. package/src/views/demo/importexport.vue +123 -0
  67. package/src/views/demo/region.vue +240 -0
  68. package/src/views/demo/statistics.vue +195 -0
  69. package/src/views/home.vue +7 -0
  70. package/src/views/login.vue +272 -0
  71. package/src/views/operations/log/logError.vue +78 -0
  72. package/src/views/operations/log/logLogin.vue +66 -0
  73. package/src/views/operations/log/logOperation.vue +103 -0
  74. package/src/views/operations/log/logQuartz.vue +57 -0
  75. package/src/views/operations/quartz.vue +181 -0
  76. package/src/views/operations/serviceMonitoring.vue +134 -0
  77. package/src/views/system/sysAccount.vue +123 -0
  78. package/src/views/system/sysDict.vue +156 -0
  79. package/src/views/system/sysDictItem.vue +118 -0
  80. package/src/views/system/sysMenu.vue +223 -0
  81. package/src/views/system/sysRole.vue +184 -0
  82. package/templates/env.production +2 -0
@@ -0,0 +1,771 @@
1
+ <template>
2
+ <div class="console-page">
3
+ <!-- 页面标题区域 -->
4
+ <div class="page-header">
5
+ <div class="header-content">
6
+ <div class="header-title">
7
+ <h1>系统控制台</h1>
8
+ <p>欢迎使用系统控制台,这里可以查看系统概览和重要信息</p>
9
+ </div>
10
+ <div class="header-time">
11
+ <div class="time-display">{{ currentTime }}</div>
12
+ <div class="date-display">{{ currentDate }}</div>
13
+ </div>
14
+ </div>
15
+ </div>
16
+
17
+ <!-- 统计卡片区域 -->
18
+ <div class="stats-container">
19
+ <div class="stat-card" v-for="(stat, index) in statsData" :key="index">
20
+ <div class="stat-icon" :style="{ background: stat.gradient }">
21
+ <component :is="stat.icon" />
22
+ </div>
23
+ <div class="stat-content">
24
+ <div class="stat-value">{{ stat.value }}</div>
25
+ <div class="stat-label">{{ stat.label }}</div>
26
+ <div class="stat-trend" :class="stat.trend">
27
+ <component :is="stat.trendIcon" />
28
+ {{ stat.change }}
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </div>
33
+
34
+ <!-- 主要内容区域 -->
35
+ <div class="main-content">
36
+ <!-- 左侧内容 -->
37
+ <div class="left-content">
38
+ <!-- 访问量统计图表 -->
39
+ <div class="chart-container">
40
+ <div class="card-header">
41
+ <h3>访问量统计</h3>
42
+ <div class="chart-controls">
43
+ <a-radio-group v-model:value="chartPeriod" size="small">
44
+ <a-radio-button value="week">本周</a-radio-button>
45
+ <a-radio-button value="month">本月</a-radio-button>
46
+ <a-radio-button value="year">本年</a-radio-button>
47
+ </a-radio-group>
48
+ </div>
49
+ </div>
50
+ <div class="chart-wrapper" ref="visitChartRef"></div>
51
+ </div>
52
+
53
+ <!-- 系统信息 -->
54
+ <div class="system-info-container">
55
+ <div class="card-header">
56
+ <h3>系统信息</h3>
57
+ </div>
58
+ <div class="info-grid">
59
+ <div class="info-item" v-for="(info, index) in systemInfo" :key="index">
60
+ <div class="info-label">{{ info.label }}</div>
61
+ <div class="info-value">{{ info.value }}</div>
62
+ <div class="info-progress" v-if="info.progress">
63
+ <div class="progress-bar" :style="{ width: info.progress + '%' }"></div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+
70
+ <!-- 右侧内容 -->
71
+ <div class="right-content">
72
+ <!-- 前端项目引用 -->
73
+ <div class="dependencies-container">
74
+ <div class="card-header">
75
+ <h3>前端项目引用</h3>
76
+ </div>
77
+ <div class="dependencies-list">
78
+ <div class="dependency-item" v-for="(dep, index) in dependencies" :key="index">
79
+ <div class="dep-name">{{ dep.name }}</div>
80
+ <div class="dep-version">{{ dep.version }}</div>
81
+ </div>
82
+ </div>
83
+ </div>
84
+
85
+ <!-- 最新通知 -->
86
+ <div class="notifications-container">
87
+ <div class="card-header">
88
+ <h3>最新通知</h3>
89
+ <a-badge :count="notifications.length" />
90
+ </div>
91
+ <div class="notifications-list">
92
+ <div class="notification-item" v-for="(item, index) in notifications" :key="index">
93
+ <div class="notification-icon" :style="{ backgroundColor: item.color }">
94
+ {{ item.icon }}
95
+ </div>
96
+ <div class="notification-content">
97
+ <div class="notification-title">{{ item.title }}</div>
98
+ <div class="notification-desc">{{ item.description }}</div>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
+ <!-- 最近活动 -->
105
+ <div class="activities-container">
106
+ <div class="card-header">
107
+ <h3>最近活动</h3>
108
+ </div>
109
+ <div class="activities-list">
110
+ <div class="activity-item" v-for="(activity, index) in recentActivities" :key="index">
111
+ <ClockCircleOutlined class="activity-icon" />
112
+ <div class="activity-content">{{ activity.content }}</div>
113
+ </div>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </template>
120
+
121
+ <script setup>
122
+ import { ref, reactive, onMounted, onUnmounted, computed, watch } from 'vue'
123
+ import * as baseEcharts from '@/utils/baseEcharts'
124
+ import {
125
+ UserOutlined,
126
+ ShoppingCartOutlined,
127
+ DollarOutlined,
128
+ MessageOutlined,
129
+ ClockCircleOutlined,
130
+ ArrowUpOutlined,
131
+ ArrowDownOutlined
132
+ } from '@ant-design/icons-vue'
133
+
134
+ // 创建图表容器引用
135
+ const visitChartRef = ref(null)
136
+ // 图表实例
137
+ let visitChart = null
138
+
139
+ // 图表周期选择
140
+ const chartPeriod = ref('month')
141
+
142
+ // 当前时间
143
+ const currentTime = ref('')
144
+ const currentDate = ref('')
145
+
146
+ // 统计数据
147
+ const stats = reactive({
148
+ userCount: 1256,
149
+ orderCount: 89,
150
+ revenue: '12,580',
151
+ messageCount: 5
152
+ })
153
+
154
+ // 统计卡片数据
155
+ const statsData = computed(() => [
156
+ {
157
+ label: '用户总数',
158
+ value: stats.userCount,
159
+ icon: UserOutlined,
160
+ gradient: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
161
+ trend: 'up',
162
+ trendIcon: ArrowUpOutlined,
163
+ change: '12.5%'
164
+ },
165
+ {
166
+ label: '今日订单',
167
+ value: stats.orderCount,
168
+ icon: ShoppingCartOutlined,
169
+ gradient: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)',
170
+ trend: 'up',
171
+ trendIcon: ArrowUpOutlined,
172
+ change: '8.2%'
173
+ },
174
+ {
175
+ label: '今日收入',
176
+ value: `¥${stats.revenue}`,
177
+ icon: DollarOutlined,
178
+ gradient: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)',
179
+ trend: 'down',
180
+ trendIcon: ArrowDownOutlined,
181
+ change: '3.1%'
182
+ },
183
+ {
184
+ label: '未读消息',
185
+ value: stats.messageCount,
186
+ icon: MessageOutlined,
187
+ gradient: 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)',
188
+ trend: 'up',
189
+ trendIcon: ArrowUpOutlined,
190
+ change: '2条'
191
+ }
192
+ ])
193
+
194
+ // 系统信息
195
+ const systemInfo = ref([
196
+ { label: '系统版本', value: 'v1.0.0' },
197
+ { label: '运行时间', value: '15天2小时' },
198
+ { label: '内存使用率', value: '65%', progress: 65 },
199
+ { label: 'CPU使用率', value: '23%', progress: 23 },
200
+ { label: '磁盘空间', value: '85GB/120GB', progress: 70 }
201
+ ])
202
+
203
+ // 前端项目引用
204
+ const dependencies = ref([
205
+ { name: 'Vue', version: 'v3.5.13' },
206
+ { name: 'Vue Router', version: 'v4.4.5' },
207
+ { name: 'Pinia', version: 'v2.2.6' },
208
+ { name: 'Ant Design Vue', version: 'v4.2.6' },
209
+ { name: 'Ant Design Icons Vue', version: 'v7.0.1' },
210
+ { name: 'ECharts', version: 'v6.0.0' },
211
+ { name: 'Day.js', version: 'v1.11.13' },
212
+ { name: 'Alova', version: 'v3.2.6' },
213
+ { name: 'File-saver', version: 'v2.0.5' },
214
+ { name: 'Vite', version: 'v7.0.6' }
215
+ ])
216
+
217
+ // 通知列表
218
+ const notifications = ref([
219
+ {
220
+ title: '系统维护通知',
221
+ description: '系统将于今晚23:00进行维护,预计耗时2小时',
222
+ color: '#1890ff',
223
+ icon: '维'
224
+ },
225
+ {
226
+ title: '新版本发布',
227
+ description: 'v1.2.0版本已发布,新增多项功能',
228
+ color: '#52c41a',
229
+ icon: '新'
230
+ },
231
+ {
232
+ title: '安全提醒',
233
+ description: '请及时修改默认密码,确保账户安全',
234
+ color: '#faad14',
235
+ icon: '安'
236
+ }
237
+ ])
238
+
239
+ // 最近活动
240
+ const recentActivities = ref([
241
+ { id: 1, content: '用户张三登录系统' },
242
+ { id: 2, content: '订单#20231215001创建成功' },
243
+ { id: 3, content: '报表数据已更新' },
244
+ { id: 4, content: '系统备份完成' }
245
+ ])
246
+
247
+ // 更新时间函数
248
+ const updateDateTime = () => {
249
+ const now = new Date()
250
+
251
+ // 更新时间
252
+ currentTime.value = now.toLocaleTimeString('zh-CN', {
253
+ hour: '2-digit',
254
+ minute: '2-digit',
255
+ second: '2-digit'
256
+ })
257
+
258
+ // 更新日期
259
+ currentDate.value = now.toLocaleDateString('zh-CN', {
260
+ year: 'numeric',
261
+ month: 'long',
262
+ day: 'numeric',
263
+ weekday: 'long'
264
+ })
265
+ }
266
+
267
+ // 初始化图表
268
+ const initChart = () => {
269
+ // 使用 baseEcharts 工具初始化折线图
270
+ visitChart = baseEcharts.initLineChart(visitChartRef.value, '访问量')
271
+
272
+ // 根据选择的周期获取不同的数据
273
+ const getChartData = () => {
274
+ switch (chartPeriod.value) {
275
+ case 'week':
276
+ return {
277
+ xAxis: {
278
+ data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
279
+ },
280
+ series: [
281
+ {
282
+ name: '访问量',
283
+ data: [320, 450, 380, 420, 580, 620, 590]
284
+ },
285
+ {
286
+ name: '独立访客',
287
+ data: [220, 320, 280, 350, 480, 520, 490]
288
+ }
289
+ ]
290
+ }
291
+ case 'month':
292
+ return {
293
+ xAxis: {
294
+ data: Array.from({length: 30}, (_, i) => `${i + 1}日`)
295
+ },
296
+ series: [
297
+ {
298
+ name: '访问量',
299
+ data: Array.from({length: 30}, () => Math.floor(Math.random() * 1000) + 500)
300
+ },
301
+ {
302
+ name: '独立访客',
303
+ data: Array.from({length: 30}, () => Math.floor(Math.random() * 800) + 300)
304
+ }
305
+ ]
306
+ }
307
+ case 'year':
308
+ return {
309
+ xAxis: {
310
+ data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
311
+ },
312
+ series: [
313
+ {
314
+ name: '访问量',
315
+ data: [820, 932, 901, 934, 1290, 1330, 1320, 1540, 1200, 1100, 1380, 1420]
316
+ },
317
+ {
318
+ name: '独立访客',
319
+ data: [620, 732, 701, 734, 1090, 1130, 1120, 1340, 1000, 900, 1180, 1220]
320
+ }
321
+ ]
322
+ }
323
+ default:
324
+ return {
325
+ xAxis: { data: [] },
326
+ series: []
327
+ }
328
+ }
329
+ }
330
+
331
+ // 获取数据并更新图表
332
+ const chartData = getChartData()
333
+ baseEcharts.updateLineChart({
334
+ chartInstance: visitChart,
335
+ data: chartData,
336
+ shouldShowSlider: chartData.xAxis.data.length > 12
337
+ })
338
+ }
339
+
340
+ // 监听图表周期变化
341
+ const handlePeriodChange = () => {
342
+ initChart()
343
+ }
344
+
345
+ onMounted(() => {
346
+ updateDateTime()
347
+ // 每秒更新一次时间
348
+ const timer = setInterval(updateDateTime, 1000)
349
+ initChart()
350
+
351
+ // 模拟数据更新
352
+ setTimeout(() => {
353
+ stats.orderCount = 92
354
+ stats.revenue = '13,200'
355
+ }, 3000)
356
+
357
+ // 每30秒更新一次图表数据
358
+ const chartTimer = setInterval(() => {
359
+ initChart()
360
+ }, 30000)
361
+
362
+ // 监听图表周期变化
363
+ const stopWatch = watch(chartPeriod, handlePeriodChange)
364
+
365
+ onUnmounted(() => {
366
+ clearInterval(timer)
367
+ clearInterval(chartTimer)
368
+ if (stopWatch) stopWatch()
369
+ // 销毁图表实例,释放资源
370
+ if (visitChart) {
371
+ visitChart.dispose()
372
+ visitChart = null
373
+ }
374
+ })
375
+ })
376
+ </script>
377
+
378
+ <style scoped>
379
+ .console-page {
380
+
381
+ background: #f5f7fa;
382
+ min-height: 100vh;
383
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
384
+ }
385
+
386
+ /* 页面标题区域 */
387
+ .page-header {
388
+ margin-bottom: 24px;
389
+ background: #fff;
390
+ border-radius: 12px;
391
+ padding: 24px;
392
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
393
+ }
394
+
395
+ .header-content {
396
+ display: flex;
397
+ justify-content: space-between;
398
+ align-items: center;
399
+ }
400
+
401
+ .header-title h1 {
402
+ margin: 0;
403
+ font-size: 28px;
404
+ font-weight: 600;
405
+ color: #1f2937;
406
+ }
407
+
408
+ .header-title p {
409
+ margin: 8px 0 0 0;
410
+ color: #6b7280;
411
+ font-size: 14px;
412
+ }
413
+
414
+ .header-time {
415
+ text-align: right;
416
+ }
417
+
418
+ .time-display {
419
+ font-size: 24px;
420
+ font-weight: 600;
421
+ color: #1f2937;
422
+ }
423
+
424
+ .date-display {
425
+ font-size: 14px;
426
+ color: #6b7280;
427
+ margin-top: 4px;
428
+ }
429
+
430
+ /* 统计卡片区域 */
431
+ .stats-container {
432
+ display: grid;
433
+ grid-template-columns: repeat(4, 1fr);
434
+ gap: 20px;
435
+ margin-bottom: 24px;
436
+ }
437
+
438
+ .stat-card {
439
+ background: #fff;
440
+ border-radius: 12px;
441
+ padding: 24px;
442
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
443
+ display: flex;
444
+ align-items: center;
445
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
446
+ }
447
+
448
+ .stat-card:hover {
449
+ transform: translateY(-5px);
450
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
451
+ }
452
+
453
+ .stat-icon {
454
+ width: 60px;
455
+ height: 60px;
456
+ border-radius: 12px;
457
+ display: flex;
458
+ align-items: center;
459
+ justify-content: center;
460
+ font-size: 24px;
461
+ color: white;
462
+ margin-right: 16px;
463
+ }
464
+
465
+ .stat-content {
466
+ flex: 1;
467
+ }
468
+
469
+ .stat-value {
470
+ font-size: 28px;
471
+ font-weight: 600;
472
+ color: #1f2937;
473
+ line-height: 1;
474
+ }
475
+
476
+ .stat-label {
477
+ margin-top: 4px;
478
+ color: #6b7280;
479
+ font-size: 14px;
480
+ }
481
+
482
+ .stat-trend {
483
+ display: flex;
484
+ align-items: center;
485
+ margin-top: 8px;
486
+ font-size: 12px;
487
+ font-weight: 500;
488
+ }
489
+
490
+ .stat-trend.up {
491
+ color: #10b981;
492
+ }
493
+
494
+ .stat-trend.down {
495
+ color: #ef4444;
496
+ }
497
+
498
+ .stat-trend svg {
499
+ margin-right: 4px;
500
+ }
501
+
502
+ /* 主要内容区域 */
503
+ .main-content {
504
+ display: grid;
505
+ grid-template-columns: 2fr 1fr;
506
+ gap: 24px;
507
+ }
508
+
509
+ /* 卡片标题样式 */
510
+ .card-header {
511
+ display: flex;
512
+ justify-content: space-between;
513
+ align-items: center;
514
+ margin-bottom: 16px;
515
+ }
516
+
517
+ .card-header h3 {
518
+ margin: 0;
519
+ font-size: 18px;
520
+ font-weight: 600;
521
+ color: #1f2937;
522
+ }
523
+
524
+ /* 左侧内容 */
525
+ .left-content {
526
+ display: flex;
527
+ flex-direction: column;
528
+ gap: 24px;
529
+ }
530
+
531
+ /* 图表容器 */
532
+ .chart-container {
533
+ background: #fff;
534
+ border-radius: 12px;
535
+ padding: 24px;
536
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
537
+ }
538
+
539
+ .chart-wrapper {
540
+ height: 300px;
541
+ width: 100%;
542
+ }
543
+
544
+ /* 系统信息容器 */
545
+ .system-info-container {
546
+ background: #fff;
547
+ border-radius: 12px;
548
+ padding: 24px;
549
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
550
+ }
551
+
552
+ .info-grid {
553
+ display: grid;
554
+ grid-template-columns: repeat(2, 1fr);
555
+ gap: 16px;
556
+ }
557
+
558
+ .info-item {
559
+ padding: 12px;
560
+ border-radius: 8px;
561
+ background: #f9fafb;
562
+ }
563
+
564
+ .info-label {
565
+ font-size: 12px;
566
+ color: #6b7280;
567
+ margin-bottom: 4px;
568
+ }
569
+
570
+ .info-value {
571
+ font-size: 16px;
572
+ font-weight: 600;
573
+ color: #1f2937;
574
+ margin-bottom: 8px;
575
+ }
576
+
577
+ .info-progress {
578
+ height: 4px;
579
+ background: #e5e7eb;
580
+ border-radius: 2px;
581
+ overflow: hidden;
582
+ }
583
+
584
+ .progress-bar {
585
+ height: 100%;
586
+ background: linear-gradient(90deg, #3b82f6, #1d4ed8);
587
+ border-radius: 2px;
588
+ transition: width 1s ease;
589
+ }
590
+
591
+ /* 右侧内容 */
592
+ .right-content {
593
+ display: flex;
594
+ flex-direction: column;
595
+ gap: 24px;
596
+ }
597
+
598
+ /* 依赖信息容器 */
599
+ .dependencies-container {
600
+ background: #fff;
601
+ border-radius: 12px;
602
+ padding: 24px;
603
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
604
+ }
605
+
606
+ .dependencies-list {
607
+ display: grid;
608
+ grid-template-columns: repeat(2, 1fr);
609
+ gap: 12px;
610
+ max-height: 300px;
611
+ overflow-y: auto;
612
+ }
613
+
614
+ .dependency-item {
615
+ display: flex;
616
+ justify-content: space-between;
617
+ align-items: center;
618
+ padding: 8px 12px;
619
+ border-radius: 6px;
620
+ background: #f9fafb;
621
+ transition: background 0.2s ease;
622
+ }
623
+
624
+ .dependency-item:hover {
625
+ background: #f3f4f6;
626
+ }
627
+
628
+ .dep-name {
629
+ font-size: 14px;
630
+ color: #4b5563;
631
+ }
632
+
633
+ .dep-version {
634
+ font-size: 12px;
635
+ color: #6b7280;
636
+ background: #e5e7eb;
637
+ padding: 2px 6px;
638
+ border-radius: 4px;
639
+ }
640
+
641
+ /* 通知容器 */
642
+ .notifications-container {
643
+ background: #fff;
644
+ border-radius: 12px;
645
+ padding: 24px;
646
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
647
+ }
648
+
649
+ .notifications-list {
650
+ display: flex;
651
+ flex-direction: column;
652
+ gap: 12px;
653
+ }
654
+
655
+ .notification-item {
656
+ display: flex;
657
+ align-items: flex-start;
658
+ padding: 12px;
659
+ border-radius: 8px;
660
+ background: #f9fafb;
661
+ transition: background 0.2s ease;
662
+ }
663
+
664
+ .notification-item:hover {
665
+ background: #f3f4f6;
666
+ }
667
+
668
+ .notification-icon {
669
+ width: 32px;
670
+ height: 32px;
671
+ border-radius: 50%;
672
+ display: flex;
673
+ align-items: center;
674
+ justify-content: center;
675
+ color: white;
676
+ font-size: 14px;
677
+ margin-right: 12px;
678
+ flex-shrink: 0;
679
+ }
680
+
681
+ .notification-content {
682
+ flex: 1;
683
+ }
684
+
685
+ .notification-title {
686
+ font-size: 14px;
687
+ font-weight: 500;
688
+ color: #1f2937;
689
+ margin-bottom: 4px;
690
+ }
691
+
692
+ .notification-desc {
693
+ font-size: 12px;
694
+ color: #6b7280;
695
+ }
696
+
697
+ /* 活动容器 */
698
+ .activities-container {
699
+ background: #fff;
700
+ border-radius: 12px;
701
+ padding: 24px;
702
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
703
+ }
704
+
705
+ .activities-list {
706
+ display: flex;
707
+ flex-direction: column;
708
+ gap: 12px;
709
+ }
710
+
711
+ .activity-item {
712
+ display: flex;
713
+ align-items: center;
714
+ padding: 8px 0;
715
+ border-bottom: 1px solid #f3f4f6;
716
+ }
717
+
718
+ .activity-item:last-child {
719
+ border-bottom: none;
720
+ }
721
+
722
+ .activity-icon {
723
+ color: #6b7280;
724
+ margin-right: 12px;
725
+ font-size: 14px;
726
+ }
727
+
728
+ .activity-content {
729
+ font-size: 14px;
730
+ color: #4b5563;
731
+ }
732
+
733
+ /* 响应式设计 */
734
+ @media (max-width: 1200px) {
735
+ .main-content {
736
+ grid-template-columns: 1fr;
737
+ }
738
+
739
+ .stats-container {
740
+ grid-template-columns: repeat(2, 1fr);
741
+ }
742
+ }
743
+
744
+ @media (max-width: 768px) {
745
+ .console-page {
746
+ padding: 16px;
747
+ }
748
+
749
+ .header-content {
750
+ flex-direction: column;
751
+ align-items: flex-start;
752
+ }
753
+
754
+ .header-time {
755
+ text-align: left;
756
+ margin-top: 12px;
757
+ }
758
+
759
+ .stats-container {
760
+ grid-template-columns: 1fr;
761
+ }
762
+
763
+ .info-grid {
764
+ grid-template-columns: 1fr;
765
+ }
766
+
767
+ .dependencies-list {
768
+ grid-template-columns: 1fr;
769
+ }
770
+ }
771
+ </style>