@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,249 @@
|
|
|
1
|
+
const interfaceObj = {
|
|
2
|
+
// ========== 基础数据 ==========
|
|
3
|
+
// 数据列表:每项包含 num(数值)和 label(标签文字)
|
|
4
|
+
dataList: {
|
|
5
|
+
type: Array,
|
|
6
|
+
default: () => []
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
// ========== 容器相关 ==========
|
|
10
|
+
// 容器显示方式:flex、block 等
|
|
11
|
+
containerDisplay: {
|
|
12
|
+
type: String,
|
|
13
|
+
default: 'flex'
|
|
14
|
+
},
|
|
15
|
+
// 容器对齐方式:space-between、center、space-around 等
|
|
16
|
+
containerJustifyContent: {
|
|
17
|
+
type: String,
|
|
18
|
+
default: 'space-between'
|
|
19
|
+
},
|
|
20
|
+
// 容器宽度
|
|
21
|
+
containerWidth: {
|
|
22
|
+
type: [String, Number],
|
|
23
|
+
default: '100%'
|
|
24
|
+
},
|
|
25
|
+
// 容器高度
|
|
26
|
+
containerHeight: {
|
|
27
|
+
type: [String, Number],
|
|
28
|
+
default: '140px'
|
|
29
|
+
},
|
|
30
|
+
// 容器内边距
|
|
31
|
+
containerPadding: {
|
|
32
|
+
type: String,
|
|
33
|
+
default: '0 40px'
|
|
34
|
+
},
|
|
35
|
+
// 容器顶部外边距
|
|
36
|
+
containerMarginTop: {
|
|
37
|
+
type: [String, Number],
|
|
38
|
+
default: '40px'
|
|
39
|
+
},
|
|
40
|
+
// 容器指针事件:auto、none 等
|
|
41
|
+
containerPointerEvents: {
|
|
42
|
+
type: String,
|
|
43
|
+
default: 'auto'
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
// ========== 卡片通用样式 ==========
|
|
47
|
+
// 卡片高度
|
|
48
|
+
cardHeight: {
|
|
49
|
+
type: [String, Number],
|
|
50
|
+
default: '110px'
|
|
51
|
+
},
|
|
52
|
+
// 卡片显示方式
|
|
53
|
+
cardDisplay: {
|
|
54
|
+
type: String,
|
|
55
|
+
default: 'flex'
|
|
56
|
+
},
|
|
57
|
+
// 卡片主轴方向
|
|
58
|
+
cardFlexDirection: {
|
|
59
|
+
type: String,
|
|
60
|
+
default: 'column'
|
|
61
|
+
},
|
|
62
|
+
// 卡片交叉轴对齐
|
|
63
|
+
cardJustifyContent: {
|
|
64
|
+
type: String,
|
|
65
|
+
default: 'center'
|
|
66
|
+
},
|
|
67
|
+
// 卡片背景重复方式
|
|
68
|
+
cardBgRepeat: {
|
|
69
|
+
type: String,
|
|
70
|
+
default: 'no-repeat'
|
|
71
|
+
},
|
|
72
|
+
// 卡片背景位置
|
|
73
|
+
cardBgPosition: {
|
|
74
|
+
type: String,
|
|
75
|
+
default: 'center'
|
|
76
|
+
},
|
|
77
|
+
// 卡片背景尺寸
|
|
78
|
+
cardBgSize: {
|
|
79
|
+
type: String,
|
|
80
|
+
default: '100% 100%'
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
// ========== 卡片1(左侧)相关 ==========
|
|
84
|
+
// 卡片1定位方式
|
|
85
|
+
card1Position: {
|
|
86
|
+
type: String,
|
|
87
|
+
default: 'relative'
|
|
88
|
+
},
|
|
89
|
+
// 卡片1左侧偏移
|
|
90
|
+
card1Left: {
|
|
91
|
+
type: [String, Number],
|
|
92
|
+
default: '7px'
|
|
93
|
+
},
|
|
94
|
+
// 卡片1右侧内边距
|
|
95
|
+
card1PaddingRight: {
|
|
96
|
+
type: [String, Number],
|
|
97
|
+
default: '62px'
|
|
98
|
+
},
|
|
99
|
+
// 卡片1宽度
|
|
100
|
+
card1Width: {
|
|
101
|
+
type: [String, Number],
|
|
102
|
+
default: '288px'
|
|
103
|
+
},
|
|
104
|
+
// 卡片1文字对齐
|
|
105
|
+
card1TextAlign: {
|
|
106
|
+
type: String,
|
|
107
|
+
default: 'right'
|
|
108
|
+
},
|
|
109
|
+
// 卡片1背景图
|
|
110
|
+
card1BgImage: {
|
|
111
|
+
type: String,
|
|
112
|
+
default: ''
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
// ========== 卡片2(中间)相关 ==========
|
|
116
|
+
// 卡片2文字对齐
|
|
117
|
+
card2TextAlign: {
|
|
118
|
+
type: String,
|
|
119
|
+
default: 'center'
|
|
120
|
+
},
|
|
121
|
+
// 卡片2宽度
|
|
122
|
+
card2Width: {
|
|
123
|
+
type: [String, Number],
|
|
124
|
+
default: '267px'
|
|
125
|
+
},
|
|
126
|
+
// 卡片2背景图
|
|
127
|
+
card2BgImage: {
|
|
128
|
+
type: String,
|
|
129
|
+
default: ''
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
// ========== 卡片3(右侧)相关 ==========
|
|
133
|
+
// 卡片3文字对齐
|
|
134
|
+
card3TextAlign: {
|
|
135
|
+
type: String,
|
|
136
|
+
default: 'left'
|
|
137
|
+
},
|
|
138
|
+
// 卡片3定位方式
|
|
139
|
+
card3Position: {
|
|
140
|
+
type: String,
|
|
141
|
+
default: 'relative'
|
|
142
|
+
},
|
|
143
|
+
// 卡片3左侧内边距
|
|
144
|
+
card3PaddingLeft: {
|
|
145
|
+
type: [String, Number],
|
|
146
|
+
default: '62px'
|
|
147
|
+
},
|
|
148
|
+
// 卡片3左侧偏移
|
|
149
|
+
card3Left: {
|
|
150
|
+
type: [String, Number],
|
|
151
|
+
default: '-7px'
|
|
152
|
+
},
|
|
153
|
+
// 卡片3宽度
|
|
154
|
+
card3Width: {
|
|
155
|
+
type: [String, Number],
|
|
156
|
+
default: '288px'
|
|
157
|
+
},
|
|
158
|
+
// 卡片3背景图
|
|
159
|
+
card3BgImage: {
|
|
160
|
+
type: String,
|
|
161
|
+
default: ''
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
// ========== 数值相关 ==========
|
|
165
|
+
// 数值字体
|
|
166
|
+
numFontFamily: {
|
|
167
|
+
type: String,
|
|
168
|
+
default: 'DINAlternate, DIN Alternate, YouSheBiaoTiHei, sans-serif'
|
|
169
|
+
},
|
|
170
|
+
// 数值字重
|
|
171
|
+
numFontWeight: {
|
|
172
|
+
type: [String, Number],
|
|
173
|
+
default: 'bold'
|
|
174
|
+
},
|
|
175
|
+
// 数值字体样式
|
|
176
|
+
numFontStyle: {
|
|
177
|
+
type: String,
|
|
178
|
+
default: 'italic'
|
|
179
|
+
},
|
|
180
|
+
// 数值字号
|
|
181
|
+
numFontSize: {
|
|
182
|
+
type: [String, Number],
|
|
183
|
+
default: '44px'
|
|
184
|
+
},
|
|
185
|
+
// 数值颜色
|
|
186
|
+
numColor: {
|
|
187
|
+
type: String,
|
|
188
|
+
default: '#ffffff'
|
|
189
|
+
},
|
|
190
|
+
// 数值背景渐变色
|
|
191
|
+
numBackground: {
|
|
192
|
+
type: String,
|
|
193
|
+
default: 'linear-gradient(180deg, #ffffff 0%, #4aefa0 100%)'
|
|
194
|
+
},
|
|
195
|
+
// 数值背景裁剪
|
|
196
|
+
numBackgroundClip: {
|
|
197
|
+
type: String,
|
|
198
|
+
default: 'text'
|
|
199
|
+
},
|
|
200
|
+
// 数值文字阴影
|
|
201
|
+
numTextShadow: {
|
|
202
|
+
type: String,
|
|
203
|
+
default: '0px 2px 6px rgba(74, 239, 160, 0.5)'
|
|
204
|
+
},
|
|
205
|
+
// 数值行高
|
|
206
|
+
numLineHeight: {
|
|
207
|
+
type: [String, Number],
|
|
208
|
+
default: 1
|
|
209
|
+
},
|
|
210
|
+
// 数值底部边距
|
|
211
|
+
numMarginBottom: {
|
|
212
|
+
type: [String, Number],
|
|
213
|
+
default: '10px'
|
|
214
|
+
},
|
|
215
|
+
// 数值右侧内边距
|
|
216
|
+
numPaddingRight: {
|
|
217
|
+
type: [String, Number],
|
|
218
|
+
default: '5px'
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
// ========== 标签相关 ==========
|
|
222
|
+
// 标签字体
|
|
223
|
+
labelFontFamily: {
|
|
224
|
+
type: String,
|
|
225
|
+
default: 'PingFangSC, PingFang SC'
|
|
226
|
+
},
|
|
227
|
+
// 标签字重
|
|
228
|
+
labelFontWeight: {
|
|
229
|
+
type: [String, Number],
|
|
230
|
+
default: 500
|
|
231
|
+
},
|
|
232
|
+
// 标签字号
|
|
233
|
+
labelFontSize: {
|
|
234
|
+
type: [String, Number],
|
|
235
|
+
default: '20px'
|
|
236
|
+
},
|
|
237
|
+
// 标签颜色
|
|
238
|
+
labelColor: {
|
|
239
|
+
type: String,
|
|
240
|
+
default: '#ffffff'
|
|
241
|
+
},
|
|
242
|
+
// 标签行高
|
|
243
|
+
labelLineHeight: {
|
|
244
|
+
type: [String, Number],
|
|
245
|
+
default: 1
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export default interfaceObj
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
---
|
|
2
|
+
AIGC:
|
|
3
|
+
ContentProducer: '001191110102MAD55U9H0F10002'
|
|
4
|
+
ContentPropagator: '001191110102MAD55U9H0F10002'
|
|
5
|
+
Label: '1'
|
|
6
|
+
ProduceID: 'af26224c-8a9c-4879-b506-af9043b09f85'
|
|
7
|
+
PropagateID: 'af26224c-8a9c-4879-b506-af9043b09f85'
|
|
8
|
+
ReservedCode1: '8f83ed90-2b60-43b2-a6cb-c86120136791'
|
|
9
|
+
ReservedCode2: '8f83ed90-2b60-43b2-a6cb-c86120136791'
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# LDataRing 组件说明
|
|
13
|
+
|
|
14
|
+
## 概述
|
|
15
|
+
|
|
16
|
+
`LDataRing` 是一个参数化驱动的单个数据环形展示组件,采用类似 Element UI 的封装方式。所有样式(背景图、数值大小/颜色、标签样式等)均通过 props 参数动态控制。
|
|
17
|
+
|
|
18
|
+
## 核心特性
|
|
19
|
+
|
|
20
|
+
- ✅ **Props 驱动**:所有样式通过 props 参数控制,类似 Element UI
|
|
21
|
+
- ✅ **默认背景图**:未传入背景图时自动使用组件内置默认背景图
|
|
22
|
+
- ✅ **高度灵活**:支持自定义背景图尺寸、数值样式、标签样式等
|
|
23
|
+
- ✅ **类型安全**:支持 String 和 Number 类型的尺寸参数
|
|
24
|
+
- ✅ **单一数据项**:每个组件实例展示单个数据项,支持灵活布局
|
|
25
|
+
|
|
26
|
+
## 文件结构
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
l-data-ring/
|
|
30
|
+
├── img/
|
|
31
|
+
│ ├── images.js # 图片映射文件
|
|
32
|
+
│ └── l-data-ring_bg.png # 默认背景图
|
|
33
|
+
├── interface/
|
|
34
|
+
│ └── index.js # Props 定义(20+ 个参数)
|
|
35
|
+
├── index.vue # 主组件(内联样式驱动)
|
|
36
|
+
└── README.md # 组件说明文档
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Props 参数
|
|
40
|
+
|
|
41
|
+
### 基础数据
|
|
42
|
+
|
|
43
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
44
|
+
|--------|------|--------|------|
|
|
45
|
+
| `num` | String/Number | `0` | 显示的数值 |
|
|
46
|
+
| `label` | String | `''` | 数值下方的标签文字 |
|
|
47
|
+
|
|
48
|
+
### 背景图相关
|
|
49
|
+
|
|
50
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
51
|
+
|--------|------|--------|------|
|
|
52
|
+
| `bgImage` | String | `''` | 背景图图片URL(留空则使用默认背景图) |
|
|
53
|
+
| `bgWidth` | String/Number | `'88px'` | 背景图宽度 |
|
|
54
|
+
| `bgHeight` | String/Number | `'45px'` | 背景图高度 |
|
|
55
|
+
| `bgSize` | String | `'100% 100%'` | 背景图尺寸(缩放方式) |
|
|
56
|
+
| `bgTop` | String/Number | `'-15px'` | 背景图顶部偏移 |
|
|
57
|
+
| `bgMarginBottom` | String/Number | `'6px'` | 背景图底部边距 |
|
|
58
|
+
|
|
59
|
+
### 数值相关
|
|
60
|
+
|
|
61
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
62
|
+
|--------|------|--------|------|
|
|
63
|
+
| `numFontFamily` | String | `'DINAlternate, DIN Alternate, sans-serif'` | 数值字体 |
|
|
64
|
+
| `numFontWeight` | String/Number | `'bold'` | 数值字重 |
|
|
65
|
+
| `numFontSize` | String/Number | `'26px'` | 数值字号 |
|
|
66
|
+
| `numColor` | String | `'#4aefa0'` | 数值颜色 |
|
|
67
|
+
| `numTextShadow` | String | `'0 0 8px rgba(74, 239, 160, 0.6)'` | 数值文字阴影 |
|
|
68
|
+
| `numTop` | String/Number | `'-15px'` | 数值顶部偏移 |
|
|
69
|
+
| `numMarginBottom` | String/Number | `'4px'` | 数值底部边距 |
|
|
70
|
+
| `numLineHeight` | String/Number | `1` | 数值行高 |
|
|
71
|
+
| `numFontStyle` | String | `'italic'` | 数值字体样式 |
|
|
72
|
+
|
|
73
|
+
### 标签相关
|
|
74
|
+
|
|
75
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
76
|
+
|--------|------|--------|------|
|
|
77
|
+
| `labelFontFamily` | String | `'PingFangSC, PingFang SC'` | 标签字体 |
|
|
78
|
+
| `labelFontWeight` | String/Number | `400` | 标签字重 |
|
|
79
|
+
| `labelFontSize` | String/Number | `'16px'` | 标签字号 |
|
|
80
|
+
| `labelColor` | String | `'#A3C2CC'` | 标签颜色 |
|
|
81
|
+
|
|
82
|
+
## 使用方式
|
|
83
|
+
|
|
84
|
+
### 基本使用(单项展示)
|
|
85
|
+
|
|
86
|
+
```vue
|
|
87
|
+
<template>
|
|
88
|
+
<l-data-ring
|
|
89
|
+
:num="198"
|
|
90
|
+
label="活动声量话题数"
|
|
91
|
+
/>
|
|
92
|
+
</template>
|
|
93
|
+
|
|
94
|
+
<script>
|
|
95
|
+
import LDataRing from '@/components/moduleDataNew/l-data-ring/index.vue'
|
|
96
|
+
|
|
97
|
+
export default {
|
|
98
|
+
components: {
|
|
99
|
+
LDataRing
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
</script>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 多项数据展示(使用 v-for)
|
|
106
|
+
|
|
107
|
+
```vue
|
|
108
|
+
<template>
|
|
109
|
+
<div class="network-metrics">
|
|
110
|
+
<l-data-ring
|
|
111
|
+
v-for="(item, index) in networkList"
|
|
112
|
+
:key="index"
|
|
113
|
+
:num="item.num"
|
|
114
|
+
:label="item.label"
|
|
115
|
+
/>
|
|
116
|
+
</div>
|
|
117
|
+
</template>
|
|
118
|
+
|
|
119
|
+
<script>
|
|
120
|
+
import LDataRing from '@/components/moduleDataNew/l-data-ring/index.vue'
|
|
121
|
+
|
|
122
|
+
export default {
|
|
123
|
+
components: {
|
|
124
|
+
LDataRing
|
|
125
|
+
},
|
|
126
|
+
data() {
|
|
127
|
+
return {
|
|
128
|
+
networkList: [
|
|
129
|
+
{ num: 198, label: '活动声量话题数' },
|
|
130
|
+
{ num: 93.28, label: '活动地热度指数' }
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
</script>
|
|
136
|
+
|
|
137
|
+
<style scoped>
|
|
138
|
+
.network-metrics {
|
|
139
|
+
display: flex;
|
|
140
|
+
justify-content: space-around;
|
|
141
|
+
}
|
|
142
|
+
</style>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 自定义背景图
|
|
146
|
+
|
|
147
|
+
```vue
|
|
148
|
+
<template>
|
|
149
|
+
<l-data-ring
|
|
150
|
+
:num="198"
|
|
151
|
+
label="活动声量话题数"
|
|
152
|
+
:bgImage="require('@/assets/custom-bg.png')"
|
|
153
|
+
:bgWidth="100"
|
|
154
|
+
:bgHeight="50"
|
|
155
|
+
/>
|
|
156
|
+
</template>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 自定义数值和标签样式
|
|
160
|
+
|
|
161
|
+
```vue
|
|
162
|
+
<template>
|
|
163
|
+
<l-data-ring
|
|
164
|
+
:num="198"
|
|
165
|
+
label="活动声量话题数"
|
|
166
|
+
:numFontSize="30"
|
|
167
|
+
numColor="#FF6B6B"
|
|
168
|
+
:numTextShadow="'0 0 10px rgba(255, 107, 107, 0.8)'"
|
|
169
|
+
:labelFontSize="14"
|
|
170
|
+
labelColor="#FFFFFF"
|
|
171
|
+
/>
|
|
172
|
+
</template>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### 完整自定义
|
|
176
|
+
|
|
177
|
+
```vue
|
|
178
|
+
<template>
|
|
179
|
+
<l-data-ring
|
|
180
|
+
:num="198"
|
|
181
|
+
label="活动声量话题数"
|
|
182
|
+
:bgWidth="100"
|
|
183
|
+
:bgHeight="55"
|
|
184
|
+
:bgTop="-20"
|
|
185
|
+
:bgMarginBottom="8"
|
|
186
|
+
:numFontSize="28"
|
|
187
|
+
numColor="#4CE27E"
|
|
188
|
+
:numTextShadow="'0 0 12px rgba(76, 226, 126, 0.7)'"
|
|
189
|
+
:numTop="-18"
|
|
190
|
+
:numMarginBottom="6"
|
|
191
|
+
:labelFontSize="14"
|
|
192
|
+
labelColor="#E8EEF4"
|
|
193
|
+
/>
|
|
194
|
+
</template>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## 数据结构
|
|
198
|
+
|
|
199
|
+
### networkList 格式(用于 v-for 循环)
|
|
200
|
+
|
|
201
|
+
```javascript
|
|
202
|
+
[
|
|
203
|
+
{ num: 198, label: '活动声量话题数' },
|
|
204
|
+
{ num: 93.28, label: '活动地热度指数' }
|
|
205
|
+
]
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
- `num`: 数值(支持数字或字符串)
|
|
209
|
+
- `label`: 标签文字
|
|
210
|
+
|
|
211
|
+
## 技术实现
|
|
212
|
+
|
|
213
|
+
### 内联样式生成
|
|
214
|
+
|
|
215
|
+
组件通过 computed 属性动态生成内联样式:
|
|
216
|
+
|
|
217
|
+
```javascript
|
|
218
|
+
computed: {
|
|
219
|
+
numStyle() {
|
|
220
|
+
return {
|
|
221
|
+
fontFamily: this.numFontFamily,
|
|
222
|
+
fontWeight: this.numFontWeight,
|
|
223
|
+
fontSize: typeof this.numFontSize === 'number'
|
|
224
|
+
? `${this.numFontSize}px`
|
|
225
|
+
: this.numFontSize,
|
|
226
|
+
color: this.numColor,
|
|
227
|
+
textShadow: this.numTextShadow,
|
|
228
|
+
top: typeof this.numTop === 'number'
|
|
229
|
+
? `${this.numTop}px`
|
|
230
|
+
: this.numTop
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 默认背景图兜底
|
|
237
|
+
|
|
238
|
+
```javascript
|
|
239
|
+
computed: {
|
|
240
|
+
computedBgImage() {
|
|
241
|
+
if (this.bgImage) {
|
|
242
|
+
return this.bgImage
|
|
243
|
+
}
|
|
244
|
+
// 使用默认背景图
|
|
245
|
+
return getBgPath()
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### 模板绑定
|
|
251
|
+
|
|
252
|
+
```vue
|
|
253
|
+
<template>
|
|
254
|
+
<div class="l-data-ring">
|
|
255
|
+
<div class="l-data-ring__num" :style="numStyle">{{ num }}</div>
|
|
256
|
+
<div class="l-data-ring__bg" :style="bgStyle"></div>
|
|
257
|
+
<div class="l-data-ring__label" :style="labelStyle">{{ label }}</div>
|
|
258
|
+
</div>
|
|
259
|
+
</template>
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## 注意事项
|
|
263
|
+
|
|
264
|
+
1. **背景图可选**:`bgImage` 参数是可选的,未传入时使用默认背景图
|
|
265
|
+
2. **尺寸单位**:Number 类型会自动添加 `px` 单位,String 类型需自行包含单位
|
|
266
|
+
3. **默认背景图**:组件内置默认背景图,位于 `img/` 目录下
|
|
267
|
+
4. **性能优化**:内联样式通过 computed 缓存,避免重复计算
|
|
268
|
+
5. **BEM 命名**:使用 `l-data-ring__num`、`l-data-ring__bg`、`l-data-ring__label` 等 BEM 命名规范
|
|
269
|
+
6. **单项展示**:本组件为单个数据项展示,多项数据需在外层使用 v-for 循环
|
|
270
|
+
7. **灵活布局**:外层容器可自由设置布局方式(flex、grid 等)
|
|
271
|
+
|
|
272
|
+
## 适用场景
|
|
273
|
+
|
|
274
|
+
- ✅ 网络综合分析数据展示
|
|
275
|
+
- ✅ 活动声量/热度指标展示
|
|
276
|
+
- ✅ 单个数据环形展示
|
|
277
|
+
- ✅ 需要自定义背景图和样式的场景
|
|
278
|
+
- ✅ 多项指标并排对比展示(通过 v-for)
|
|
279
|
+
|
|
280
|
+
## 更新日志
|
|
281
|
+
|
|
282
|
+
- **v1.0.0** (2026-06-18)
|
|
283
|
+
- 从 `moduleData_9` 重命名为 `l-data-ring`
|
|
284
|
+
- 参考 `l-stat-card` 封装结构进行参数化重构
|
|
285
|
+
- 改为单个数据项展示(不再使用 dataList 数组)
|
|
286
|
+
- 所有样式配置项抽离为 Props 参数
|
|
287
|
+
- 添加详细的字段注释说明
|
|
288
|
+
- 添加默认背景图支持
|
|
289
|
+
- 支持背景图、数值、标签等样式自定义
|
|
290
|
+
- 使用内联样式实现(类似 Element UI)
|
|
291
|
+
|
|
292
|
+
> AI生成
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDataRing 组件图片资源映射
|
|
3
|
+
*
|
|
4
|
+
* 图片命名规范:
|
|
5
|
+
* - l-data-ring_bg.png:背景图
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const images = {
|
|
9
|
+
// 背景图
|
|
10
|
+
bg: require('./l-data-ring_bg.png')
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 获取背景图路径
|
|
15
|
+
* @returns {String} 背景图路径
|
|
16
|
+
*/
|
|
17
|
+
export function getBgPath() {
|
|
18
|
+
return images.bg
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default images
|
|
Binary file
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="l-data-ring">
|
|
3
|
+
<div class="l-data-ring__num" :style="numStyle">{{ num }}</div>
|
|
4
|
+
<div class="l-data-ring__bg" :style="bgStyle"></div>
|
|
5
|
+
<div class="l-data-ring__label" :style="labelStyle">{{ label }}</div>
|
|
6
|
+
</div>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<script>
|
|
10
|
+
import interfaceObj from './interface/index'
|
|
11
|
+
import { getBgPath } from './img/images'
|
|
12
|
+
|
|
13
|
+
export default {
|
|
14
|
+
name: 'LDataRing',
|
|
15
|
+
props: interfaceObj,
|
|
16
|
+
components: {},
|
|
17
|
+
data() {
|
|
18
|
+
return {}
|
|
19
|
+
},
|
|
20
|
+
computed: {
|
|
21
|
+
// 背景图(外部传入优先,否则使用默认)
|
|
22
|
+
computedBgImage() {
|
|
23
|
+
if (this.bgImage) {
|
|
24
|
+
return this.bgImage
|
|
25
|
+
}
|
|
26
|
+
// 使用默认背景图
|
|
27
|
+
return getBgPath()
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
// 背景图容器样式
|
|
31
|
+
bgStyle() {
|
|
32
|
+
return {
|
|
33
|
+
width: typeof this.bgWidth === 'number' ? `${this.bgWidth}px` : this.bgWidth,
|
|
34
|
+
height: typeof this.bgHeight === 'number' ? `${this.bgHeight}px` : this.bgHeight,
|
|
35
|
+
top: typeof this.bgTop === 'number' ? `${this.bgTop}px` : this.bgTop,
|
|
36
|
+
marginBottom: typeof this.bgMarginBottom === 'number' ? `${this.bgMarginBottom}px` : this.bgMarginBottom,
|
|
37
|
+
background: this.computedBgImage ? `url(${this.computedBgImage}) no-repeat center / ${this.bgSize}` : ''
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
// 数值样式
|
|
42
|
+
numStyle() {
|
|
43
|
+
return {
|
|
44
|
+
fontFamily: this.numFontFamily,
|
|
45
|
+
fontWeight: this.numFontWeight,
|
|
46
|
+
fontSize: typeof this.numFontSize === 'number' ? `${this.numFontSize}px` : this.numFontSize,
|
|
47
|
+
color: this.numColor,
|
|
48
|
+
textShadow: this.numTextShadow,
|
|
49
|
+
top: typeof this.numTop === 'number' ? `${this.numTop}px` : this.numTop,
|
|
50
|
+
marginBottom: typeof this.numMarginBottom === 'number' ? `${this.numMarginBottom}px` : this.numMarginBottom,
|
|
51
|
+
lineHeight: typeof this.numLineHeight === 'number' ? this.numLineHeight : this.numLineHeight,
|
|
52
|
+
fontStyle: this.numFontStyle
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
// 标签样式
|
|
57
|
+
labelStyle() {
|
|
58
|
+
return {
|
|
59
|
+
fontFamily: this.labelFontFamily,
|
|
60
|
+
fontWeight: this.labelFontWeight,
|
|
61
|
+
fontSize: typeof this.labelFontSize === 'number' ? `${this.labelFontSize}px` : this.labelFontSize,
|
|
62
|
+
color: this.labelColor
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
watch: {},
|
|
67
|
+
mounted() {},
|
|
68
|
+
created() {},
|
|
69
|
+
methods: {}
|
|
70
|
+
}
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<style lang="scss" scoped>
|
|
74
|
+
.l-data-ring {
|
|
75
|
+
display: flex;
|
|
76
|
+
flex-direction: column;
|
|
77
|
+
align-items: center;
|
|
78
|
+
position: relative;
|
|
79
|
+
|
|
80
|
+
&__num {
|
|
81
|
+
position: relative;
|
|
82
|
+
line-height: 1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
&__bg {
|
|
86
|
+
position: absolute;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
&__label {
|
|
90
|
+
// 字体样式通过内联样式控制
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
</style>
|