@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.
Files changed (75) hide show
  1. package/README.md +86 -0
  2. package/package.json +34 -0
  3. package/src/index.js +60 -0
  4. package/src/l-bar-chart/README.md +302 -0
  5. package/src/l-bar-chart/index.vue +405 -0
  6. package/src/l-bar-chart/interface/index.js +210 -0
  7. package/src/l-data-panel/README.md +331 -0
  8. package/src/l-data-panel/img/images.js +47 -0
  9. package/src/l-data-panel/img/l-data-panel_bg_1.png +0 -0
  10. package/src/l-data-panel/img/l-data-panel_bg_2.png +0 -0
  11. package/src/l-data-panel/img/l-data-panel_bg_3.png +0 -0
  12. package/src/l-data-panel/index.vue +150 -0
  13. package/src/l-data-panel/interface/index.js +249 -0
  14. package/src/l-data-ring/README.md +292 -0
  15. package/src/l-data-ring/img/images.js +21 -0
  16. package/src/l-data-ring/img/l-data-ring_bg.png +0 -0
  17. package/src/l-data-ring/index.vue +93 -0
  18. package/src/l-data-ring/interface/index.js +116 -0
  19. package/src/l-date-picker/README.md +276 -0
  20. package/src/l-date-picker/index.vue +185 -0
  21. package/src/l-date-picker/interface/index.js +128 -0
  22. package/src/l-icon-label/README.md +356 -0
  23. package/src/l-icon-label/img/images.js +28 -0
  24. package/src/l-icon-label/img/l-icon-label_bg.png +0 -0
  25. package/src/l-icon-label/img/l-icon-label_icon.png +0 -0
  26. package/src/l-icon-label/index.vue +162 -0
  27. package/src/l-icon-label/interface/index.js +234 -0
  28. package/src/l-label-value/README.md +358 -0
  29. package/src/l-label-value/img/images.js +19 -0
  30. package/src/l-label-value/img/l-label-value_line.png +0 -0
  31. package/src/l-label-value/index.vue +132 -0
  32. package/src/l-label-value/interface/index.js +116 -0
  33. package/src/l-metric-tile/README.md +391 -0
  34. package/src/l-metric-tile/img/images.js +19 -0
  35. package/src/l-metric-tile/img/l-metric-tile_bg_1.png +0 -0
  36. package/src/l-metric-tile/index.vue +138 -0
  37. package/src/l-metric-tile/interface/index.js +241 -0
  38. package/src/l-module-box/README.md +289 -0
  39. package/src/l-module-box/img/images.js +28 -0
  40. package/src/l-module-box/img/l-module-box_bg.png +0 -0
  41. package/src/l-module-box/img/l-module-box_icon.png +0 -0
  42. package/src/l-module-box/index.vue +125 -0
  43. package/src/l-module-box/interface/index.js +93 -0
  44. package/src/l-module-tag/README.md +243 -0
  45. package/src/l-module-tag/index.vue +137 -0
  46. package/src/l-module-tag/interface/index.js +91 -0
  47. package/src/l-rank-list/README.md +553 -0
  48. package/src/l-rank-list/img/images.js +34 -0
  49. package/src/l-rank-list/img/l-rank-list_icon_line.png +0 -0
  50. package/src/l-rank-list/img/l-rank-list_icon_rank_1.png +0 -0
  51. package/src/l-rank-list/img/l-rank-list_icon_rank_2.png +0 -0
  52. package/src/l-rank-list/img/l-rank-list_icon_rank_other.png +0 -0
  53. package/src/l-rank-list/index.vue +610 -0
  54. package/src/l-rank-list/interface/index.js +343 -0
  55. package/src/l-stat-card/README.md +309 -0
  56. package/src/l-stat-card/img/images.js +36 -0
  57. package/src/l-stat-card/img/img-bg.png +0 -0
  58. package/src/l-stat-card/img/l-stat-card_img_1.png +0 -0
  59. package/src/l-stat-card/index.vue +136 -0
  60. package/src/l-stat-card/interface/index.js +159 -0
  61. package/src/l-tabs/README.md +285 -0
  62. package/src/l-tabs/img/images.js +19 -0
  63. package/src/l-tabs/img/l-tabs_bg.png +0 -0
  64. package/src/l-tabs/index.vue +97 -0
  65. package/src/l-tabs/interface/index.js +115 -0
  66. package/src/l-trend-card/README.md +415 -0
  67. package/src/l-trend-card/img/images.js +41 -0
  68. package/src/l-trend-card/img/l-trend-card_bg.png +0 -0
  69. package/src/l-trend-card/img/l-trend-card_icon_1.png +0 -0
  70. package/src/l-trend-card/img/l-trend-card_icon_down.png +0 -0
  71. package/src/l-trend-card/img/l-trend-card_icon_up.png +0 -0
  72. package/src/l-trend-card/index.vue +181 -0
  73. package/src/l-trend-card/interface/index.js +243 -0
  74. package/src/utils/tooltip.js +30 -0
  75. package/src/utils/util.js +27 -0
