verce-vue-test 0.0.12 → 0.0.14
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 +1 -1
- package/src/router/index.ts +1 -1
- package/src/views/{ExecutiveManagementView.vue → ExecutiveManagementView/index.vue} +5 -5
- package/src/views/PositionForecastExecutionView.vue +282 -158
- /package/src/{components/executive → views/ExecutiveManagementView/components}/ExecutiveAccountPanel.vue +0 -0
- /package/src/{components/executive → views/ExecutiveManagementView/components}/ExecutiveReliablePanel.vue +0 -0
- /package/src/{components/executive → views/ExecutiveManagementView/components}/ExecutiveWarningOverview.vue +0 -0
- /package/src/{components/executive → views/ExecutiveManagementView/components}/ExecutiveWarningTablePanel.vue +0 -0
- /package/src/{components/executive → views/ExecutiveManagementView/components}/chart.ts +0 -0
- /package/src/{assets → views/ExecutiveManagementView}/executive-management.css +0 -0
package/package.json
CHANGED
package/src/router/index.ts
CHANGED
|
@@ -64,7 +64,7 @@ const router = createRouter({
|
|
|
64
64
|
path: '/executive-management',
|
|
65
65
|
name: 'executiveManagement',
|
|
66
66
|
meta: { fullscreen: true },
|
|
67
|
-
component: () => import('../views/ExecutiveManagementView.vue'),
|
|
67
|
+
component: () => import('../views/ExecutiveManagementView/index.vue'),
|
|
68
68
|
},
|
|
69
69
|
],
|
|
70
70
|
})
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import ExecutiveAccountPanel from '
|
|
3
|
-
import ExecutiveReliablePanel from '
|
|
4
|
-
import ExecutiveWarningOverview from '
|
|
5
|
-
import ExecutiveWarningTablePanel from '
|
|
6
|
-
import '
|
|
2
|
+
import ExecutiveAccountPanel from './components/ExecutiveAccountPanel.vue'
|
|
3
|
+
import ExecutiveReliablePanel from './components/ExecutiveReliablePanel.vue'
|
|
4
|
+
import ExecutiveWarningOverview from './components/ExecutiveWarningOverview.vue'
|
|
5
|
+
import ExecutiveWarningTablePanel from './components/ExecutiveWarningTablePanel.vue'
|
|
6
|
+
import './executive-management.css'
|
|
7
7
|
</script>
|
|
8
8
|
|
|
9
9
|
<template>
|
|
@@ -1,13 +1,46 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* 头寸预报 - 执行页面
|
|
4
|
+
*
|
|
5
|
+
* 页面职责:
|
|
6
|
+
* 展示当前登录用户的待处理任务概览(统计面板),
|
|
7
|
+
* 并提供快速进入各业务操作(预报填报、修改、复核确认、异常反馈)的入口。
|
|
8
|
+
*
|
|
9
|
+
* 页面结构:
|
|
10
|
+
* - 统计面板:五等分统计项,匹配设计图的分隔线和数字排版
|
|
11
|
+
* - 快速入口:四张业务卡片,匹配设计图的图标、标题、描述和按钮
|
|
12
|
+
*
|
|
13
|
+
* 数据来源:
|
|
14
|
+
* 目前 taskStats 和 quickEntries 为本地静态数据,
|
|
15
|
+
* 后续替换为接口请求时只需改动数据源,模板无需修改。
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
// ---- 图标导入 ----
|
|
19
|
+
// 从 Element Plus 图标库引入四个业务语义图标,分别对应四种任务类型
|
|
2
20
|
import {
|
|
3
|
-
CircleCheckFilled,
|
|
4
|
-
Document,
|
|
5
|
-
RefreshRight,
|
|
6
|
-
|
|
21
|
+
CircleCheckFilled, // 复核确认:圆圈对勾
|
|
22
|
+
Document, // 预报填报:文档
|
|
23
|
+
RefreshRight, // 修改:向右刷新箭头
|
|
24
|
+
WarnTriangleFilled, // 异常反馈:实心警告三角
|
|
7
25
|
} from '@element-plus/icons-vue'
|
|
8
26
|
|
|
27
|
+
// ---- 类型定义 ----
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 色调枚举,决定元素的强调色。
|
|
31
|
+
* 与 CSS 中 .is-blue / .is-green / .is-orange / .is-red 类一一对应,
|
|
32
|
+
* 最终映射到 --tone CSS 变量,驱动图标、数字、按钮的颜色。
|
|
33
|
+
*/
|
|
9
34
|
type Tone = 'blue' | 'green' | 'orange' | 'red'
|
|
10
35
|
|
|
36
|
+
/**
|
|
37
|
+
* 统计面板单条数据结构
|
|
38
|
+
* @property label - 统计项名称(如"全部待处理")
|
|
39
|
+
* @property value - 数值(如 12)
|
|
40
|
+
* @property unit - 数值单位(如"条")
|
|
41
|
+
* @property tone - 强调色,决定数字和图标的颜色
|
|
42
|
+
* @property icon - 图标组件,可选;第一个"全部待处理"项无图标
|
|
43
|
+
*/
|
|
11
44
|
interface TaskStat {
|
|
12
45
|
label: string
|
|
13
46
|
value: number
|
|
@@ -16,6 +49,14 @@ interface TaskStat {
|
|
|
16
49
|
icon?: unknown
|
|
17
50
|
}
|
|
18
51
|
|
|
52
|
+
/**
|
|
53
|
+
* 快速入口卡片数据结构
|
|
54
|
+
* @property title - 卡片标题(如"预报填报")
|
|
55
|
+
* @property desc - 业务描述(如"填写头寸预报数据")
|
|
56
|
+
* @property button - 按钮文案(如"立即填报")
|
|
57
|
+
* @property tone - 强调色,决定图标背景和按钮颜色
|
|
58
|
+
* @property icon - 图标组件
|
|
59
|
+
*/
|
|
19
60
|
interface EntryAction {
|
|
20
61
|
title: string
|
|
21
62
|
desc: string
|
|
@@ -24,30 +65,73 @@ interface EntryAction {
|
|
|
24
65
|
icon: unknown
|
|
25
66
|
}
|
|
26
67
|
|
|
68
|
+
// ---- 数据 ----
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 待处理任务统计数据
|
|
72
|
+
* 第一项"全部待处理"是汇总值,无独立图标(模板中通过 v-if 控制);
|
|
73
|
+
* 其余四项分别对应四个业务模块,图标和色调一一配对。
|
|
74
|
+
*/
|
|
27
75
|
const taskStats: TaskStat[] = [
|
|
28
76
|
{ label: '全部待处理', value: 12, unit: '条', tone: 'blue' },
|
|
29
|
-
{ label: '预报填报',
|
|
30
|
-
{ label: '修改',
|
|
31
|
-
{ label: '复核确认',
|
|
32
|
-
{ label: '异常反馈',
|
|
77
|
+
{ label: '预报填报', value: 5, unit: '条', tone: 'blue', icon: Document },
|
|
78
|
+
{ label: '修改', value: 3, unit: '条', tone: 'green', icon: RefreshRight },
|
|
79
|
+
{ label: '复核确认', value: 2, unit: '条', tone: 'orange', icon: CircleCheckFilled },
|
|
80
|
+
{ label: '异常反馈', value: 2, unit: '条', tone: 'red', icon: WarnTriangleFilled },
|
|
33
81
|
]
|
|
34
82
|
|
|
83
|
+
/**
|
|
84
|
+
* 快速入口卡片数据
|
|
85
|
+
* 四个卡片与统计面板的四项业务一一对应,色调保持一致,
|
|
86
|
+
* 确保用户在视觉上能将统计数字与入口卡片关联起来。
|
|
87
|
+
*/
|
|
35
88
|
const quickEntries: EntryAction[] = [
|
|
36
|
-
{ title: '预报填报', desc: '填写头寸预报数据',
|
|
37
|
-
{ title: '修改',
|
|
38
|
-
{ title: '复核确认', desc: '复核并确认预报数据',
|
|
39
|
-
{ title: '异常反馈', desc: '处理预报异常反馈',
|
|
89
|
+
{ title: '预报填报', desc: '填写头寸预报数据', button: '立即填报', tone: 'blue', icon: Document },
|
|
90
|
+
{ title: '修改', desc: '修改已填报预报数据', button: '立即处理', tone: 'green', icon: RefreshRight },
|
|
91
|
+
{ title: '复核确认', desc: '复核并确认预报数据', button: '立即处理', tone: 'orange', icon: CircleCheckFilled },
|
|
92
|
+
{ title: '异常反馈', desc: '处理预报异常反馈', button: '立即处理', tone: 'red', icon: WarnTriangleFilled },
|
|
40
93
|
]
|
|
41
94
|
</script>
|
|
42
95
|
|
|
96
|
+
<!--
|
|
97
|
+
模板结构说明
|
|
98
|
+
===========
|
|
99
|
+
<main> ─ 页面根容器,承载背景和设计变量
|
|
100
|
+
<section.execution-content>─ 内容区,限制最大宽度并居中
|
|
101
|
+
<div.intro-block> ─ 任务标题和说明
|
|
102
|
+
<section.stats-panel> ─ 五列统计面板
|
|
103
|
+
<section.quick-section> ─ 四列快速入口
|
|
104
|
+
|
|
105
|
+
无障碍说明:
|
|
106
|
+
- 统计面板和快速入口区均使用 aria-label 标注用途
|
|
107
|
+
- 图标容器使用 aria-hidden="true",避免屏幕阅读器重复朗读
|
|
108
|
+
-->
|
|
43
109
|
<template>
|
|
110
|
+
<!-- 页面根容器:承载背景渐变和 CSS 设计变量 -->
|
|
44
111
|
<main class="forecast-execution-page">
|
|
112
|
+
<!-- 内容区:max-width 1428px,水平居中 -->
|
|
45
113
|
<section class="execution-content">
|
|
114
|
+
|
|
115
|
+
<!--
|
|
116
|
+
任务简介块
|
|
117
|
+
el-text 替代原生 h2/p,统一使用 Element Plus 排版体系:
|
|
118
|
+
- type="primary" 显示主题色标题
|
|
119
|
+
- size="large" 设置 20px 字号
|
|
120
|
+
- tag="h2" 渲染为 h2 标签,保持语义
|
|
121
|
+
-->
|
|
46
122
|
<div class="intro-block">
|
|
47
|
-
<h2>待处理任务</
|
|
48
|
-
<p>您有待处理的业务任务,请及时处理</p>
|
|
123
|
+
<el-text tag="h2" size="large" class="page-title">待处理任务</el-text>
|
|
124
|
+
<p class="intro-desc">您有待处理的业务任务,请及时处理</p>
|
|
49
125
|
</div>
|
|
50
126
|
|
|
127
|
+
<!--
|
|
128
|
+
待处理任务统计面板
|
|
129
|
+
布局方案:
|
|
130
|
+
- el-row + el-col 替代原 CSS Grid 5 列布局
|
|
131
|
+
- :gutter="20" 在列间添加 20px 间距(列两侧各 10px padding)
|
|
132
|
+
- 桌面: span=5(约 5 列) 平板: span=12(2 列) 手机: span=24(1 列)
|
|
133
|
+
- el-statistic 替代手写数字/标签,自带数字排版
|
|
134
|
+
-->
|
|
51
135
|
<section class="stats-panel" aria-label="待处理任务统计">
|
|
52
136
|
<article
|
|
53
137
|
v-for="(item, index) in taskStats"
|
|
@@ -55,22 +139,23 @@ const quickEntries: EntryAction[] = [
|
|
|
55
139
|
class="stat-item"
|
|
56
140
|
:class="[`is-${item.tone}`, { 'is-total': index === 0 }]"
|
|
57
141
|
>
|
|
58
|
-
<div v-if="item.icon" class="stat-
|
|
59
|
-
<
|
|
142
|
+
<div v-if="item.icon" class="stat-heading">
|
|
143
|
+
<div class="stat-icon" aria-hidden="true">
|
|
144
|
+
<el-icon :size="46"><component :is="item.icon" /></el-icon>
|
|
145
|
+
</div>
|
|
146
|
+
<span class="stat-label">{{ item.label }}</span>
|
|
60
147
|
</div>
|
|
148
|
+
<span v-else class="stat-label stat-total-label">{{ item.label }}</span>
|
|
61
149
|
|
|
62
|
-
<div class="stat-
|
|
63
|
-
<
|
|
64
|
-
<
|
|
65
|
-
<strong>{{ item.value }}</strong>
|
|
66
|
-
<span>{{ item.unit }}</span>
|
|
67
|
-
</p>
|
|
150
|
+
<div class="stat-number-row">
|
|
151
|
+
<strong class="stat-number">{{ item.value }}</strong>
|
|
152
|
+
<span class="stat-unit">{{ item.unit }}</span>
|
|
68
153
|
</div>
|
|
69
154
|
</article>
|
|
70
155
|
</section>
|
|
71
156
|
|
|
72
157
|
<section class="quick-section" aria-label="快速进入">
|
|
73
|
-
<h2>快速进入</h2>
|
|
158
|
+
<h2 class="section-title">快速进入</h2>
|
|
74
159
|
|
|
75
160
|
<div class="entry-grid">
|
|
76
161
|
<article
|
|
@@ -80,74 +165,101 @@ const quickEntries: EntryAction[] = [
|
|
|
80
165
|
:class="`is-${entry.tone}`"
|
|
81
166
|
>
|
|
82
167
|
<div class="entry-icon" aria-hidden="true">
|
|
83
|
-
<el-icon><component :is="entry.icon" /></el-icon>
|
|
168
|
+
<el-icon :size="58"><component :is="entry.icon" /></el-icon>
|
|
84
169
|
</div>
|
|
85
|
-
|
|
86
|
-
<
|
|
87
|
-
<
|
|
88
|
-
|
|
89
|
-
<el-button class="entry-button" type="primary">
|
|
90
|
-
{{ entry.button }}
|
|
91
|
-
</el-button>
|
|
170
|
+
<h3 class="entry-title">{{ entry.title }}</h3>
|
|
171
|
+
<p class="entry-desc">{{ entry.desc }}</p>
|
|
172
|
+
<button class="entry-button" type="button">{{ entry.button }}</button>
|
|
92
173
|
</article>
|
|
93
174
|
</div>
|
|
94
175
|
</section>
|
|
176
|
+
|
|
95
177
|
</section>
|
|
96
178
|
</main>
|
|
97
179
|
</template>
|
|
98
180
|
|
|
99
181
|
<style scoped>
|
|
182
|
+
/* ============================================================
|
|
183
|
+
头寸预报 - 执行页面样式
|
|
184
|
+
结构:内容区 → 任务简介 → 统计面板 → 快速入口
|
|
185
|
+
色彩系统:通过 --tone 变量驱动图标、数字和按钮的强调色。
|
|
186
|
+
============================================================ */
|
|
187
|
+
|
|
188
|
+
/* ---- 页面根容器 ----
|
|
189
|
+
定义全局设计变量(调色板)、背景渐变和基础排版。
|
|
190
|
+
overflow-x: hidden 防止 el-row 负 margin 导致水平滚动条。 */
|
|
100
191
|
.forecast-execution-page {
|
|
101
|
-
--ink: #0a1020;
|
|
102
|
-
--muted: #4a5568;
|
|
103
|
-
--line: #dde3ee;
|
|
104
|
-
--blue: #2563dc;
|
|
105
|
-
--
|
|
106
|
-
--
|
|
107
|
-
--
|
|
108
|
-
--red: #e93442;
|
|
192
|
+
--ink: #0a1020; /* 主文字色:深蓝黑,用于标题和正文 */
|
|
193
|
+
--muted: #4a5568; /* 次要文字色:灰色,用于描述性文字 */
|
|
194
|
+
--line: #dde3ee; /* 边框/分割线色:淡蓝灰 */
|
|
195
|
+
--blue: #2563dc; /* 蓝色强调色:用于"预报填报" */
|
|
196
|
+
--green: #18a970; /* 绿色强调色:用于"修改" */
|
|
197
|
+
--orange: #f47a00; /* 橙色强调色:用于"复核确认" */
|
|
198
|
+
--red: #e93442; /* 红色强调色:用于"异常反馈" */
|
|
109
199
|
width: 100%;
|
|
110
200
|
min-height: 100vh;
|
|
111
201
|
overflow-x: hidden;
|
|
112
202
|
overflow-y: auto;
|
|
113
203
|
color: var(--ink);
|
|
204
|
+
/* 双层背景:左上角蓝色光晕 + 整体浅蓝渐变,营造轻盈科技感 */
|
|
114
205
|
background:
|
|
115
206
|
radial-gradient(circle at 34% 12%, rgba(77, 139, 255, .09), transparent 32%),
|
|
116
207
|
linear-gradient(180deg, #fbfdff 0%, #f5f8fc 100%);
|
|
117
208
|
font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", sans-serif;
|
|
118
209
|
}
|
|
119
210
|
|
|
211
|
+
/* ---- 内容区 ----
|
|
212
|
+
max-width 限制最大宽度,margin: 0 auto 实现水平居中;
|
|
213
|
+
上下内边距拉开与页面边缘的距离。
|
|
214
|
+
el-col 自带 padding(由 el-row gutter 控制),无需额外 gap。 */
|
|
120
215
|
.execution-content {
|
|
121
|
-
max-width:
|
|
216
|
+
max-width: 1536px;
|
|
122
217
|
margin: 0 auto;
|
|
123
|
-
padding: 36px 58px
|
|
218
|
+
padding: 36px 58px 36px;
|
|
124
219
|
}
|
|
125
220
|
|
|
221
|
+
/* ---- 任务简介块 ----
|
|
222
|
+
el-text 替代了原生 h2/p,仅保留间距和标题字重。 */
|
|
126
223
|
.intro-block {
|
|
127
|
-
margin-bottom:
|
|
224
|
+
margin-bottom: 28px;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* 页面标题:el-text 渲染为 h2,额外设置 Extra Bold 字重 */
|
|
228
|
+
.page-title {
|
|
229
|
+
display: block;
|
|
230
|
+
margin-bottom: 18px;
|
|
231
|
+
color: #091225;
|
|
232
|
+
font-size: 30px;
|
|
233
|
+
line-height: 1;
|
|
234
|
+
font-weight: 800 !important;
|
|
128
235
|
}
|
|
129
236
|
|
|
130
|
-
.intro-
|
|
131
|
-
.quick-section h2 {
|
|
237
|
+
.intro-desc {
|
|
132
238
|
margin: 0;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
letter-spacing: 0;
|
|
239
|
+
color: #3f4a5c;
|
|
240
|
+
font-size: 18px;
|
|
241
|
+
line-height: 1.4;
|
|
137
242
|
}
|
|
138
243
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
244
|
+
/* 区块标题:快速入口标题,同样 Extra Bold */
|
|
245
|
+
.section-title {
|
|
246
|
+
display: block;
|
|
247
|
+
margin-bottom: 24px;
|
|
248
|
+
color: #070b13;
|
|
249
|
+
font-size: 26px;
|
|
250
|
+
line-height: 1;
|
|
251
|
+
font-weight: 800 !important;
|
|
144
252
|
}
|
|
145
253
|
|
|
254
|
+
/* ---- 统计面板 ----
|
|
255
|
+
保留面板容器样式(背景、边框、阴影),内部栅格由 el-row 接管。
|
|
256
|
+
overflow-x: hidden 包含 el-row 的负 margin,防止溢出。 */
|
|
146
257
|
.stats-panel {
|
|
258
|
+
min-height: 188px;
|
|
147
259
|
display: grid;
|
|
148
260
|
grid-template-columns: repeat(5, minmax(0, 1fr));
|
|
149
|
-
|
|
150
|
-
margin-bottom:
|
|
261
|
+
align-items: center;
|
|
262
|
+
margin-bottom: 44px;
|
|
151
263
|
padding: 30px 0;
|
|
152
264
|
border: 1px solid var(--line);
|
|
153
265
|
border-radius: 10px;
|
|
@@ -155,95 +267,94 @@ const quickEntries: EntryAction[] = [
|
|
|
155
267
|
box-shadow: 0 10px 24px rgba(29, 52, 88, .11);
|
|
156
268
|
}
|
|
157
269
|
|
|
270
|
+
/* ---- 单个统计项 ----
|
|
271
|
+
el-col 自带 gutter padding,仅需 flex 对齐和分隔线。
|
|
272
|
+
& + & 选择器:相邻统计项之间显示左侧分隔线(桌面端)。 */
|
|
158
273
|
.stat-item {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
align-
|
|
274
|
+
min-height: 118px;
|
|
275
|
+
display: grid;
|
|
276
|
+
grid-template-rows: 42px 62px;
|
|
277
|
+
align-content: center;
|
|
163
278
|
justify-content: center;
|
|
164
|
-
|
|
165
|
-
padding:
|
|
279
|
+
justify-items: center;
|
|
280
|
+
padding: 0 28px;
|
|
281
|
+
|
|
282
|
+
& + & {
|
|
283
|
+
border-left: 1px solid var(--line);
|
|
284
|
+
}
|
|
166
285
|
}
|
|
167
286
|
|
|
168
|
-
.stat-
|
|
169
|
-
|
|
287
|
+
.stat-heading {
|
|
288
|
+
display: inline-flex;
|
|
289
|
+
align-items: center;
|
|
290
|
+
gap: 16px;
|
|
291
|
+
color: #070b13;
|
|
170
292
|
}
|
|
171
293
|
|
|
172
|
-
.stat-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
294
|
+
.stat-total-label {
|
|
295
|
+
align-self: center;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/* 统计标签文字(如"全部待处理"):700 字重,不换行 */
|
|
299
|
+
.stat-label {
|
|
300
|
+
color: #05070d;
|
|
301
|
+
font-size: 18px;
|
|
302
|
+
font-weight: 800;
|
|
177
303
|
white-space: nowrap;
|
|
178
304
|
}
|
|
179
305
|
|
|
180
|
-
.stat-
|
|
181
|
-
|
|
306
|
+
.stat-number-row {
|
|
307
|
+
align-self: end;
|
|
308
|
+
display: inline-flex;
|
|
309
|
+
align-items: baseline;
|
|
310
|
+
gap: 14px;
|
|
182
311
|
color: var(--tone);
|
|
183
|
-
line-height: 1;
|
|
184
|
-
white-space: nowrap;
|
|
185
312
|
}
|
|
186
313
|
|
|
187
|
-
.stat-
|
|
314
|
+
.stat-number {
|
|
188
315
|
font-size: 50px;
|
|
189
316
|
font-weight: 800;
|
|
190
|
-
|
|
317
|
+
line-height: .95;
|
|
191
318
|
}
|
|
192
319
|
|
|
193
|
-
.stat-
|
|
194
|
-
|
|
195
|
-
font-
|
|
196
|
-
font-weight: 700;
|
|
320
|
+
.stat-unit {
|
|
321
|
+
font-size: 18px;
|
|
322
|
+
font-weight: 800;
|
|
197
323
|
}
|
|
198
324
|
|
|
325
|
+
/* ---- 统计图标 ----
|
|
326
|
+
el-icon 提供 :size prop,仅需颜色继承和 flex 防压缩。 */
|
|
199
327
|
.stat-icon {
|
|
200
|
-
width: 38px;
|
|
201
|
-
height: 38px;
|
|
202
328
|
flex: 0 0 auto;
|
|
203
|
-
display: inline-flex;
|
|
204
|
-
align-items: center;
|
|
205
|
-
justify-content: center;
|
|
206
|
-
margin-top: 2px;
|
|
207
329
|
color: var(--tone);
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
.is-blue {
|
|
212
|
-
--tone: var(--blue);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
.is-green {
|
|
216
|
-
--tone: var(--green);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
.is-orange {
|
|
220
|
-
--tone: var(--orange);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
.is-red {
|
|
224
|
-
--tone: var(--red);
|
|
330
|
+
margin-top: 2px;
|
|
225
331
|
}
|
|
226
332
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
333
|
+
/* ---- 色调工具类 ----
|
|
334
|
+
将全局调色板变量映射到 --tone 局部变量,
|
|
335
|
+
使子元素(图标、数字、按钮)通过 var(--tone) 自动继承色调。 */
|
|
336
|
+
.is-blue { --tone: var(--blue); }
|
|
337
|
+
.is-green { --tone: var(--green); }
|
|
338
|
+
.is-orange { --tone: var(--orange); }
|
|
339
|
+
.is-red { --tone: var(--red); }
|
|
230
340
|
|
|
231
341
|
.entry-grid {
|
|
232
342
|
display: grid;
|
|
233
343
|
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
234
|
-
gap:
|
|
344
|
+
gap: 24px;
|
|
235
345
|
}
|
|
236
346
|
|
|
237
347
|
.entry-card {
|
|
238
|
-
min-height:
|
|
348
|
+
min-height: 330px;
|
|
239
349
|
display: flex;
|
|
240
350
|
flex-direction: column;
|
|
241
351
|
align-items: center;
|
|
242
|
-
padding:
|
|
352
|
+
padding: 34px 34px 34px;
|
|
243
353
|
border: 1px solid var(--line);
|
|
244
|
-
border-radius:
|
|
245
|
-
background: rgba(255, 255, 255, .
|
|
246
|
-
box-shadow: 0 8px
|
|
354
|
+
border-radius: 10px;
|
|
355
|
+
background: rgba(255, 255, 255, .86);
|
|
356
|
+
box-shadow: 0 8px 18px rgba(21, 39, 68, .05);
|
|
357
|
+
text-align: center;
|
|
247
358
|
}
|
|
248
359
|
|
|
249
360
|
.entry-icon {
|
|
@@ -255,67 +366,75 @@ const quickEntries: EntryAction[] = [
|
|
|
255
366
|
border-radius: 18px;
|
|
256
367
|
color: var(--tone);
|
|
257
368
|
background: color-mix(in srgb, var(--tone) 11%, #fff);
|
|
258
|
-
font-size: 46px;
|
|
259
369
|
}
|
|
260
370
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
font-
|
|
266
|
-
|
|
371
|
+
/* 入口卡片标题:el-text 渲染,额外设置 Extra Bold */
|
|
372
|
+
.entry-title {
|
|
373
|
+
margin: 24px 0 14px;
|
|
374
|
+
color: #030713;
|
|
375
|
+
font-size: 24px;
|
|
376
|
+
line-height: 1;
|
|
377
|
+
font-weight: 800 !important;
|
|
267
378
|
}
|
|
268
379
|
|
|
269
|
-
.entry-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
line-height: 1.55;
|
|
275
|
-
text-align: center;
|
|
380
|
+
.entry-desc {
|
|
381
|
+
margin: 0;
|
|
382
|
+
color: #4a5568;
|
|
383
|
+
font-size: 16px;
|
|
384
|
+
line-height: 1.5;
|
|
276
385
|
}
|
|
277
386
|
|
|
278
387
|
.entry-button {
|
|
279
388
|
width: 180px;
|
|
280
|
-
height:
|
|
389
|
+
height: 46px;
|
|
281
390
|
margin-top: auto;
|
|
282
391
|
border: 0;
|
|
283
392
|
border-radius: 7px;
|
|
284
393
|
background: var(--tone);
|
|
285
|
-
|
|
394
|
+
color: #fff;
|
|
395
|
+
font-size: 17px;
|
|
286
396
|
font-weight: 700;
|
|
287
|
-
|
|
397
|
+
cursor: pointer;
|
|
288
398
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
399
|
+
&:hover,
|
|
400
|
+
&:focus {
|
|
401
|
+
background: color-mix(in srgb, var(--tone) 88%, #000);
|
|
402
|
+
}
|
|
292
403
|
}
|
|
293
404
|
|
|
294
|
-
|
|
405
|
+
/* ============================================================
|
|
406
|
+
响应式:平板 / 小桌面(≤ 992px)
|
|
407
|
+
el-col 的 sm="12" 自动切换为 2 列布局;
|
|
408
|
+
统计项分隔线逻辑从"相邻项之间"改为"偶数列左侧 + 行间横线"。
|
|
409
|
+
============================================================ */
|
|
410
|
+
@media (max-width: 992px) {
|
|
295
411
|
.execution-content {
|
|
296
412
|
padding-inline: 24px;
|
|
297
413
|
}
|
|
298
414
|
|
|
299
415
|
.stats-panel {
|
|
300
416
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
301
|
-
padding:
|
|
417
|
+
padding: 0;
|
|
302
418
|
}
|
|
303
419
|
|
|
304
420
|
.stat-item {
|
|
305
421
|
justify-content: flex-start;
|
|
306
|
-
padding:
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
422
|
+
padding: 28px;
|
|
423
|
+
|
|
424
|
+
/* 移除桌面版的相邻分隔线 */
|
|
425
|
+
& + & {
|
|
426
|
+
border-left: 0;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/* 偶数列左侧加分隔线(2 列网格的视觉分隔) */
|
|
430
|
+
&:nth-child(2n) {
|
|
431
|
+
border-left: 1px solid var(--line);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* 第 3 个及之后的项加顶部分隔线(区分上下两行) */
|
|
435
|
+
&:nth-child(n + 3) {
|
|
436
|
+
border-top: 1px solid var(--line);
|
|
437
|
+
}
|
|
319
438
|
}
|
|
320
439
|
|
|
321
440
|
.entry-grid {
|
|
@@ -323,19 +442,22 @@ const quickEntries: EntryAction[] = [
|
|
|
323
442
|
}
|
|
324
443
|
}
|
|
325
444
|
|
|
326
|
-
|
|
445
|
+
/* ============================================================
|
|
446
|
+
响应式:手机(≤ 768px)
|
|
447
|
+
el-col 的 xs="24" 自动切换为单列布局;
|
|
448
|
+
统计项分隔线改为纯水平,字号缩小。
|
|
449
|
+
============================================================ */
|
|
450
|
+
@media (max-width: 768px) {
|
|
327
451
|
.execution-content {
|
|
328
452
|
padding: 24px 16px;
|
|
329
453
|
}
|
|
330
454
|
|
|
331
|
-
.
|
|
332
|
-
|
|
333
|
-
font-size: 20px;
|
|
455
|
+
.page-title {
|
|
456
|
+
font-size: 28px;
|
|
334
457
|
}
|
|
335
458
|
|
|
336
|
-
.
|
|
337
|
-
|
|
338
|
-
font-size: 14px;
|
|
459
|
+
.section-title {
|
|
460
|
+
font-size: 26px;
|
|
339
461
|
}
|
|
340
462
|
|
|
341
463
|
.stats-panel,
|
|
@@ -343,23 +465,25 @@ const quickEntries: EntryAction[] = [
|
|
|
343
465
|
grid-template-columns: 1fr;
|
|
344
466
|
}
|
|
345
467
|
|
|
468
|
+
/* 统计项:移除所有竖线,改为纯水平分隔线(首项除外) */
|
|
346
469
|
.stat-item,
|
|
347
470
|
.stat-item:nth-child(2n),
|
|
348
471
|
.stat-item:nth-child(n + 3) {
|
|
349
472
|
border-left: 0;
|
|
350
473
|
border-top: 1px solid var(--line);
|
|
351
|
-
}
|
|
352
474
|
|
|
353
|
-
|
|
354
|
-
|
|
475
|
+
&:first-child {
|
|
476
|
+
border-top: 0;
|
|
477
|
+
}
|
|
355
478
|
}
|
|
356
479
|
|
|
357
|
-
|
|
358
|
-
|
|
480
|
+
/* 大号数字缩小,避免在窄屏溢出 */
|
|
481
|
+
.stat-number {
|
|
482
|
+
font-size: 48px;
|
|
359
483
|
}
|
|
360
484
|
|
|
361
485
|
.entry-card {
|
|
362
|
-
min-height:
|
|
486
|
+
min-height: 340px;
|
|
363
487
|
}
|
|
364
488
|
}
|
|
365
489
|
</style>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|