@travel-screen/l-module-components 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.
- package/README.md +86 -0
- package/package.json +34 -0
- package/src/index.js +60 -0
- package/src/l-bar-chart/README.md +302 -0
- package/src/l-bar-chart/index.vue +405 -0
- package/src/l-bar-chart/interface/index.js +210 -0
- package/src/l-data-panel/README.md +331 -0
- package/src/l-data-panel/img/images.js +47 -0
- package/src/l-data-panel/img/l-data-panel_bg_1.png +0 -0
- package/src/l-data-panel/img/l-data-panel_bg_2.png +0 -0
- package/src/l-data-panel/img/l-data-panel_bg_3.png +0 -0
- package/src/l-data-panel/index.vue +150 -0
- package/src/l-data-panel/interface/index.js +249 -0
- package/src/l-data-ring/README.md +292 -0
- package/src/l-data-ring/img/images.js +21 -0
- package/src/l-data-ring/img/l-data-ring_bg.png +0 -0
- package/src/l-data-ring/index.vue +93 -0
- package/src/l-data-ring/interface/index.js +116 -0
- package/src/l-date-picker/README.md +276 -0
- package/src/l-date-picker/index.vue +185 -0
- package/src/l-date-picker/interface/index.js +128 -0
- package/src/l-icon-label/README.md +356 -0
- package/src/l-icon-label/img/images.js +28 -0
- package/src/l-icon-label/img/l-icon-label_bg.png +0 -0
- package/src/l-icon-label/img/l-icon-label_icon.png +0 -0
- package/src/l-icon-label/index.vue +162 -0
- package/src/l-icon-label/interface/index.js +234 -0
- package/src/l-label-value/README.md +358 -0
- package/src/l-label-value/img/images.js +19 -0
- package/src/l-label-value/img/l-label-value_line.png +0 -0
- package/src/l-label-value/index.vue +132 -0
- package/src/l-label-value/interface/index.js +116 -0
- package/src/l-metric-tile/README.md +391 -0
- package/src/l-metric-tile/img/images.js +19 -0
- package/src/l-metric-tile/img/l-metric-tile_bg_1.png +0 -0
- package/src/l-metric-tile/index.vue +138 -0
- package/src/l-metric-tile/interface/index.js +241 -0
- package/src/l-module-box/README.md +289 -0
- package/src/l-module-box/img/images.js +28 -0
- package/src/l-module-box/img/l-module-box_bg.png +0 -0
- package/src/l-module-box/img/l-module-box_icon.png +0 -0
- package/src/l-module-box/index.vue +125 -0
- package/src/l-module-box/interface/index.js +93 -0
- package/src/l-module-tag/README.md +243 -0
- package/src/l-module-tag/index.vue +137 -0
- package/src/l-module-tag/interface/index.js +91 -0
- package/src/l-rank-list/README.md +553 -0
- package/src/l-rank-list/img/images.js +34 -0
- package/src/l-rank-list/img/l-rank-list_icon_line.png +0 -0
- package/src/l-rank-list/img/l-rank-list_icon_rank_1.png +0 -0
- package/src/l-rank-list/img/l-rank-list_icon_rank_2.png +0 -0
- package/src/l-rank-list/img/l-rank-list_icon_rank_other.png +0 -0
- package/src/l-rank-list/index.vue +610 -0
- package/src/l-rank-list/interface/index.js +343 -0
- package/src/l-stat-card/README.md +309 -0
- package/src/l-stat-card/img/images.js +36 -0
- package/src/l-stat-card/img/img-bg.png +0 -0
- package/src/l-stat-card/img/l-stat-card_img_1.png +0 -0
- package/src/l-stat-card/index.vue +136 -0
- package/src/l-stat-card/interface/index.js +159 -0
- package/src/l-tabs/README.md +285 -0
- package/src/l-tabs/img/images.js +19 -0
- package/src/l-tabs/img/l-tabs_bg.png +0 -0
- package/src/l-tabs/index.vue +97 -0
- package/src/l-tabs/interface/index.js +115 -0
- package/src/l-trend-card/README.md +415 -0
- package/src/l-trend-card/img/images.js +41 -0
- package/src/l-trend-card/img/l-trend-card_bg.png +0 -0
- package/src/l-trend-card/img/l-trend-card_icon_1.png +0 -0
- package/src/l-trend-card/img/l-trend-card_icon_down.png +0 -0
- package/src/l-trend-card/img/l-trend-card_icon_up.png +0 -0
- package/src/l-trend-card/index.vue +181 -0
- package/src/l-trend-card/interface/index.js +243 -0
- package/src/utils/tooltip.js +30 -0
- package/src/utils/util.js +27 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
const interfaceObj = {
|
|
2
|
+
// ========== 基础数据 ==========
|
|
3
|
+
// 标题:显示的标题文字
|
|
4
|
+
title: {
|
|
5
|
+
type: String,
|
|
6
|
+
default: '标题'
|
|
7
|
+
},
|
|
8
|
+
// 数值:显示的数值
|
|
9
|
+
data: {
|
|
10
|
+
type: [String, Number],
|
|
11
|
+
default: 0
|
|
12
|
+
},
|
|
13
|
+
// 单位:数值单位
|
|
14
|
+
unit: {
|
|
15
|
+
type: String,
|
|
16
|
+
default: ''
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
// ========== 背景图相关 ==========
|
|
20
|
+
// 背景图图片:卡片背景图URL,未传入时使用默认背景图
|
|
21
|
+
bgImage: {
|
|
22
|
+
type: String,
|
|
23
|
+
default: ''
|
|
24
|
+
},
|
|
25
|
+
// 背景图尺寸:背景图的缩放方式(如:100% 100%)
|
|
26
|
+
bgSize: {
|
|
27
|
+
type: String,
|
|
28
|
+
default: '100% 100%'
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
// ========== 图标相关 ==========
|
|
32
|
+
// 图标图片:卡片图标URL,未传入时使用默认图标
|
|
33
|
+
icon: {
|
|
34
|
+
type: String,
|
|
35
|
+
default: ''
|
|
36
|
+
},
|
|
37
|
+
// 图标宽度:图标的宽度
|
|
38
|
+
iconWidth: {
|
|
39
|
+
type: [String, Number],
|
|
40
|
+
default: '40px'
|
|
41
|
+
},
|
|
42
|
+
// 图标高度:图标的高度
|
|
43
|
+
iconHeight: {
|
|
44
|
+
type: [String, Number],
|
|
45
|
+
default: '40px'
|
|
46
|
+
},
|
|
47
|
+
// 图标右侧边距:图标与右侧内容的间距
|
|
48
|
+
iconMarginRight: {
|
|
49
|
+
type: [String, Number],
|
|
50
|
+
default: '12px'
|
|
51
|
+
},
|
|
52
|
+
// 图标flex收缩:图标是否允许收缩(0为不允许)
|
|
53
|
+
iconFlexShrink: {
|
|
54
|
+
type: [String, Number],
|
|
55
|
+
default: 0
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
// ========== 卡片容器相关 ==========
|
|
59
|
+
// 卡片宽度:容器的宽度
|
|
60
|
+
cardWidth: {
|
|
61
|
+
type: [String, Number],
|
|
62
|
+
default: '230px'
|
|
63
|
+
},
|
|
64
|
+
// 卡片高度:容器的高度
|
|
65
|
+
cardHeight: {
|
|
66
|
+
type: [String, Number],
|
|
67
|
+
default: '66px'
|
|
68
|
+
},
|
|
69
|
+
// 卡片内边距:容器的内边距
|
|
70
|
+
cardPadding: {
|
|
71
|
+
type: String,
|
|
72
|
+
default: '0 14px'
|
|
73
|
+
},
|
|
74
|
+
// 卡片盒模型:box-sizing 属性
|
|
75
|
+
cardBoxSizing: {
|
|
76
|
+
type: String,
|
|
77
|
+
default: 'border-box'
|
|
78
|
+
},
|
|
79
|
+
// 卡片对齐方式:交叉轴对齐方式
|
|
80
|
+
cardAlignItems: {
|
|
81
|
+
type: String,
|
|
82
|
+
default: 'center'
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
// ========== 信息容器相关 ==========
|
|
86
|
+
// 信息容器flex:信息区域的flex值
|
|
87
|
+
infoFlex: {
|
|
88
|
+
type: [String, Number],
|
|
89
|
+
default: 1
|
|
90
|
+
},
|
|
91
|
+
// 信息容器显示方式:display 属性
|
|
92
|
+
infoDisplay: {
|
|
93
|
+
type: String,
|
|
94
|
+
default: 'flex'
|
|
95
|
+
},
|
|
96
|
+
// 信息容器主轴方向:flex-direction 属性
|
|
97
|
+
infoFlexDirection: {
|
|
98
|
+
type: String,
|
|
99
|
+
default: 'column'
|
|
100
|
+
},
|
|
101
|
+
// 信息容器交叉轴对齐:justify-content 属性
|
|
102
|
+
infoJustifyContent: {
|
|
103
|
+
type: String,
|
|
104
|
+
default: 'center'
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
// ========== 标题相关 ==========
|
|
108
|
+
// 标题字体:标题文字的字体族
|
|
109
|
+
titleFontFamily: {
|
|
110
|
+
type: String,
|
|
111
|
+
default: 'PingFangSC, PingFang SC'
|
|
112
|
+
},
|
|
113
|
+
// 标题字重:标题文字的粗细
|
|
114
|
+
titleFontWeight: {
|
|
115
|
+
type: [String, Number],
|
|
116
|
+
default: 500
|
|
117
|
+
},
|
|
118
|
+
// 标题字号:标题文字的大小
|
|
119
|
+
titleFontSize: {
|
|
120
|
+
type: [String, Number],
|
|
121
|
+
default: '18px'
|
|
122
|
+
},
|
|
123
|
+
// 标题颜色:标题文字的颜色
|
|
124
|
+
titleColor: {
|
|
125
|
+
type: String,
|
|
126
|
+
default: '#ffffff'
|
|
127
|
+
},
|
|
128
|
+
// 标题行高:标题文字的行高
|
|
129
|
+
titleLineHeight: {
|
|
130
|
+
type: [String, Number],
|
|
131
|
+
default: 1
|
|
132
|
+
},
|
|
133
|
+
// 标题底部边距:标题与下方数值的间距
|
|
134
|
+
titleMarginBottom: {
|
|
135
|
+
type: [String, Number],
|
|
136
|
+
default: '2px'
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
// ========== 数值相关 ==========
|
|
140
|
+
// 数值显示方式:数值容器的display属性
|
|
141
|
+
numDisplay: {
|
|
142
|
+
type: String,
|
|
143
|
+
default: 'flex'
|
|
144
|
+
},
|
|
145
|
+
// 数值对齐方式:数值与单位的对齐方式(baseline、center等)
|
|
146
|
+
numAlignItems: {
|
|
147
|
+
type: String,
|
|
148
|
+
default: 'baseline'
|
|
149
|
+
},
|
|
150
|
+
// 数值字体:数值文字的字体族
|
|
151
|
+
numFontFamily: {
|
|
152
|
+
type: String,
|
|
153
|
+
default: 'DINAlternate, DIN Alternate, YouSheBiaoTiHei, sans-serif'
|
|
154
|
+
},
|
|
155
|
+
// 数值字重:数值文字的粗细
|
|
156
|
+
numFontWeight: {
|
|
157
|
+
type: [String, Number],
|
|
158
|
+
default: 'bold'
|
|
159
|
+
},
|
|
160
|
+
// 数值字体样式:数值文字的样式(italic为斜体)
|
|
161
|
+
numFontStyle: {
|
|
162
|
+
type: String,
|
|
163
|
+
default: 'italic'
|
|
164
|
+
},
|
|
165
|
+
// 数值字号:数值文字的大小
|
|
166
|
+
numFontSize: {
|
|
167
|
+
type: [String, Number],
|
|
168
|
+
default: '26px'
|
|
169
|
+
},
|
|
170
|
+
// 数值行高:数值文字的行高
|
|
171
|
+
numLineHeight: {
|
|
172
|
+
type: [String, Number],
|
|
173
|
+
default: 1
|
|
174
|
+
},
|
|
175
|
+
// 数值右侧边距:数值与单位之间的间距
|
|
176
|
+
numMarginRight: {
|
|
177
|
+
type: [String, Number],
|
|
178
|
+
default: '4px'
|
|
179
|
+
},
|
|
180
|
+
// 数值右侧内边距:数值的右侧内边距
|
|
181
|
+
numPaddingRight: {
|
|
182
|
+
type: [String, Number],
|
|
183
|
+
default: '2px'
|
|
184
|
+
},
|
|
185
|
+
// 数值颜色:数值文字的颜色(使用渐变色时设为transparent)
|
|
186
|
+
numColor: {
|
|
187
|
+
type: String,
|
|
188
|
+
default: 'transparent'
|
|
189
|
+
},
|
|
190
|
+
// 数值背景渐变色:数值文字的渐变背景
|
|
191
|
+
numBackground: {
|
|
192
|
+
type: String,
|
|
193
|
+
default: 'linear-gradient(180deg, #ffffff 0%, #4aefa0 100%)'
|
|
194
|
+
},
|
|
195
|
+
// 数值背景裁剪:背景裁剪方式(text为文字裁剪)
|
|
196
|
+
numBackgroundClip: {
|
|
197
|
+
type: String,
|
|
198
|
+
default: 'text'
|
|
199
|
+
},
|
|
200
|
+
// 数值文字阴影:数值文字的阴影效果
|
|
201
|
+
numTextShadow: {
|
|
202
|
+
type: String,
|
|
203
|
+
default: '0px 2px 4px rgba(74, 239, 160, 0.5)'
|
|
204
|
+
},
|
|
205
|
+
|
|
206
|
+
// ========== 单位相关 ==========
|
|
207
|
+
// 单位字体:单位文字的字体族
|
|
208
|
+
unitFontFamily: {
|
|
209
|
+
type: String,
|
|
210
|
+
default: 'PingFangSC, PingFang SC'
|
|
211
|
+
},
|
|
212
|
+
// 单位字重:单位文字的粗细
|
|
213
|
+
unitFontWeight: {
|
|
214
|
+
type: [String, Number],
|
|
215
|
+
default: 400
|
|
216
|
+
},
|
|
217
|
+
// 单位字号:单位文字的大小
|
|
218
|
+
unitFontSize: {
|
|
219
|
+
type: [String, Number],
|
|
220
|
+
default: '12px'
|
|
221
|
+
},
|
|
222
|
+
// 单位颜色:单位文字的颜色
|
|
223
|
+
unitColor: {
|
|
224
|
+
type: String,
|
|
225
|
+
default: '#ffffff'
|
|
226
|
+
},
|
|
227
|
+
// 单位行高:单位文字的行高
|
|
228
|
+
unitLineHeight: {
|
|
229
|
+
type: [String, Number],
|
|
230
|
+
default: 1
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export default interfaceObj
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
---
|
|
2
|
+
AIGC:
|
|
3
|
+
ContentProducer: '001191110102MAD55U9H0F10002'
|
|
4
|
+
ContentPropagator: '001191110102MAD55U9H0F10002'
|
|
5
|
+
Label: '1'
|
|
6
|
+
ProduceID: '8bc7d291-59d3-4168-844c-745e620ac407'
|
|
7
|
+
PropagateID: '8bc7d291-59d3-4168-844c-745e620ac407'
|
|
8
|
+
ReservedCode1: '592eb883-2e1e-4c1e-b53e-3b49995352f9'
|
|
9
|
+
ReservedCode2: '592eb883-2e1e-4c1e-b53e-3b49995352f9'
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# LLabelValue 组件说明
|
|
13
|
+
|
|
14
|
+
## 概述
|
|
15
|
+
|
|
16
|
+
`LLabelValue` 是一个参数化驱动的标签数值展示组件,采用类似 Element UI 的封装方式。用于展示带数值、标签和可选分隔线的单项数据(如:风险总数、隐患总数等指标)。所有样式(数值大小/颜色、标签样式、分隔线等)均通过 props 参数动态控制。
|
|
17
|
+
|
|
18
|
+
## 核心特性
|
|
19
|
+
|
|
20
|
+
- ✅ **Props 驱动**:所有样式通过 props 参数控制,类似 Element UI
|
|
21
|
+
- ✅ **默认分隔线**:未传入分隔线图片时自动使用组件内置默认分隔线
|
|
22
|
+
- ✅ **高度灵活**:支持自定义分隔线、数值样式、标签样式等
|
|
23
|
+
- ✅ **类型安全**:支持 String 和 Number 类型的尺寸参数
|
|
24
|
+
- ✅ **渐变数值**:支持数值文字渐变效果
|
|
25
|
+
- ✅ **可选分隔线**:通过 `showLine` 参数控制是否显示分隔线
|
|
26
|
+
|
|
27
|
+
## 文件结构
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
l-label-value/
|
|
31
|
+
├── img/
|
|
32
|
+
│ ├── images.js # 图片映射文件
|
|
33
|
+
│ └── l-label-value_line.png # 默认分隔线图片
|
|
34
|
+
├── interface/
|
|
35
|
+
│ └── index.js # Props 定义(20+ 个参数)
|
|
36
|
+
├── index.vue # 主组件(内联样式驱动)
|
|
37
|
+
└── README.md # 组件说明文档
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Props 参数
|
|
41
|
+
|
|
42
|
+
### 基础数据
|
|
43
|
+
|
|
44
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
45
|
+
|--------|------|--------|------|
|
|
46
|
+
| `num` | String/Number | `'-'` | 显示的数值 |
|
|
47
|
+
| `label` | String | `''` | 数值下方的标签文字 |
|
|
48
|
+
|
|
49
|
+
### 分隔线相关
|
|
50
|
+
|
|
51
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
52
|
+
|--------|------|--------|------|
|
|
53
|
+
| `lineImage` | String | `''` | 分隔线图片URL(留空则使用默认分隔线) |
|
|
54
|
+
| `lineWidth` | String/Number | `'2px'` | 分隔线宽度 |
|
|
55
|
+
| `lineHeight` | String/Number | `'36px'` | 分隔线高度 |
|
|
56
|
+
| `showLine` | Boolean | `true` | 是否显示分隔线 |
|
|
57
|
+
|
|
58
|
+
### 数值相关
|
|
59
|
+
|
|
60
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
61
|
+
|--------|------|--------|------|
|
|
62
|
+
| `numFontFamily` | String | `'DINAlternate, DIN Alternate, YouSheBiaoTiHei, sans-serif'` | 数值字体 |
|
|
63
|
+
| `numFontWeight` | String/Number | `'bold'` | 数值字重 |
|
|
64
|
+
| `numFontStyle` | String | `'italic'` | 数值字体样式 |
|
|
65
|
+
| `numFontSize` | String/Number | `'28px'` | 数值字号 |
|
|
66
|
+
| `numLineHeight` | String/Number | `1` | 数值行高 |
|
|
67
|
+
| `numColor` | String | `'transparent'` | 数值颜色(使用渐变时设为transparent) |
|
|
68
|
+
| `numBackground` | String | `'linear-gradient(180deg, #ffffff 0%, #4aefa0 100%)'` | 数值渐变背景 |
|
|
69
|
+
| `numBackgroundClip` | String | `'text'` | 数值背景裁剪 |
|
|
70
|
+
| `numTextShadow` | String | `'0px 2px 6px rgba(74, 239, 160, 0.5)'` | 数值文字阴影 |
|
|
71
|
+
| `numPaddingRight` | String/Number | `'3px'` | 数值右侧内边距 |
|
|
72
|
+
| `numMarginBottom` | String/Number | `'8px'` | 数值底部边距(与标签的间距) |
|
|
73
|
+
|
|
74
|
+
### 标签相关
|
|
75
|
+
|
|
76
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
77
|
+
|--------|------|--------|------|
|
|
78
|
+
| `labelFontFamily` | String | `'PingFangSC, PingFang SC'` | 标签字体 |
|
|
79
|
+
| `labelFontWeight` | String/Number | `400` | 标签字重 |
|
|
80
|
+
| `labelFontSize` | String/Number | `'16px'` | 标签字号 |
|
|
81
|
+
| `labelColor` | String | `'#A3C2CC'` | 标签颜色 |
|
|
82
|
+
| `labelLineHeight` | String/Number | `1` | 标签行高 |
|
|
83
|
+
| `labelTextAlign` | String | `'center'` | 标签对齐方式 |
|
|
84
|
+
|
|
85
|
+
## 使用方式
|
|
86
|
+
|
|
87
|
+
### 基本使用(单个数据项)
|
|
88
|
+
|
|
89
|
+
```vue
|
|
90
|
+
<template>
|
|
91
|
+
<l-label-value
|
|
92
|
+
num="19503"
|
|
93
|
+
label="风险总数"
|
|
94
|
+
/>
|
|
95
|
+
</template>
|
|
96
|
+
|
|
97
|
+
<script>
|
|
98
|
+
import LLabelValue from '@/components/moduleDataNew/l-label-value/index.vue'
|
|
99
|
+
|
|
100
|
+
export default {
|
|
101
|
+
components: {
|
|
102
|
+
LLabelValue
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
</script>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 多项数据展示(带分隔线)
|
|
109
|
+
|
|
110
|
+
```vue
|
|
111
|
+
<template>
|
|
112
|
+
<div class="risk-container">
|
|
113
|
+
<l-label-value
|
|
114
|
+
v-for="(item, index) in riskList"
|
|
115
|
+
:key="index"
|
|
116
|
+
:num="item.num"
|
|
117
|
+
:label="item.label"
|
|
118
|
+
/>
|
|
119
|
+
<img
|
|
120
|
+
v-for="index in riskList.length - 1"
|
|
121
|
+
:key="`line-${index}`"
|
|
122
|
+
class="risk-line"
|
|
123
|
+
src="@/assets/index/line-img.png"
|
|
124
|
+
>
|
|
125
|
+
</div>
|
|
126
|
+
</template>
|
|
127
|
+
|
|
128
|
+
<script>
|
|
129
|
+
import LLabelValue from '@/components/moduleDataNew/l-label-value/index.vue'
|
|
130
|
+
|
|
131
|
+
export default {
|
|
132
|
+
components: {
|
|
133
|
+
LLabelValue
|
|
134
|
+
},
|
|
135
|
+
data() {
|
|
136
|
+
return {
|
|
137
|
+
riskList: [
|
|
138
|
+
{ num: 19503, label: '风险总数' },
|
|
139
|
+
{ num: '95.51%', label: '风险解除率' },
|
|
140
|
+
{ num: 6995, label: '隐患总数' },
|
|
141
|
+
{ num: '77.30%', label: '隐患整改率' }
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
</script>
|
|
147
|
+
|
|
148
|
+
<style scoped>
|
|
149
|
+
.risk-container {
|
|
150
|
+
display: flex;
|
|
151
|
+
align-items: center;
|
|
152
|
+
justify-content: space-around;
|
|
153
|
+
height: 74px;
|
|
154
|
+
padding: 0 4px;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.risk-line {
|
|
158
|
+
width: 2px;
|
|
159
|
+
height: 36px;
|
|
160
|
+
flex-shrink: 0;
|
|
161
|
+
}
|
|
162
|
+
</style>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 自定义分隔线
|
|
166
|
+
|
|
167
|
+
```vue
|
|
168
|
+
<template>
|
|
169
|
+
<l-label-value
|
|
170
|
+
num="100"
|
|
171
|
+
label="测试数据"
|
|
172
|
+
:lineImage="require('@/assets/custom-line.png')"
|
|
173
|
+
:lineWidth="3"
|
|
174
|
+
:lineHeight="40"
|
|
175
|
+
/>
|
|
176
|
+
</template>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 自定义数值和标签样式
|
|
180
|
+
|
|
181
|
+
```vue
|
|
182
|
+
<template>
|
|
183
|
+
<l-label-value
|
|
184
|
+
num="19503"
|
|
185
|
+
label="风险总数"
|
|
186
|
+
:numFontSize="32"
|
|
187
|
+
:numBackground="'linear-gradient(180deg, #FF6B6B 0%, #4CE27E 100%)'"
|
|
188
|
+
:numTextShadow="'0px 2px 8px rgba(255, 107, 107, 0.6)'"
|
|
189
|
+
:labelFontSize="18"
|
|
190
|
+
labelColor="#E8EEF4"
|
|
191
|
+
:showLine="false"
|
|
192
|
+
/>
|
|
193
|
+
</template>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 完整自定义
|
|
197
|
+
|
|
198
|
+
```vue
|
|
199
|
+
<template>
|
|
200
|
+
<div class="risk-container">
|
|
201
|
+
<l-label-value
|
|
202
|
+
v-for="(item, index) in riskList"
|
|
203
|
+
:key="index"
|
|
204
|
+
:num="item.num"
|
|
205
|
+
:label="item.label"
|
|
206
|
+
/>
|
|
207
|
+
<img
|
|
208
|
+
v-for="index in riskList.length - 1"
|
|
209
|
+
:key="`line-${index}`"
|
|
210
|
+
class="risk-line"
|
|
211
|
+
src="@/assets/index/line-img.png"
|
|
212
|
+
>
|
|
213
|
+
</div>
|
|
214
|
+
</template>
|
|
215
|
+
|
|
216
|
+
<script>
|
|
217
|
+
export default {
|
|
218
|
+
data() {
|
|
219
|
+
return {
|
|
220
|
+
riskList: [
|
|
221
|
+
{ num: 19503, label: '风险总数' },
|
|
222
|
+
{ num: '95.51%', label: '风险解除率' },
|
|
223
|
+
{ num: 6995, label: '隐患总数' },
|
|
224
|
+
{ num: '77.30%', label: '隐患整改率' }
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
</script>
|
|
230
|
+
|
|
231
|
+
<style scoped>
|
|
232
|
+
.risk-container {
|
|
233
|
+
display: flex;
|
|
234
|
+
align-items: center;
|
|
235
|
+
justify-content: space-around;
|
|
236
|
+
height: 74px;
|
|
237
|
+
padding: 0 4px;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.risk-line {
|
|
241
|
+
width: 2px;
|
|
242
|
+
height: 36px;
|
|
243
|
+
flex-shrink: 0;
|
|
244
|
+
}
|
|
245
|
+
</style>
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## 数据结构
|
|
249
|
+
|
|
250
|
+
### riskList 格式(用于 v-for 循环)
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
[
|
|
254
|
+
{ num: 19503, label: '风险总数' },
|
|
255
|
+
{ num: '95.51%', label: '风险解除率' },
|
|
256
|
+
{ num: 6995, label: '隐患总数' },
|
|
257
|
+
{ num: '77.30%', label: '隐患整改率' }
|
|
258
|
+
]
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
- `num`: 数值(支持数字或字符串)
|
|
262
|
+
- `label`: 标签文字
|
|
263
|
+
|
|
264
|
+
## 技术实现
|
|
265
|
+
|
|
266
|
+
### 内联样式生成
|
|
267
|
+
|
|
268
|
+
组件通过 computed 属性动态生成内联样式:
|
|
269
|
+
|
|
270
|
+
```javascript
|
|
271
|
+
computed: {
|
|
272
|
+
numStyle() {
|
|
273
|
+
return {
|
|
274
|
+
fontFamily: this.numFontFamily,
|
|
275
|
+
fontWeight: this.numFontWeight,
|
|
276
|
+
fontStyle: this.numFontStyle,
|
|
277
|
+
fontSize: typeof this.numFontSize === 'number'
|
|
278
|
+
? `${this.numFontSize}px`
|
|
279
|
+
: this.numFontSize,
|
|
280
|
+
color: this.numColor,
|
|
281
|
+
background: this.numBackground,
|
|
282
|
+
WebkitBackgroundClip: this.numBackgroundClip,
|
|
283
|
+
backgroundClip: this.numBackgroundClip,
|
|
284
|
+
textShadow: this.numTextShadow
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### 默认分隔线兜底
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
import { getLinePath } from './img/images'
|
|
294
|
+
|
|
295
|
+
computed: {
|
|
296
|
+
computedLineImage() {
|
|
297
|
+
if (this.lineImage) {
|
|
298
|
+
return this.lineImage
|
|
299
|
+
}
|
|
300
|
+
// 使用默认分隔线
|
|
301
|
+
return getLinePath()
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### 模板绑定
|
|
307
|
+
|
|
308
|
+
```vue
|
|
309
|
+
<template>
|
|
310
|
+
<div class="l-label-value">
|
|
311
|
+
<div class="l-label-value__content">
|
|
312
|
+
<div class="l-label-value__num" :style="numStyle">{{ num }}</div>
|
|
313
|
+
<div class="l-label-value__label" :style="labelStyle">{{ label }}</div>
|
|
314
|
+
</div>
|
|
315
|
+
<div v-if="showLine" class="l-label-value__separator">
|
|
316
|
+
<img
|
|
317
|
+
class="l-label-value__line"
|
|
318
|
+
:src="computedLineImage"
|
|
319
|
+
:style="lineStyle"
|
|
320
|
+
>
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
</template>
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## 注意事项
|
|
327
|
+
|
|
328
|
+
1. **分隔线可选**:`lineImage` 参数是可选的,未传入时使用默认分隔线;`showLine` 参数控制是否显示分隔线
|
|
329
|
+
2. **尺寸单位**:Number 类型会自动添加 `px` 单位,String 类型需自行包含单位
|
|
330
|
+
3. **默认分隔线**:组件内置默认分隔线图片,位于 `img/` 目录下
|
|
331
|
+
4. **性能优化**:内联样式通过 computed 缓存,避免重复计算
|
|
332
|
+
5. **BEM 命名**:使用 `l-label-value__content`、`l-label-value__separator`、`l-label-value__num`、`l-label-value__line` 等 BEM 命名规范
|
|
333
|
+
6. **渐变数值**:使用渐变色时,`numColor` 应设为 `transparent`,通过 `numBackground` 设置渐变色
|
|
334
|
+
7. **flex 布局**:组件使用 `inline-flex` 布局,内容区域和分隔线水平排列,垂直居中对齐
|
|
335
|
+
8. **分隔线居中**:分隔线通过 `l-label-value__separator` 容器包裹,使用 flex 布局确保分隔线在内容区域之间水平垂直居中,默认左右各 10px 内边距
|
|
336
|
+
9. **父容器布局**:建议在父容器中使用 `display: flex; align-items: center; justify-content: space-around;` 来实现多项数据的均匀分布
|
|
337
|
+
|
|
338
|
+
## 适用场景
|
|
339
|
+
|
|
340
|
+
- ✅ 文旅风险隐患监管数据展示
|
|
341
|
+
- ✅ 单项指标数值展示
|
|
342
|
+
- ✅ 多项数据横向排列展示(通过 v-for)
|
|
343
|
+
- ✅ 需要自定义分隔线和样式的场景
|
|
344
|
+
- ✅ 顶部指标展示模块
|
|
345
|
+
|
|
346
|
+
## 更新日志
|
|
347
|
+
|
|
348
|
+
- **v1.0.0** (2026-06-18)
|
|
349
|
+
- 创建 `l-label-value` 组件
|
|
350
|
+
- 参考 `l-stat-card` 封装结构进行参数化重构
|
|
351
|
+
- 所有样式配置项抽离为 Props 参数
|
|
352
|
+
- 添加详细的字段注释说明
|
|
353
|
+
- 添加默认分隔线图片支持
|
|
354
|
+
- 支持数值、标签、分隔线等所有样式自定义
|
|
355
|
+
- 使用内联样式实现(类似 Element UI)
|
|
356
|
+
- 支持通过 `showLine` 参数控制分隔线显示
|
|
357
|
+
|
|
358
|
+
> AI生成
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLabelValue 组件图片资源映射
|
|
3
|
+
* 提供默认分隔线图片的导出函数
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// 预加载所有图片资源
|
|
7
|
+
const images = {
|
|
8
|
+
line: require('./l-label-value_line.png')
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 获取默认分隔线图片路径
|
|
13
|
+
* @returns {string} 分隔线图片路径
|
|
14
|
+
*/
|
|
15
|
+
export function getLinePath() {
|
|
16
|
+
return images.line
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default images
|
|
Binary file
|