verce-vue-test 0.0.10 → 0.0.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "verce-vue-test",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "scripts": {
package/src/App.vue CHANGED
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
- import { ref } from 'vue'
3
- import { RouterView } from 'vue-router'
2
+ import { computed, ref } from 'vue'
3
+ import { RouterView, useRoute } from 'vue-router'
4
4
  import {
5
5
  HomeFilled,
6
6
  Odometer,
@@ -12,9 +12,12 @@ import {
12
12
  EditPen,
13
13
  DataLine,
14
14
  InfoFilled,
15
+ TrendCharts,
15
16
  } from '@element-plus/icons-vue'
16
17
 
17
18
  const isCollapse = ref(false)
19
+ const route = useRoute()
20
+ const isFullscreenRoute = computed(() => route.meta.fullscreen === true)
18
21
 
19
22
  function toggleCollapse() {
20
23
  isCollapse.value = !isCollapse.value
@@ -22,7 +25,9 @@ function toggleCollapse() {
22
25
  </script>
23
26
 
24
27
  <template>
25
- <el-container style="height: 100vh">
28
+ <RouterView v-if="isFullscreenRoute" />
29
+
30
+ <el-container v-else style="height: 100vh">
26
31
  <el-aside :width="isCollapse ? '64px' : '200px'" style="background-color: #304156; transition: width 0.3s; overflow: hidden; height: 100vh">
27
32
  <div style="height: 50px; display: flex; align-items: center; padding-left: 20px; color: #fff; font-size: 16px; font-weight: bold; white-space: nowrap; overflow: hidden">
28
33
  <span v-if="!isCollapse">管理系统</span>
@@ -74,6 +79,10 @@ function toggleCollapse() {
74
79
  <el-icon><DataLine /></el-icon>
75
80
  <span>头寸预报</span>
76
81
  </el-menu-item>
82
+ <el-menu-item index="/executive-management">
83
+ <el-icon><TrendCharts /></el-icon>
84
+ <span>总行管理员首页</span>
85
+ </el-menu-item>
77
86
  <el-menu-item index="/about">
78
87
  <el-icon><InfoFilled /></el-icon>
79
88
  <span>关于</span>
@@ -54,6 +54,12 @@ const router = createRouter({
54
54
  name: 'positionForecast',
55
55
  component: () => import('../views/PositionForecastView.vue'),
56
56
  },
57
+ {
58
+ path: '/executive-management',
59
+ name: 'executiveManagement',
60
+ meta: { fullscreen: true },
61
+ component: () => import('../views/ExecutiveManagementView.vue'),
62
+ },
57
63
  ],
58
64
  })
59
65
 
@@ -0,0 +1,916 @@
1
+ <script setup lang="ts">
2
+ import { nextTick, onMounted, onUnmounted, ref } from 'vue'
3
+ import * as echarts from 'echarts'
4
+ import type { ECharts, EChartsOption } from 'echarts'
5
+ import { ArrowDown, RefreshRight, Setting, Minus, UserFilled } from '@element-plus/icons-vue'
6
+
7
+ const balanceChart = ref<HTMLElement>()
8
+ const quotaChart = ref<HTMLElement>()
9
+ const scaleChart = ref<HTMLElement>()
10
+ const gapChart = ref<HTMLElement>()
11
+ const reliableChart = ref<HTMLElement>()
12
+ const pressureChart = ref<HTMLElement>()
13
+ const trendChart = ref<HTMLElement>()
14
+ const pressureTrendChart = ref<HTMLElement>()
15
+
16
+ const charts: ECharts[] = []
17
+
18
+ const rows = [
19
+ ['1', '0101', '0101', '2024-05-21', '622', '462', '108', '42', '10', '572', '92.0'],
20
+ ['2', '0102', '0102', '2024-05-21', '518', '385', '93', '30', '10', '471', '90.9'],
21
+ ['3', '0103', '0103', '2024-05-21', '345', '262', '58', '18', '7', '310', '89.9'],
22
+ ['4', '0104', '0104', '2024-05-21', '287', '210', '45', '22', '10', '243', '84.7'],
23
+ ['5', '0105', '0105', '2024-05-21', '254', '192', '37', '17', '8', '210', '82.7'],
24
+ ['6', '0106', '0105', '2024-05-21', '198', '150', '28', '15', '5', '163', '82.3'],
25
+ ['7', '0107', '0103', '2024-05-21', '156', '118', '22', '12', '4', '125', '80.1'],
26
+ ]
27
+
28
+ function panelChart(el: HTMLElement | undefined, option: EChartsOption) {
29
+ if (!el) return
30
+ const chart = echarts.init(el)
31
+ chart.setOption(option)
32
+ charts.push(chart)
33
+ }
34
+
35
+ function ringOption(centerText: string, data: Array<{ value: number; name: string; itemStyle?: object }>): EChartsOption {
36
+ return {
37
+ color: ['#1267f2', '#e7f0ff'],
38
+ animationDuration: 900,
39
+ title: {
40
+ text: centerText,
41
+ left: 'center',
42
+ top: '42%',
43
+ textStyle: { color: '#05070b', fontSize: 23, fontWeight: 800 },
44
+ },
45
+ series: [
46
+ {
47
+ type: 'pie',
48
+ radius: ['57%', '77%'],
49
+ center: ['50%', '51%'],
50
+ startAngle: 90,
51
+ avoidLabelOverlap: false,
52
+ label: { show: false },
53
+ labelLine: { show: false },
54
+ itemStyle: { borderColor: '#fff', borderWidth: 4 },
55
+ data,
56
+ },
57
+ ],
58
+ }
59
+ }
60
+
61
+ function lineOption(series: echarts.SeriesOption[], yMin = 0, yMax = 200): EChartsOption {
62
+ return {
63
+ grid: { left: 46, right: 22, top: 40, bottom: 34 },
64
+ legend: {
65
+ top: 4,
66
+ right: 8,
67
+ icon: 'path://M0,4 L12,4',
68
+ itemWidth: 16,
69
+ itemHeight: 7,
70
+ textStyle: { color: '#6e7787', fontSize: 11 },
71
+ },
72
+ xAxis: {
73
+ type: 'category',
74
+ boundaryGap: false,
75
+ data: ['05-15', '05-16', '05-17', '05-18', '05-20', '05-21'],
76
+ axisTick: { show: false },
77
+ axisLine: { lineStyle: { color: '#d6dde8' } },
78
+ axisLabel: { color: '#6b7280', fontSize: 12 },
79
+ },
80
+ yAxis: {
81
+ type: 'value',
82
+ min: yMin,
83
+ max: yMax,
84
+ splitNumber: 4,
85
+ axisLabel: { color: '#6b7280', fontSize: 12 },
86
+ splitLine: { lineStyle: { color: '#e7ecf3' } },
87
+ },
88
+ series,
89
+ }
90
+ }
91
+
92
+ function sparkOption(values: number[]): EChartsOption {
93
+ return {
94
+ animationDuration: 700,
95
+ grid: { left: 2, right: 2, top: 8, bottom: 7 },
96
+ xAxis: { type: 'category', show: false, data: values.map((_, index) => index) },
97
+ yAxis: { type: 'value', show: false },
98
+ series: [
99
+ {
100
+ type: 'line',
101
+ data: values,
102
+ symbol: 'none',
103
+ smooth: false,
104
+ lineStyle: { color: '#1267f2', width: 2 },
105
+ },
106
+ ],
107
+ }
108
+ }
109
+
110
+ onMounted(async () => {
111
+ await nextTick()
112
+
113
+ panelChart(balanceChart.value, ringOption('55%', [
114
+ { value: 55, name: '账户余额', itemStyle: { color: '#1267f2' } },
115
+ { value: 45, name: '其他', itemStyle: { color: '#e7f0ff' } },
116
+ ]))
117
+
118
+ panelChart(quotaChart.value, {
119
+ color: ['#1267f2', '#0b55d9', '#57aaf7', '#bfeeff'],
120
+ series: [
121
+ {
122
+ type: 'pie',
123
+ radius: '75%',
124
+ center: ['50%', '51%'],
125
+ label: { show: false },
126
+ labelLine: { show: false },
127
+ itemStyle: { borderColor: '#fff', borderWidth: 2 },
128
+ data: [
129
+ { value: 36.6, name: '国库集中支付' },
130
+ { value: 39.8, name: '财政资金专户' },
131
+ { value: 23.6, name: '预算单位零余额' },
132
+ { value: 18, name: '其他客户' },
133
+ ],
134
+ },
135
+ ],
136
+ })
137
+
138
+ panelChart(scaleChart.value, lineOption([
139
+ {
140
+ name: '日头寸规模',
141
+ type: 'line',
142
+ smooth: false,
143
+ symbolSize: 8,
144
+ data: [120, 138, 91, 98, 88, 148],
145
+ lineStyle: { color: '#1267f2', width: 2 },
146
+ itemStyle: { color: '#1267f2' },
147
+ areaStyle: {
148
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
149
+ { offset: 0, color: 'rgba(18, 103, 242, .28)' },
150
+ { offset: 1, color: 'rgba(18, 103, 242, .02)' },
151
+ ]),
152
+ },
153
+ },
154
+ {
155
+ name: '最优头寸',
156
+ type: 'line',
157
+ symbol: 'none',
158
+ data: [120, 138, 91, 98, 88, 148],
159
+ lineStyle: { color: '#1267f2', width: 1, opacity: 0 },
160
+ },
161
+ ]))
162
+
163
+ panelChart(gapChart.value, lineOption([
164
+ {
165
+ name: '资金缺口',
166
+ type: 'line',
167
+ smooth: true,
168
+ symbolSize: 8,
169
+ data: [-18, 18, 62, 165, 122, 130],
170
+ lineStyle: { color: '#16c5aa', width: 2 },
171
+ itemStyle: { color: '#16c5aa' },
172
+ },
173
+ {
174
+ name: '累计缺口',
175
+ type: 'line',
176
+ smooth: true,
177
+ symbolSize: 8,
178
+ data: [-65, -25, 60, 165, 120, 128],
179
+ lineStyle: { color: '#1267f2', width: 2 },
180
+ itemStyle: { color: '#1267f2' },
181
+ areaStyle: {
182
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
183
+ { offset: 0, color: 'rgba(18, 103, 242, .25)' },
184
+ { offset: 1, color: 'rgba(18, 103, 242, .03)' },
185
+ ]),
186
+ },
187
+ },
188
+ ], -100, 200))
189
+
190
+ panelChart(reliableChart.value, ringOption('低靠', [
191
+ { value: 65, name: '巨靠系数', itemStyle: { color: '#1267f2' } },
192
+ { value: 35, name: '其他', itemStyle: { color: '#e7f0ff' } },
193
+ ]))
194
+
195
+ panelChart(pressureChart.value, ringOption('逾期概率', [
196
+ { value: 34, name: '高压力', itemStyle: { color: '#18c7c0' } },
197
+ { value: 66, name: '低压力', itemStyle: { color: '#1267f2' } },
198
+ ]))
199
+
200
+ panelChart(trendChart.value, sparkOption([15, 34, 18, 8, 27, 55, 36, 48]))
201
+ panelChart(pressureTrendChart.value, sparkOption([12, 24, 18, 49, 62, 30, 52, 72]))
202
+ window.addEventListener('resize', resizeCharts)
203
+ })
204
+
205
+ onUnmounted(() => {
206
+ window.removeEventListener('resize', resizeCharts)
207
+ charts.forEach((chart) => chart.dispose())
208
+ })
209
+
210
+ function resizeCharts() {
211
+ charts.forEach((chart) => chart.resize())
212
+ }
213
+ </script>
214
+
215
+ <template>
216
+ <main class="executive-page">
217
+ <header class="hero">
218
+ <div class="hero-title">
219
+ <h1>总行管理员首页</h1>
220
+ <p>EXECUTIVE MANAGEMENT HOMEPAGE</p>
221
+ </div>
222
+ <div class="hero-user">
223
+ <span class="avatar"><el-icon><UserFilled /></el-icon></span>
224
+ <span>SYSTEM_ADMIN</span>
225
+ <i></i>
226
+ <span>2024-05-21</span>
227
+ <i></i>
228
+ <strong>11:35</strong>
229
+ </div>
230
+ </header>
231
+
232
+ <section class="dashboard-grid">
233
+ <article class="board account-board">
234
+ <div class="board-head">
235
+ <h2><span></span>人行账户情况</h2>
236
+ <div class="actions"><button>本月数据<el-icon><ArrowDown /></el-icon></button><el-icon><RefreshRight /></el-icon><el-icon><Setting /></el-icon><el-icon><Minus /></el-icon></div>
237
+ </div>
238
+ <div class="account-layout">
239
+ <div class="metric-box balance-box">
240
+ <h3>账户余额</h3>
241
+ <div ref="balanceChart" class="ring"></div>
242
+ <div class="balance-copy">
243
+ <p><b class="dot blue"></b>账户余额(亿)</p>
244
+ <strong>2.02.33</strong>
245
+ <p><b class="dot sky"></b>账户数量(个)</p>
246
+ <strong>23</strong>
247
+ <small>较上月 +8%</small>
248
+ </div>
249
+ </div>
250
+ <div class="metric-box quota-box">
251
+ <h3>可用额度</h3>
252
+ <div ref="quotaChart" class="pie"></div>
253
+ <ul class="quota-list">
254
+ <li><b></b>国库集中支付</li>
255
+ <li><b></b>财政资金专户</li>
256
+ <li><b></b>预算单位零余额</li>
257
+ <li><b></b>其他客户</li>
258
+ <li><b></b>保证金专户</li>
259
+ <li><b></b>待清算资金</li>
260
+ </ul>
261
+ <div class="pie-foot"><span><b></b>16.48亿&nbsp;&nbsp;36.6%</span><span><b></b>18.63亿&nbsp;&nbsp;39.8%</span><span><b></b>11.57亿&nbsp;&nbsp;23.6%</span></div>
262
+ </div>
263
+ <div class="progress-box">
264
+ <div>
265
+ <p>账户总数(个)</p>
266
+ <strong>63</strong>
267
+ </div>
268
+ <b>6.29% <em>↑</em></b>
269
+ <div class="progress-line"><i></i><span>63</span></div>
270
+ <div class="scale-row"><span>0</span><span>10</span><span>20</span><span>30</span><span>40</span><span>50</span><span>60</span><span>70</span><span>80</span><span>90</span><span>100</span></div>
271
+ </div>
272
+ </div>
273
+ </article>
274
+
275
+ <article class="board warning-board">
276
+ <div class="board-head">
277
+ <h2><span></span>头寸预警总览</h2>
278
+ <div class="actions"><button>本月数据<el-icon><ArrowDown /></el-icon></button><el-icon><RefreshRight /></el-icon><el-icon><Setting /></el-icon><el-icon><Minus /></el-icon></div>
279
+ </div>
280
+ <div class="warning-layout">
281
+ <div class="chart-box">
282
+ <h3>全行头寸规模</h3>
283
+ <small>(亿元)</small>
284
+ <div ref="scaleChart" class="line-chart"></div>
285
+ </div>
286
+ <div class="chart-box">
287
+ <h3>资金缺口</h3>
288
+ <small>(亿元)</small>
289
+ <div ref="gapChart" class="line-chart"></div>
290
+ </div>
291
+ <div class="stat-strip">
292
+ <div><p>预警客户数(个)</p><strong class="blue-text">83</strong></div>
293
+ <div><b>6.2% <em>↑</em></b></div>
294
+ <div><p>较上月</p><strong>79</strong></div>
295
+ <div><p>正常(个)</p><strong>76</strong></div>
296
+ <div><p>关注(个)</p><strong>-</strong></div>
297
+ <div><p>预警(个)</p><strong>19</strong></div>
298
+ <div><p>严重(个)</p><strong>-</strong><span class="tiny-bar"></span></div>
299
+ </div>
300
+ </div>
301
+ </article>
302
+
303
+ <article class="board reliable-board">
304
+ <div class="board-head">
305
+ <h2><span></span>头寸巨靠情况</h2>
306
+ <div class="actions"><button class="active">本月数据<el-icon><ArrowDown /></el-icon></button><el-icon><RefreshRight /></el-icon><el-icon><Setting /></el-icon><el-icon><Minus /></el-icon></div>
307
+ </div>
308
+ <div class="reliable-layout">
309
+ <div class="metric-box">
310
+ <h3>巨靠结果</h3>
311
+ <div ref="reliableChart" class="ring"></div>
312
+ <ul class="legend-list">
313
+ <li><b class="blue"></b>极高靠(≥2.0)</li>
314
+ <li><b class="deep"></b>高靠(1.5-2.0)</li>
315
+ <li><b class="sky"></b>中靠(1.0-1.5)</li>
316
+ <li><b class="orange"></b>低靠(&lt;1.0)</li>
317
+ </ul>
318
+ </div>
319
+ <div class="metric-box">
320
+ <h3>流动性压力点</h3>
321
+ <div ref="pressureChart" class="ring"></div>
322
+ <ul class="legend-list pressure">
323
+ <li><b class="green"></b>高压力(≥70%)</li>
324
+ <li><b class="pale"></b>中压力(30%-70%)</li>
325
+ <li><b class="blue"></b>低压力(&lt;30%)</li>
326
+ </ul>
327
+ </div>
328
+ <div class="mini-strip">
329
+ <div><p>巨靠客户数(个)</p><strong>3566</strong></div>
330
+ <div><p>较上月</p><strong class="blue-text">0.1 <em>↓</em></strong></div>
331
+ <div><p>巨靠趋势(近7日)</p><div ref="trendChart" class="spark"></div></div>
332
+ <div><p>流动性缺口(万元)</p><strong>1025596</strong></div>
333
+ <div><p>较上月</p><strong class="blue-text">↑ 1.2%</strong></div>
334
+ <div><p>压力趋势(近7日)</p><div ref="pressureTrendChart" class="spark"></div></div>
335
+ </div>
336
+ </div>
337
+ </article>
338
+
339
+ <article class="board table-board">
340
+ <div class="board-head">
341
+ <h2><span></span>全行头寸预警信息累计清结表</h2>
342
+ <div class="actions"><button class="active">本月数据<el-icon><ArrowDown /></el-icon></button><el-icon><RefreshRight /></el-icon><el-icon><Setting /></el-icon><el-icon><Minus /></el-icon></div>
343
+ </div>
344
+ <table class="warning-table">
345
+ <thead>
346
+ <tr>
347
+ <th rowspan="2">序号</th>
348
+ <th rowspan="2">机构编码</th>
349
+ <th rowspan="2">机构名称</th>
350
+ <th rowspan="2">预警日期</th>
351
+ <th colspan="5">全行预警信息累计总数</th>
352
+ <th rowspan="2">清结笔数</th>
353
+ <th rowspan="2">清结率(%)</th>
354
+ </tr>
355
+ <tr>
356
+ <th>总数</th>
357
+ <th>正常</th>
358
+ <th>关注</th>
359
+ <th>预警</th>
360
+ <th>严重预警</th>
361
+ </tr>
362
+ </thead>
363
+ <tbody>
364
+ <tr v-for="row in rows" :key="row[0]">
365
+ <td v-for="cell in row" :key="cell">{{ cell }}</td>
366
+ </tr>
367
+ </tbody>
368
+ </table>
369
+ <div class="pager"><span>共 35 条</span><button>‹</button><button class="selected">1</button><button>2</button><button>3</button><button>4</button><button>5</button><span>...</span><button>→</button><span>前往</span><input value="1" readonly><span>页</span></div>
370
+ </article>
371
+ </section>
372
+ </main>
373
+ </template>
374
+
375
+ <style scoped>
376
+ .executive-page {
377
+ --blue: #1267f2;
378
+ --deep-blue: #0056e6;
379
+ --line: #dce4ef;
380
+ width: 100vw;
381
+ height: 100vh;
382
+ min-height: 100vh;
383
+ overflow: auto;
384
+ color: #05070b;
385
+ background:
386
+ linear-gradient(90deg, #f8f9fb 0 31.4%, transparent 31.4%),
387
+ linear-gradient(142deg, #2688ff 0%, #0063ee 43%, #005ce9 100%);
388
+ font-family: "Microsoft YaHei", "PingFang SC", "Helvetica Neue", sans-serif;
389
+ }
390
+
391
+ .hero {
392
+ min-width: 1792px;
393
+ height: 128px;
394
+ display: flex;
395
+ align-items: flex-start;
396
+ justify-content: space-between;
397
+ padding: 23px 31px 0;
398
+ }
399
+
400
+ .hero-title h1 {
401
+ font-size: 36px;
402
+ line-height: 1.16;
403
+ font-weight: 900;
404
+ }
405
+
406
+ .hero-title p {
407
+ margin-top: 16px;
408
+ color: #91959b;
409
+ font-size: 16px;
410
+ }
411
+
412
+ .hero-user {
413
+ display: flex;
414
+ align-items: center;
415
+ gap: 18px;
416
+ padding-top: 17px;
417
+ color: #fff;
418
+ font-size: 16px;
419
+ font-weight: 600;
420
+ }
421
+
422
+ .hero-user i {
423
+ width: 1px;
424
+ height: 18px;
425
+ background: rgba(255, 255, 255, .65);
426
+ }
427
+
428
+ .avatar {
429
+ width: 36px;
430
+ height: 36px;
431
+ display: grid;
432
+ place-items: center;
433
+ border-radius: 50%;
434
+ background: rgba(255, 255, 255, .25);
435
+ font-size: 22px;
436
+ }
437
+
438
+ .dashboard-grid {
439
+ min-width: 1792px;
440
+ display: grid;
441
+ grid-template-columns: 1fr 1fr;
442
+ gap: 14px 26px;
443
+ padding: 0 31px 39px;
444
+ }
445
+
446
+ .board {
447
+ height: 409px;
448
+ padding: 14px 14px 14px;
449
+ background: rgba(255, 255, 255, .96);
450
+ border-radius: 10px;
451
+ box-shadow: 0 10px 22px rgba(34, 67, 123, .16);
452
+ }
453
+
454
+ .board-head {
455
+ height: 38px;
456
+ display: flex;
457
+ align-items: flex-start;
458
+ justify-content: space-between;
459
+ }
460
+
461
+ .board-head h2 {
462
+ display: flex;
463
+ align-items: center;
464
+ gap: 10px;
465
+ font-size: 20px;
466
+ line-height: 1.1;
467
+ font-weight: 900;
468
+ }
469
+
470
+ .board-head h2 span {
471
+ width: 13px;
472
+ height: 14px;
473
+ border-radius: 4px;
474
+ background: var(--blue);
475
+ box-shadow: inset 0 0 4px rgba(255, 255, 255, .35);
476
+ }
477
+
478
+ .actions {
479
+ display: flex;
480
+ align-items: center;
481
+ gap: 16px;
482
+ color: #6c7480;
483
+ font-size: 15px;
484
+ }
485
+
486
+ .actions button {
487
+ height: 26px;
488
+ display: flex;
489
+ align-items: center;
490
+ gap: 3px;
491
+ border: 0;
492
+ background: transparent;
493
+ color: #6c7480;
494
+ font-size: 13px;
495
+ font-weight: 600;
496
+ }
497
+
498
+ .actions button.active {
499
+ padding: 0 13px;
500
+ border-radius: 14px;
501
+ background: var(--blue);
502
+ color: #fff;
503
+ }
504
+
505
+ .account-layout,
506
+ .warning-layout,
507
+ .reliable-layout {
508
+ display: grid;
509
+ gap: 12px;
510
+ }
511
+
512
+ .account-layout {
513
+ grid-template-columns: 1fr 1fr;
514
+ }
515
+
516
+ .metric-box,
517
+ .chart-box {
518
+ position: relative;
519
+ min-height: 253px;
520
+ border: 1px solid var(--line);
521
+ border-radius: 10px;
522
+ background: #fff;
523
+ }
524
+
525
+ .metric-box h3,
526
+ .chart-box h3 {
527
+ position: absolute;
528
+ left: 18px;
529
+ top: 18px;
530
+ z-index: 1;
531
+ font-size: 18px;
532
+ font-weight: 900;
533
+ }
534
+
535
+ .chart-box small {
536
+ position: absolute;
537
+ left: 18px;
538
+ top: 56px;
539
+ z-index: 1;
540
+ color: #232a33;
541
+ font-size: 12px;
542
+ }
543
+
544
+ .ring,
545
+ .pie {
546
+ position: absolute;
547
+ left: 72px;
548
+ top: 47px;
549
+ width: 174px;
550
+ height: 174px;
551
+ }
552
+
553
+ .pie {
554
+ left: 79px;
555
+ width: 186px;
556
+ height: 186px;
557
+ }
558
+
559
+ .balance-copy {
560
+ position: absolute;
561
+ left: 306px;
562
+ top: 75px;
563
+ width: 132px;
564
+ }
565
+
566
+ .balance-copy p,
567
+ .quota-list li,
568
+ .legend-list li {
569
+ display: flex;
570
+ align-items: center;
571
+ gap: 10px;
572
+ color: #56606d;
573
+ font-size: 13px;
574
+ white-space: nowrap;
575
+ }
576
+
577
+ .balance-copy strong {
578
+ display: block;
579
+ margin: 10px 0 16px 20px;
580
+ font-size: 25px;
581
+ font-weight: 800;
582
+ }
583
+
584
+ .balance-copy small {
585
+ display: block;
586
+ margin-left: 21px;
587
+ color: #7b828c;
588
+ font-size: 14px;
589
+ }
590
+
591
+ .dot,
592
+ .quota-list b,
593
+ .legend-list b,
594
+ .pie-foot b {
595
+ width: 8px;
596
+ height: 8px;
597
+ border-radius: 50%;
598
+ background: var(--blue);
599
+ }
600
+
601
+ .sky {
602
+ background: #58aef7 !important;
603
+ }
604
+
605
+ .deep {
606
+ background: #1667e8 !important;
607
+ }
608
+
609
+ .green {
610
+ background: #18c7c0 !important;
611
+ }
612
+
613
+ .pale {
614
+ background: #aeeeff !important;
615
+ }
616
+
617
+ .orange {
618
+ background: #ff9f13 !important;
619
+ }
620
+
621
+ .quota-list,
622
+ .legend-list {
623
+ position: absolute;
624
+ right: 28px;
625
+ top: 48px;
626
+ display: grid;
627
+ gap: 12px;
628
+ list-style: none;
629
+ }
630
+
631
+ .quota-list b:nth-child(n) {
632
+ background: #399df7;
633
+ }
634
+
635
+ .pie-foot {
636
+ position: absolute;
637
+ left: 32px;
638
+ right: 18px;
639
+ bottom: 19px;
640
+ display: flex;
641
+ justify-content: space-between;
642
+ font-size: 12px;
643
+ }
644
+
645
+ .pie-foot span {
646
+ display: flex;
647
+ align-items: center;
648
+ gap: 8px;
649
+ }
650
+
651
+ .progress-box {
652
+ grid-column: 1 / -1;
653
+ height: 88px;
654
+ position: relative;
655
+ border: 1px solid var(--line);
656
+ border-radius: 10px;
657
+ background: #fff;
658
+ padding: 18px 19px;
659
+ }
660
+
661
+ .progress-box p,
662
+ .stat-strip p,
663
+ .mini-strip p {
664
+ color: #4d5868;
665
+ font-size: 14px;
666
+ }
667
+
668
+ .progress-box strong {
669
+ display: block;
670
+ margin-top: 9px;
671
+ color: var(--blue);
672
+ font-size: 23px;
673
+ font-weight: 800;
674
+ }
675
+
676
+ .progress-box > b {
677
+ position: absolute;
678
+ left: 143px;
679
+ top: 42px;
680
+ font-size: 24px;
681
+ }
682
+
683
+ em {
684
+ color: #10b990;
685
+ font-style: normal;
686
+ }
687
+
688
+ .progress-line {
689
+ position: absolute;
690
+ left: 222px;
691
+ right: 21px;
692
+ top: 28px;
693
+ height: 32px;
694
+ border-top: 4px solid #e4e8ee;
695
+ }
696
+
697
+ .progress-line i {
698
+ display: block;
699
+ width: 57%;
700
+ height: 4px;
701
+ margin-top: -4px;
702
+ background: var(--blue);
703
+ }
704
+
705
+ .progress-line span {
706
+ position: absolute;
707
+ left: 55%;
708
+ top: -14px;
709
+ min-width: 44px;
710
+ height: 22px;
711
+ padding: 3px 14px;
712
+ transform: translateX(-50%);
713
+ border-radius: 12px;
714
+ background: var(--blue);
715
+ color: #fff;
716
+ font-size: 12px;
717
+ text-align: center;
718
+ }
719
+
720
+ .scale-row {
721
+ position: absolute;
722
+ left: 222px;
723
+ right: 16px;
724
+ bottom: 16px;
725
+ display: flex;
726
+ justify-content: space-between;
727
+ color: #6b7280;
728
+ font-size: 12px;
729
+ }
730
+
731
+ .warning-layout {
732
+ grid-template-columns: 1.05fr .9fr;
733
+ }
734
+
735
+ .chart-box {
736
+ height: 271px;
737
+ }
738
+
739
+ .line-chart {
740
+ position: absolute;
741
+ inset: 52px 8px 9px 3px;
742
+ }
743
+
744
+ .stat-strip {
745
+ grid-column: 1 / -1;
746
+ height: 67px;
747
+ display: grid;
748
+ grid-template-columns: .8fr .7fr .8fr .8fr .8fr .8fr .8fr;
749
+ align-items: center;
750
+ border: 1px solid var(--line);
751
+ border-radius: 10px;
752
+ background: #fff;
753
+ }
754
+
755
+ .stat-strip > div {
756
+ height: 34px;
757
+ padding-left: 17px;
758
+ border-right: 1px solid #dce4ef;
759
+ }
760
+
761
+ .stat-strip > div:last-child {
762
+ border-right: 0;
763
+ }
764
+
765
+ .stat-strip strong,
766
+ .stat-strip b {
767
+ display: block;
768
+ margin-top: 8px;
769
+ font-size: 21px;
770
+ font-weight: 900;
771
+ }
772
+
773
+ .blue-text {
774
+ color: var(--blue) !important;
775
+ }
776
+
777
+ .tiny-bar {
778
+ display: block;
779
+ width: 64px;
780
+ height: 8px;
781
+ margin-top: 7px;
782
+ border-radius: 6px;
783
+ background: linear-gradient(90deg, var(--blue) 0 56%, #e7ebf0 56%);
784
+ }
785
+
786
+ .reliable-layout {
787
+ grid-template-columns: 1fr 1fr;
788
+ }
789
+
790
+ .reliable-layout .metric-box {
791
+ height: 224px;
792
+ min-height: 224px;
793
+ }
794
+
795
+ .reliable-board .ring {
796
+ left: 85px;
797
+ top: 43px;
798
+ width: 158px;
799
+ height: 158px;
800
+ }
801
+
802
+ .legend-list {
803
+ top: 74px;
804
+ right: 43px;
805
+ gap: 13px;
806
+ }
807
+
808
+ .pressure {
809
+ right: 60px;
810
+ }
811
+
812
+ .mini-strip {
813
+ grid-column: 1 / -1;
814
+ height: 111px;
815
+ display: grid;
816
+ grid-template-columns: 1.1fr .65fr 1.35fr 1.45fr .7fr 1.35fr;
817
+ border: 1px solid var(--line);
818
+ border-radius: 10px;
819
+ background: #fff;
820
+ }
821
+
822
+ .mini-strip > div {
823
+ padding: 18px 18px;
824
+ border-right: 1px solid #e4e9f0;
825
+ }
826
+
827
+ .mini-strip > div:last-child {
828
+ border-right: 0;
829
+ }
830
+
831
+ .mini-strip strong {
832
+ display: block;
833
+ margin-top: 18px;
834
+ font-size: 25px;
835
+ font-weight: 900;
836
+ }
837
+
838
+ .mini-strip em {
839
+ color: #14a77c;
840
+ }
841
+
842
+ .spark {
843
+ width: 148px;
844
+ height: 58px;
845
+ margin-top: 13px;
846
+ }
847
+
848
+ .table-board {
849
+ padding-bottom: 17px;
850
+ }
851
+
852
+ .warning-table {
853
+ width: 100%;
854
+ border-collapse: separate;
855
+ border-spacing: 0;
856
+ overflow: hidden;
857
+ border: 1px solid var(--line);
858
+ border-radius: 0 0 8px 8px;
859
+ font-size: 12px;
860
+ text-align: center;
861
+ }
862
+
863
+ .warning-table th {
864
+ height: 32px;
865
+ border-right: 1px solid rgba(255, 255, 255, .36);
866
+ border-bottom: 1px solid rgba(255, 255, 255, .36);
867
+ background: var(--blue);
868
+ color: #fff;
869
+ font-weight: 700;
870
+ }
871
+
872
+ .warning-table td {
873
+ height: 31px;
874
+ border-right: 1px solid #e1e7ef;
875
+ border-bottom: 1px solid #e1e7ef;
876
+ background: #fff;
877
+ }
878
+
879
+ .warning-table tr:last-child td {
880
+ border-bottom: 0;
881
+ }
882
+
883
+ .pager {
884
+ height: 54px;
885
+ display: flex;
886
+ align-items: flex-end;
887
+ justify-content: center;
888
+ gap: 16px;
889
+ color: #1e2735;
890
+ font-size: 14px;
891
+ }
892
+
893
+ .pager button {
894
+ min-width: 28px;
895
+ height: 28px;
896
+ border: 0;
897
+ border-radius: 5px;
898
+ background: #fff;
899
+ color: #0d1625;
900
+ font-weight: 700;
901
+ }
902
+
903
+ .pager button.selected {
904
+ background: var(--blue);
905
+ color: #fff;
906
+ }
907
+
908
+ .pager input {
909
+ width: 48px;
910
+ height: 30px;
911
+ border: 1px solid #dbe3ef;
912
+ border-radius: 5px;
913
+ text-align: center;
914
+ }
915
+
916
+ </style>