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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "verce-vue-test",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -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 '@/components/executive/ExecutiveAccountPanel.vue'
3
- import ExecutiveReliablePanel from '@/components/executive/ExecutiveReliablePanel.vue'
4
- import ExecutiveWarningOverview from '@/components/executive/ExecutiveWarningOverview.vue'
5
- import ExecutiveWarningTablePanel from '@/components/executive/ExecutiveWarningTablePanel.vue'
6
- import '@/assets/executive-management.css'
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
- WarningFilled,
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: '预报填报', value: 5, unit: '条', tone: 'blue', icon: Document },
30
- { label: '修改', value: 3, unit: '条', tone: 'green', icon: RefreshRight },
31
- { label: '复核确认', value: 2, unit: '条', tone: 'orange', icon: CircleCheckFilled },
32
- { label: '异常反馈', value: 2, unit: '条', tone: 'red', icon: WarningFilled },
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: '填写头寸预报数据', button: '立即填报', tone: 'blue', icon: Document },
37
- { title: '修改', desc: '修改已填报预报数据', button: '立即处理', tone: 'green', icon: RefreshRight },
38
- { title: '复核确认', desc: '复核并确认预报数据', button: '立即处理', tone: 'orange', icon: CircleCheckFilled },
39
- { title: '异常反馈', desc: '处理预报异常反馈', button: '立即处理', tone: 'red', icon: WarningFilled },
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>待处理任务</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-icon" aria-hidden="true">
59
- <el-icon><component :is="item.icon" /></el-icon>
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-copy">
63
- <h3>{{ item.label }}</h3>
64
- <p>
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
- <h3>{{ entry.title }}</h3>
87
- <p>{{ entry.desc }}</p>
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
- --blue-strong: #1f5bd8;
106
- --green: #18a970;
107
- --orange: #f47a00;
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: 1428px;
216
+ max-width: 1536px;
122
217
  margin: 0 auto;
123
- padding: 36px 58px 42px;
218
+ padding: 36px 58px 36px;
124
219
  }
125
220
 
221
+ /* ---- 任务简介块 ----
222
+ el-text 替代了原生 h2/p,仅保留间距和标题字重。 */
126
223
  .intro-block {
127
- margin-bottom: 24px;
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-block h2,
131
- .quick-section h2 {
237
+ .intro-desc {
132
238
  margin: 0;
133
- font-size: 24px;
134
- line-height: 1.2;
135
- font-weight: 800;
136
- letter-spacing: 0;
239
+ color: #3f4a5c;
240
+ font-size: 18px;
241
+ line-height: 1.4;
137
242
  }
138
243
 
139
- .intro-block p {
140
- margin: 14px 0 0;
141
- color: var(--muted);
142
- font-size: 16px;
143
- line-height: 1.45;
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
- min-height: 188px;
150
- margin-bottom: 34px;
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
- position: relative;
160
- min-width: 0;
161
- display: flex;
162
- align-items: flex-start;
274
+ min-height: 118px;
275
+ display: grid;
276
+ grid-template-rows: 42px 62px;
277
+ align-content: center;
163
278
  justify-content: center;
164
- gap: 14px;
165
- padding: 4px 22px 0;
279
+ justify-items: center;
280
+ padding: 0 28px;
281
+
282
+ & + & {
283
+ border-left: 1px solid var(--line);
284
+ }
166
285
  }
167
286
 
168
- .stat-item + .stat-item {
169
- border-left: 1px solid var(--line);
287
+ .stat-heading {
288
+ display: inline-flex;
289
+ align-items: center;
290
+ gap: 16px;
291
+ color: #070b13;
170
292
  }
171
293
 
172
- .stat-copy h3 {
173
- margin: 6px 0 18px;
174
- font-size: 16px;
175
- line-height: 1.2;
176
- font-weight: 750;
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-copy p {
181
- margin: 0;
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-copy strong {
314
+ .stat-number {
188
315
  font-size: 50px;
189
316
  font-weight: 800;
190
- letter-spacing: 0;
317
+ line-height: .95;
191
318
  }
192
319
 
193
- .stat-copy span {
194
- margin-left: 10px;
195
- font-size: 16px;
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
- font-size: 34px;
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
- .quick-section h2 {
228
- margin-bottom: 20px;
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: 18px;
344
+ gap: 24px;
235
345
  }
236
346
 
237
347
  .entry-card {
238
- min-height: 316px;
348
+ min-height: 330px;
239
349
  display: flex;
240
350
  flex-direction: column;
241
351
  align-items: center;
242
- padding: 30px 24px 28px;
352
+ padding: 34px 34px 34px;
243
353
  border: 1px solid var(--line);
244
- border-radius: 9px;
245
- background: rgba(255, 255, 255, .78);
246
- box-shadow: 0 8px 20px rgba(23, 42, 75, .05);
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
- .entry-card h3 {
262
- margin: 18px 0 10px;
263
- font-size: 22px;
264
- line-height: 1.2;
265
- font-weight: 800;
266
- letter-spacing: 0;
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-card p {
270
- min-height: 24px;
271
- margin: 0 0 20px;
272
- color: var(--muted);
273
- font-size: 15px;
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: 44px;
389
+ height: 46px;
281
390
  margin-top: auto;
282
391
  border: 0;
283
392
  border-radius: 7px;
284
393
  background: var(--tone);
285
- font-size: 18px;
394
+ color: #fff;
395
+ font-size: 17px;
286
396
  font-weight: 700;
287
- }
397
+ cursor: pointer;
288
398
 
289
- .entry-button:hover,
290
- .entry-button:focus {
291
- background: color-mix(in srgb, var(--tone) 88%, #000);
399
+ &:hover,
400
+ &:focus {
401
+ background: color-mix(in srgb, var(--tone) 88%, #000);
402
+ }
292
403
  }
293
404
 
294
- @media (max-width: 1180px) {
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: 20px 0;
417
+ padding: 0;
302
418
  }
303
419
 
304
420
  .stat-item {
305
421
  justify-content: flex-start;
306
- padding: 24px 32px;
307
- }
308
-
309
- .stat-item + .stat-item {
310
- border-left: 0;
311
- }
312
-
313
- .stat-item:nth-child(2n) {
314
- border-left: 1px solid var(--line);
315
- }
316
-
317
- .stat-item:nth-child(n + 3) {
318
- border-top: 1px solid var(--line);
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
- @media (max-width: 720px) {
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
- .intro-block h2,
332
- .quick-section h2 {
333
- font-size: 20px;
455
+ .page-title {
456
+ font-size: 28px;
334
457
  }
335
458
 
336
- .intro-block p {
337
- margin-top: 10px;
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
- .stat-item:first-child {
354
- border-top: 0;
475
+ &:first-child {
476
+ border-top: 0;
477
+ }
355
478
  }
356
479
 
357
- .stat-copy strong {
358
- font-size: 42px;
480
+ /* 大号数字缩小,避免在窄屏溢出 */
481
+ .stat-number {
482
+ font-size: 48px;
359
483
  }
360
484
 
361
485
  .entry-card {
362
- min-height: 288px;
486
+ min-height: 340px;
363
487
  }
364
488
  }
365
489
  </style>