@@ -0,0 +1,343 @@
1
+ const interfaceObj = {
2
+ // ========== 基础数据 ==========
3
+ // 布局类型:控制数值显示位置
4
+ // 'value-bottom'(默认):数值在进度条右侧(moduleData_3 风格)
5
+ // 'value-top':数值在标题右侧(moduleData_2 风格)
6
+ layoutType: {
7
+ type: String,
8
+ default: 'value-bottom'
9
+ },
10
+ // 数值单位:数值后面的单位文字(如:人、%、家等)
11
+ unit: {
12
+ type: String,
13
+ default: '人'
14
+ },
15
+ // 排行榜数据列表:每项包含 name(名称)和 value(数值)
16
+ dataList: {
17
+ type: Array,
18
+ default: () => {
19
+ return [
20
+ { name: '拉萨市', value: 832 },
21
+ { name: '拉萨市2', value: 732 },
22
+ { name: '拉萨市32', value: 732 }
23
+ ]
24
+ }
25
+ },
26
+ // 自动滚动触发阈值:当数据条数超过此值时触发自动滚动
27
+ // 例如:displayLimit=20,数据超过20条时自动滚动,20条及以下不滚动
28
+ displayLimit: {
29
+ type: Number,
30
+ default: 20
31
+ },
32
+ // 是否自动滚动:当数据超过显示限制时是否自动滚动
33
+ autoScroll: {
34
+ type: Boolean,
35
+ default: false
36
+ },
37
+ // 滚动速度:自动滚动时的速度(像素/秒)
38
+ scrollSpeed: {
39
+ type: Number,
40
+ default: 30
41
+ },
42
+
43
+ // ========== 容器相关 ==========
44
+ // 容器宽度:整个排行榜容器的宽度
45
+ containerWidth: {
46
+ type: String,
47
+ default: '100%'
48
+ },
49
+ // 容器高度:整个排行榜容器的高度
50
+ containerHeight: {
51
+ type: String,
52
+ default: '100%'
53
+ },
54
+ // 容器左边距:容器整体的左侧偏移量
55
+ containerLeft: {
56
+ type: [String, Number],
57
+ default: '-5px'
58
+ },
59
+ // 列表项宽度:单个排行榜项的宽度
60
+ listItemWidth: {
61
+ type: String,
62
+ default: '98%'
63
+ },
64
+ // 列表项间距:排名图标与右侧内容之间的间距
65
+ listItemGap: {
66
+ type: [String, Number],
67
+ default: 8
68
+ },
69
+
70
+ // ========== 排名图标相关 ==========
71
+ // 排名图标宽度:排名图标的显示宽度
72
+ rankIconWidth: {
73
+ type: [String, Number],
74
+ default: '39px'
75
+ },
76
+ // 排名图标高度:排名图标的显示高度
77
+ rankIconHeight: {
78
+ type: [String, Number],
79
+ default: '37px'
80
+ },
81
+ // 排名图标字号:排名数字的字体大小
82
+ rankIconFontSize: {
83
+ type: [String, Number],
84
+ default: '12px'
85
+ },
86
+ // 排名图标字体:排名数字的字体族
87
+ rankIconFontFamily: {
88
+ type: String,
89
+ default: 'REEJI-PinboGB, REEJI-PinboGB'
90
+ },
91
+ // 排名图标字重:排名数字的字体粗细
92
+ rankIconFontWeight: {
93
+ type: [String, Number],
94
+ default: 'normal'
95
+ },
96
+ // 排名图标颜色:排名数字的颜色
97
+ rankIconColor: {
98
+ type: String,
99
+ default: '#FFFFFF'
100
+ },
101
+ // 排名图标1:第1名的排名图标URL,未传入时使用默认
102
+ rankIcon1: {
103
+ type: String,
104
+ default: ''
105
+ },
106
+ // 排名图标2:第2名的排名图标URL,未传入时使用默认
107
+ rankIcon2: {
108
+ type: String,
109
+ default: ''
110
+ },
111
+ // 排名图标其他:第3名及以后的排名图标URL,未传入时使用默认
112
+ rankIconOther: {
113
+ type: String,
114
+ default: ''
115
+ },
116
+
117
+ // ========== 标题相关 ==========
118
+ // 标题字体:标题文字的字体族
119
+ titleFontFamily: {
120
+ type: String,
121
+ default: 'PingFangSC, PingFang SC'
122
+ },
123
+ // 标题字重:标题文字的字体粗细
124
+ titleFontWeight: {
125
+ type: [String, Number],
126
+ default: 500
127
+ },
128
+ // 标题字号:标题文字的字体大小
129
+ titleFontSize: {
130
+ type: [String, Number],
131
+ default: '14px'
132
+ },
133
+ // 标题颜色:标题文字的颜色
134
+ titleColor: {
135
+ type: String,
136
+ default: '#E8EEF4'
137
+ },
138
+ // 标题下边距:标题与下方内容的间距(value-top 布局时生效)
139
+ titleMarginBottom: {
140
+ type: [String, Number],
141
+ default: '4px'
142
+ },
143
+
144
+ // ========== 进度条相关 ==========
145
+ // 进度条高度:进度条的显示高度
146
+ progressBarHeight: {
147
+ type: [String, Number],
148
+ default: '6px'
149
+ },
150
+ // 进度条区域宽度百分比:进度条区域占可用宽度的百分比
151
+ // 与 valueWidth 配合使用,两者之和应为 100%
152
+ // 默认值 80 表示进度条区域占 80%,数值区域占 20%
153
+ progressBarWidth: {
154
+ type: [String, Number],
155
+ default: 80
156
+ },
157
+ // 进度条圆角:进度条的圆角半径
158
+ progressBarBorderRadius: {
159
+ type: [String, Number],
160
+ default: '5px'
161
+ },
162
+ // 进度条默认背景:进度条未填充部分的背景颜色
163
+ progressBarBg: {
164
+ type: String,
165
+ default: 'rgba(85,219,209,0.3)'
166
+ },
167
+ // 进度条内阴影:进度条未填充部分的内阴影效果
168
+ progressBarBoxShadow: {
169
+ type: String,
170
+ default: 'inset 0px 0px 3px 1px rgba(255,255,255,0.15)'
171
+ },
172
+ // 进度条激活背景:进度条第3名及以后填充部分的背景颜色
173
+ progressBarActiveBg: {
174
+ type: String,
175
+ default: 'rgba(85,219,209,1)'
176
+ },
177
+ // 进度条第1名颜色:第1名进度条填充的颜色
178
+ rank1Color: {
179
+ type: String,
180
+ default: '#40FF8F'
181
+ },
182
+ // 进度条第2名颜色:第2名进度条填充的颜色
183
+ rank2Color: {
184
+ type: String,
185
+ default: '#FFD073'
186
+ },
187
+
188
+ // ========== 滑块图标相关 ==========
189
+ // 滑块图标宽度:进度条滑块的图标宽度
190
+ sliderIconWidth: {
191
+ type: [String, Number],
192
+ default: '15px'
193
+ },
194
+ // 滑块图标高度:进度条滑块的图标高度
195
+ sliderIconHeight: {
196
+ type: [String, Number],
197
+ default: '15px'
198
+ },
199
+ // 滑块图标上边距:滑块图标距离进度条顶部的偏移
200
+ sliderIconTop: {
201
+ type: [String, Number],
202
+ default: '-4px'
203
+ },
204
+ // 滑块图标:进度条滑块的图标URL,未传入时使用默认
205
+ sliderIcon: {
206
+ type: String,
207
+ default: ''
208
+ },
209
+ // 滑块左偏移百分比:滑块相对于进度条末端的向左偏移量
210
+ // 计算公式:left = (item.value / maxValue * 100) - sliderLeftOffset
211
+ // sliderLeftOffset = 滑块宽度的一半占进度条总长度的百分比
212
+ // 例如:滑块宽度 15px,容器宽度约 300px,则偏移 = 7.5 / 300 * 100 = 2.5%
213
+ // 默认值 1.5 表示滑块宽度的一半占进度条总长度的百分比
214
+ sliderLeftOffset: {
215
+ type: [String, Number],
216
+ default: 1.5
217
+ },
218
+
219
+ // ========== 数值相关 ==========
220
+ // 数值最小宽度:数值区域的最小宽度
221
+ valueMinWidth: {
222
+ type: [String, Number],
223
+ default: '20px'
224
+ },
225
+ // 数值区域宽度百分比:数值区域占可用宽度的百分比
226
+ // 与 progressBarWidth 配合使用,两者之和应为 100%
227
+ // 默认值 20 表示数值区域占 20%,进度条区域占 80%
228
+ valueWidth: {
229
+ type: [String, Number],
230
+ default: 20
231
+ },
232
+ // 数值字体:数值文字的字体族
233
+ valueFontFamily: {
234
+ type: String,
235
+ default: 'DIN, DIN'
236
+ },
237
+ // 数值字重:数值文字的字体粗细
238
+ valueFontWeight: {
239
+ type: [String, Number],
240
+ default: 'normal'
241
+ },
242
+ // 数值字号:数值文字的字体大小
243
+ valueFontSize: {
244
+ type: [String, Number],
245
+ default: '14px'
246
+ },
247
+ // 数值颜色:数值文字的颜色(使用渐变时设为transparent)
248
+ valueColor: {
249
+ type: String,
250
+ default: 'transparent'
251
+ },
252
+ // 数值渐变背景:数值文字的渐变背景
253
+ valueBackground: {
254
+ type: String,
255
+ default: 'linear-gradient(270deg, #4CE27E 0%, #FFFFFF 100%)'
256
+ },
257
+ // 数值背景裁剪:背景裁剪方式(text表示只在文字上显示背景)
258
+ valueBackgroundClip: {
259
+ type: String,
260
+ default: 'text'
261
+ },
262
+ // 数值行高:数值文字的行高
263
+ valueLineHeight: {
264
+ type: [String, Number],
265
+ default: '12px'
266
+ },
267
+ // 数值字体样式:数值文字的样式(italic为斜体)
268
+ valueFontStyle: {
269
+ type: String,
270
+ default: 'italic'
271
+ },
272
+ // 数值阴影:数值文字的阴影效果
273
+ valueTextShadow: {
274
+ type: String,
275
+ default: '0px 2px 3px rgba(22, 72, 56, 0.6)'
276
+ },
277
+ // 数值对齐方式:数值文字的水平对齐
278
+ valueTextAlign: {
279
+ type: String,
280
+ default: 'left'
281
+ },
282
+
283
+ // ========== 单位相关 ==========
284
+ // 单位字体:单位文字的字体族
285
+ unitFontFamily: {
286
+ type: String,
287
+ default: 'SourceHanSansCN, SourceHanSansCN'
288
+ },
289
+ // 单位字重:单位文字的字体粗细
290
+ unitFontWeight: {
291
+ type: [String, Number],
292
+ default: 400
293
+ },
294
+ // 单位字号:单位文字的字体大小
295
+ unitFontSize: {
296
+ type: [String, Number],
297
+ default: '12px'
298
+ },
299
+ // 单位左边距:单位与数值之间的间距
300
+ unitMarginLeft: {
301
+ type: [String, Number],
302
+ default: '2px'
303
+ },
304
+
305
+ // ========== 顶部数值相关(value-top 布局专用) ==========
306
+ // 顶部数值字号:value-top 布局中数值的字体大小
307
+ topValueFontSize: {
308
+ type: [String, Number],
309
+ default: '16px'
310
+ },
311
+ // 顶部数值颜色:value-top 布局中数值的颜色(使用渐变时设为transparent)
312
+ topValueColor: {
313
+ type: String,
314
+ default: 'transparent'
315
+ },
316
+ // 顶部数值渐变背景:value-top 布局中数值的渐变背景
317
+ topValueBackground: {
318
+ type: String,
319
+ default: 'linear-gradient(0deg, #4CE27E 0%, #FFFFFF 100%)'
320
+ },
321
+ // 顶部数值背景裁剪:背景裁剪方式
322
+ topValueBackgroundClip: {
323
+ type: String,
324
+ default: 'text'
325
+ },
326
+ // 顶部数值行高:value-top 布局中数值的行高
327
+ topValueLineHeight: {
328
+ type: [String, Number],
329
+ default: '1'
330
+ },
331
+ // 顶部数值字体样式:value-top 布局中数值的样式
332
+ topValueFontStyle: {
333
+ type: String,
334
+ default: 'normal'
335
+ },
336
+ // 顶部数值阴影:value-top 布局中数值的阴影效果
337
+ topValueTextShadow: {
338
+ type: String,
339
+ default: 'none'
340
+ }
341
+ }
342
+
343
+ export default interfaceObj
@@ -0,0 +1,309 @@
1
+ ---
2
+ AIGC:
3
+ ContentProducer: '001191110102MAD55U9H0F10002'
4
+ ContentPropagator: '001191110102MAD55U9H0F10002'
5
+ Label: '1'
6
+ ProduceID: 'a714df1f-f138-45ba-bb10-a6112fd7313f'
7
+ PropagateID: 'a714df1f-f138-45ba-bb10-a6112fd7313f'
8
+ ReservedCode1: 'fd849c5b-2105-47a7-8864-77f66fb74206'
9
+ ReservedCode2: 'fd849c5b-2105-47a7-8864-77f66fb74206'
10
+ ---
11
+
12
+ # LStatCard 组件说明
13
+
14
+ ## 概述
15
+
16
+ `LStatCard` 是一个参数化驱动的统计卡片组件,采用类似 Element UI 的封装方式。所有样式(背景图、图标尺寸、文字大小、颜色等)均通过 props 参数动态控制,不再依赖 CSS 样式文件。
17
+
18
+ ## 核心特性
19
+
20
+ - ✅ **Props 驱动**:所有样式通过 props 参数控制,类似 Element UI
21
+ - ✅ **内联样式**:使用 computed 属性动态生成内联样式
22
+ - ✅ **高度灵活**:支持自定义背景图、图标尺寸、字体、颜色等
23
+ - ✅ **默认图片**:未传入图片时自动使用组件内置默认图片
24
+ - ✅ **类型安全**:支持 String 和 Number 类型的尺寸参数
25
+
26
+ ## 设计原则
27
+
28
+ ### Element UI 风格封装
29
+
30
+ ```vue
31
+ <!-- 类似 Element UI 的使用方式 -->
32
+ <l-stat-card
33
+ title="接待游客"
34
+ :data="12345"
35
+ unit="人次"
36
+ :num-font-size="24"
37
+ num-color="#4CE27E"
38
+ />
39
+ ```
40
+
41
+ ## 文件结构
42
+
43
+ ```
44
+ l-stat-card/
45
+ ├── img/ # 默认图片资源
46
+ │ ├── images.js # 图片映射文件
47
+ │ ├── img-bg.png # 默认背景图
48
+ │ └── l-stat-card_img_1.png # 默认图标
49
+ ├── interface/
50
+ │ └── index.js # Props 定义
51
+ ├── index.vue # 主组件(内联样式驱动)
52
+ └── README.md # 组件说明文档
53
+ ```
54
+
55
+ ## Props 参数
56
+
57
+ ### 基础参数
58
+
59
+ | 参数名 | 类型 | 默认值 | 必填 | 说明 |
60
+ |--------|------|--------|------|------|
61
+ | `title` | String | `'标题'` | 否 | 标题文本 |
62
+ | `data` | String/Number | `0` | 否 | 数据值 |
63
+ | `unit` | String | `''` | 否 | 单位 |
64
+ | `icon` | String | `''` | 否 | 图标图片 URL(可选,未传时使用默认) |
65
+ | `bgImage` | String | `''` | 否 | 背景图 URL(可选,未传时使用默认) |
66
+
67
+ ### 背景图参数
68
+
69
+ | 参数名 | 类型 | 默认值 | 说明 |
70
+ |--------|------|--------|------|
71
+ | `bgImage` | String | `''` | 背景图 URL(可选) |
72
+ | `bgWidth` | String/Number | `'60px'` | 背景图宽度 |
73
+ | `bgHeight` | String/Number | `'49px'` | 背景图高度 |
74
+ | `bgSize` | String | `'100% 100%'` | 背景图尺寸 |
75
+
76
+ ### 图标参数
77
+
78
+ | 参数名 | 类型 | 默认值 | 说明 |
79
+ |--------|------|--------|------|
80
+ | `iconWidth` | String/Number | `'32px'` | 图标宽度 |
81
+ | `iconHeight` | String/Number | `'32px'` | 图标高度 |
82
+ | `iconLeft` | String/Number | `'14px'` | 图标左边距 |
83
+ | `iconBottom` | String/Number | `'2px'` | 图标下边距 |
84
+
85
+ ### 标题参数
86
+
87
+ | 参数名 | 类型 | 默认值 | 说明 |
88
+ |--------|------|--------|------|
89
+ | `titleWidth` | String/Number | `'98px'` | 标题宽度 |
90
+ | `titleFontFamily` | String | `'PingFangSC, PingFang SC'` | 标题字体 |
91
+ | `titleFontWeight` | String/Number | `400` | 标题字重 |
92
+ | `titleFontSize` | String/Number | `'16px'` | 标题字号 |
93
+ | `titleColor` | String | `'#A3C2CC'` | 标题颜色 |
94
+
95
+ ### 数值参数
96
+
97
+ | 参数名 | 类型 | 默认值 | 说明 |
98
+ |--------|------|--------|------|
99
+ | `numFontFamily` | String | `'DIN, DIN'` | 数值字体 |
100
+ | `numFontWeight` | String/Number | `600` | 数值字重 |
101
+ | `numFontSize` | String/Number | `'22px'` | 数值字号 |
102
+ | `numColor` | String | `'transparent'` | 数值颜色 |
103
+ | `numBackground` | String | `'linear-gradient(270deg, #4CE27E 0%, #FFFFFF 100%)'` | 数值渐变背景 |
104
+ | `numBackgroundClip` | String | `'text'` | 背景裁剪方式 |
105
+ | `numMarginRight` | String/Number | `'3px'` | 数值右边距 |
106
+ | `numLineHeight` | String/Number | `1` | 数值行高 |
107
+
108
+ ### 单位参数
109
+
110
+ | 参数名 | 类型 | 默认值 | 说明 |
111
+ |--------|------|--------|------|
112
+ | `unitFontFamily` | String | `'SourceHanSansCN, SourceHanSansCN'` | 单位字体 |
113
+ | `unitFontWeight` | String/Number | `400` | 单位字重 |
114
+ | `unitFontSize` | String/Number | `'13px'` | 单位字号 |
115
+ | `unitColor` | String | `'rgba(255,255,255,0.67)'` | 单位颜色 |
116
+
117
+ ## 使用方式
118
+
119
+ ### 基本使用(使用默认样式)
120
+
121
+ ```vue
122
+ <template>
123
+ <l-stat-card
124
+ title="接待游客"
125
+ :data="12345"
126
+ unit="人次"
127
+ />
128
+ </template>
129
+
130
+ <script>
131
+ import LStatCard from '@/components/moduleDataNew/l-stat-card/index.vue'
132
+
133
+ export default {
134
+ components: {
135
+ LStatCard
136
+ }
137
+ }
138
+ </script>
139
+ ```
140
+
141
+ ### 自定义数值样式
142
+
143
+ ```vue
144
+ <template>
145
+ <l-stat-card
146
+ title="今日收入"
147
+ :data="9876.5"
148
+ unit="元"
149
+ :num-font-size="28"
150
+ num-color="#FF6B6B"
151
+ num-background="linear-gradient(270deg, #FF6B6B 0%, #FFE66D 100%)"
152
+ />
153
+ </template>
154
+ ```
155
+
156
+ ### 自定义背景图和图标
157
+
158
+ ```vue
159
+ <template>
160
+ <l-stat-card
161
+ title="停车场"
162
+ :data="128"
163
+ unit="个"
164
+ :icon="require('@/assets/parking-icon.png')"
165
+ bg-image="https://example.com/bg.png"
166
+ :bg-width="80"
167
+ :bg-height="60"
168
+ :icon-width="40"
169
+ :icon-height="40"
170
+ />
171
+ </template>
172
+ ```
173
+
174
+ ### 完整自定义
175
+
176
+ ```vue
177
+ <template>
178
+ <l-stat-card
179
+ title="客流指数"
180
+ :data="95.2"
181
+ :title-font-size="18"
182
+ title-color="#FFFFFF"
183
+ :num-font-size="32"
184
+ :num-font-weight="700"
185
+ num-color="transparent"
186
+ num-background="linear-gradient(90deg, #00F2FE 0%, #4FACFE 100%)"
187
+ :unit-font-size="14"
188
+ unit-color="rgba(255,255,255,0.8)"
189
+ />
190
+ </template>
191
+ ```
192
+
193
+ ### 循环渲染(推荐)
194
+
195
+ ```vue
196
+ <template>
197
+ <l-stat-card
198
+ v-for="(item, index) in list"
199
+ :key="index"
200
+ :title="item.title"
201
+ :data="item.data"
202
+ :unit="item.unit"
203
+ :icon="item.icon"
204
+ />
205
+ </template>
206
+
207
+ <script>
208
+ export default {
209
+ data() {
210
+ return {
211
+ list: [
212
+ {
213
+ title: '均衡指数',
214
+ data: 92.1,
215
+ icon: require('@/assets/index/icon-1.png')
216
+ },
217
+ {
218
+ title: '热度指数',
219
+ data: 95.20,
220
+ icon: require('@/assets/index/icon-2.png')
221
+ }
222
+ ]
223
+ }
224
+ }
225
+ }
226
+ </script>
227
+ ```
228
+
229
+ ## 尺寸参数说明
230
+
231
+ 所有尺寸参数均支持 String 和 Number 两种类型:
232
+
233
+ ```vue
234
+ <!-- String 类型(带单位) -->
235
+ <l-stat-card :num-font-size="'24px'" />
236
+
237
+ <!-- Number 类型(自动添加 px) -->
238
+ <l-stat-card :num-font-size="24" />
239
+ ```
240
+
241
+ ## 技术实现
242
+
243
+ ### 内联样式生成
244
+
245
+ 组件通过 computed 属性动态生成内联样式:
246
+
247
+ ```javascript
248
+ computed: {
249
+ numStyle() {
250
+ return {
251
+ fontFamily: this.numFontFamily,
252
+ fontWeight: this.numFontWeight,
253
+ fontSize: typeof this.numFontSize === 'number'
254
+ ? `${this.numFontSize}px`
255
+ : this.numFontSize,
256
+ color: this.numColor,
257
+ background: this.numBackground,
258
+ WebkitBackgroundClip: this.numBackgroundClip,
259
+ backgroundClip: this.numBackgroundClip
260
+ }
261
+ }
262
+ }
263
+ ```
264
+
265
+ ### 模板绑定
266
+
267
+ ```vue
268
+ <span class="l-stat-card__value-num" :style="numStyle">{{ data }}</span>
269
+ ```
270
+
271
+ ## 注意事项
272
+
273
+ 1. **图片可选**:icon 和 bgImage 都是可选参数,未传入时使用默认图片
274
+ 2. **渐变文字兼容**:使用了 `WebkitBackgroundClip` 和 `backgroundClip` 实现渐变文字效果
275
+ 3. **尺寸单位**:Number 类型会自动添加 `px` 单位,String 类型需自行包含单位
276
+ 4. **默认图片**:组件内置默认图片,位于 `img/` 目录下
277
+ 5. **性能优化**:内联样式通过 computed 缓存,避免重复计算
278
+
279
+ ## 适用场景
280
+
281
+ - ✅ 需要动态调整样式的统计卡片
282
+ - ✅ 不同页面使用不同主题的卡片
283
+ - ✅ 需要根据数据状态改变颜色/大小
284
+ - ✅ 类似 Element UI 的组件化开发方式
285
+
286
+ ## 更新日志
287
+
288
+ - **v2.2.0** (2026-06-10)
289
+ - 恢复内部默认图片支持(img/ 目录)
290
+ - icon 和 bgImage 改为可选参数
291
+ - 新增 computedIcon 和 computedBgImage 兜底逻辑
292
+ - 图片命名规范:l-stat-card_img_X.png
293
+ - 更新 README 文档
294
+
295
+ - **v2.1.0** (2026-05-18)
296
+ - 移除内部图片索引机制(imgIndex)
297
+ - 移除 css/ 和 img/ 目录
298
+ - 简化为纯外部图片传入(icon + bgImage)
299
+ - 移除 EXAMPLES.md 和 MIGRATION.md
300
+ - 精简 README 文档
301
+
302
+ - **v2.0.0** (2026-05-18)
303
+ - 重命名为 `l-stat-card`
304
+ - 移除 CSS 文件依赖,改为 props 驱动
305
+ - 新增 28 个样式控制参数
306
+ - 使用内联样式实现(类似 Element UI)
307
+ - 支持 String/Number 类型的尺寸参数
308
+
309
+ > AI生成
@@ -0,0 +1,36 @@
1
+ /**
2
+ * LStatCard 组件图片资源映射
3
+ *
4
+ * 图片命名规范:
5
+ * - img-bg.png:背景图
6
+ * - l-stat-card_img_1.png ~ l-stat-card_img_5.png:图标图片
7
+ */
8
+
9
+ const images = {
10
+ // 背景图
11
+ bg: require('./img-bg.png'),
12
+
13
+ // 图标图片(1-5)
14
+ icons: {
15
+ 1: require('./l-stat-card_img_1.png')
16
+ }
17
+ }
18
+
19
+ /**
20
+ * 获取图标图片路径
21
+ * @param {Number|String} index - 图标索引(1-5)
22
+ * @returns {String} 图片路径
23
+ */
24
+ export function getIconPath(index = 1) {
25
+ return images.icons[index] || images.icons[1]
26
+ }
27
+
28
+ /**
29
+ * 获取背景图路径
30
+ * @returns {String} 背景图路径
31
+ */
32
+ export function getBgPath() {
33
+ return images.bg
34
+ }
35
+
36
+ export default images
Binary file