@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,132 @@
1
+ <template>
2
+ <div class="l-label-value">
3
+ <div
4
+ v-for="(item, index) in dataList"
5
+ :key="`item-${index}`"
6
+ class="l-label-value__item"
7
+ :class="{ 'l-label-value__item--last': index === dataList.length - 1 }"
8
+ >
9
+ <div class="l-label-value__value" :style="numStyle">{{ item.num }}</div>
10
+ <div class="l-label-value__label" :style="labelStyle">{{ item.label }}</div>
11
+ <!-- 分隔线:除了最后一项,其他项右侧都显示分隔线 -->
12
+ <img
13
+ v-if="index < dataList.length - 1"
14
+ class="l-label-value__divider"
15
+ :src="computedLineImage"
16
+ :style="dividerStyle"
17
+ alt=""
18
+ >
19
+ </div>
20
+ </div>
21
+ </template>
22
+
23
+ <script>
24
+ import interfaceObj from './interface/index'
25
+ import { getLinePath } from './img/images'
26
+
27
+ export default {
28
+ name: 'LLabelValue',
29
+ props: interfaceObj,
30
+ components: {},
31
+ data() {
32
+ return {}
33
+ },
34
+ computed: {
35
+ // 分隔线图片(外部传入优先,否则使用默认)
36
+ computedLineImage() {
37
+ if (this.lineImage) {
38
+ return this.lineImage
39
+ }
40
+ // 使用默认分隔线
41
+ return getLinePath()
42
+ },
43
+
44
+ // 数值样式
45
+ numStyle() {
46
+ return {
47
+ fontFamily: this.valueFontFamily,
48
+ fontWeight: this.valueFontWeight,
49
+ fontStyle: this.valueFontStyle,
50
+ fontSize: typeof this.valueFontSize === 'number' ? `${this.valueFontSize}px` : this.valueFontSize,
51
+ lineHeight: typeof this.valueLineHeight === 'number' ? this.valueLineHeight : this.valueLineHeight,
52
+ color: this.valueColor,
53
+ background: this.valueBackground,
54
+ WebkitBackgroundClip: this.valueBackgroundClip,
55
+ backgroundClip: this.valueBackgroundClip,
56
+ textShadow: this.valueTextShadow,
57
+ marginBottom: typeof this.valueMarginBottom === 'number' ? `${this.valueMarginBottom}px` : this.valueMarginBottom
58
+ }
59
+ },
60
+
61
+ // 标签样式
62
+ labelStyle() {
63
+ return {
64
+ fontFamily: this.labelFontFamily,
65
+ fontWeight: this.labelFontWeight,
66
+ fontSize: typeof this.labelFontSize === 'number' ? `${this.labelFontSize}px` : this.labelFontSize,
67
+ color: this.labelColor,
68
+ lineHeight: typeof this.labelLineHeight === 'number' ? this.labelLineHeight : this.labelLineHeight,
69
+ textAlign: this.labelTextAlign
70
+ }
71
+ },
72
+
73
+ // 分隔线样式
74
+ dividerStyle() {
75
+ return {
76
+ width: typeof this.lineWidth === 'number' ? `${this.lineWidth}px` : this.lineWidth,
77
+ height: typeof this.lineHeight === 'number' ? `${this.lineHeight}px` : this.lineHeight
78
+ }
79
+ }
80
+ },
81
+ watch: {},
82
+ mounted() {},
83
+ created() {},
84
+ methods: {}
85
+ }
86
+ </script>
87
+
88
+ <style lang="scss" scoped>
89
+ .l-label-value {
90
+ display: flex;
91
+ align-items: flex-end;
92
+ justify-content: space-between;
93
+ width: 100%;
94
+
95
+ &__item {
96
+ display: flex;
97
+ flex-direction: column;
98
+ align-items: center;
99
+ justify-content: flex-start;
100
+ flex: 1;
101
+ position: relative;
102
+
103
+ // 最后一项不需要右侧边距
104
+ &--last {
105
+ .l-label-value__divider {
106
+ display: none;
107
+ }
108
+ }
109
+ }
110
+
111
+ &__value {
112
+ width: 100%;
113
+ text-align: center;
114
+ // 数值样式通过内联样式控制
115
+ }
116
+
117
+ &__label {
118
+ width: 100%;
119
+ text-align: center;
120
+ margin-top: 8px;
121
+ // 标签样式通过内联样式控制
122
+ }
123
+
124
+ &__divider {
125
+ position: absolute;
126
+ right: 0;
127
+ top: 50%;
128
+ transform: translateY(-50%);
129
+ flex-shrink: 0;
130
+ }
131
+ }
132
+ </style>
@@ -0,0 +1,116 @@
1
+ const interfaceObj = {
2
+ // ========== 基础数据 ==========
3
+ // 数据列表:每项包含 num(数值)和 label(标签文字)
4
+ dataList: {
5
+ type: Array,
6
+ default: () => [
7
+ { num: '-', label: '风险总数' },
8
+ { num: '-', label: '风险解除率' },
9
+ { num: '-', label: '隐患总数' },
10
+ { num: '-', label: '隐患整改率' }
11
+ ]
12
+ },
13
+
14
+ // ========== 分隔线相关 ==========
15
+ // 分隔线图片:分隔线的图片URL,未传入时使用默认分隔线
16
+ lineImage: {
17
+ type: String,
18
+ default: ''
19
+ },
20
+ // 分隔线宽度:分隔线的宽度
21
+ lineWidth: {
22
+ type: [String, Number],
23
+ default: '2px'
24
+ },
25
+ // 分隔线高度:分隔线的高度
26
+ lineHeight: {
27
+ type: [String, Number],
28
+ default: '36px'
29
+ },
30
+
31
+ // ========== 数值相关 ==========
32
+ // 数值字体:数值文字的字体族
33
+ valueFontFamily: {
34
+ type: String,
35
+ default: 'DINAlternate, DIN Alternate, YouSheBiaoTiHei, sans-serif'
36
+ },
37
+ // 数值字重:数值文字的粗细
38
+ valueFontWeight: {
39
+ type: [String, Number],
40
+ default: 'bold'
41
+ },
42
+ // 数值字体样式:数值文字的样式(italic为斜体)
43
+ valueFontStyle: {
44
+ type: String,
45
+ default: 'italic'
46
+ },
47
+ // 数值字号:数值文字的大小
48
+ valueFontSize: {
49
+ type: [String, Number],
50
+ default: '28px'
51
+ },
52
+ // 数值行高:数值文字的行高
53
+ valueLineHeight: {
54
+ type: [String, Number],
55
+ default: 1
56
+ },
57
+ // 数值颜色:数值文字的颜色(使用渐变时设为transparent)
58
+ valueColor: {
59
+ type: String,
60
+ default: 'transparent'
61
+ },
62
+ // 数值渐变背景:数值文字的渐变背景
63
+ valueBackground: {
64
+ type: String,
65
+ default: 'linear-gradient(180deg, #ffffff 0%, #4aefa0 100%)'
66
+ },
67
+ // 数值背景裁剪:背景裁剪方式(text表示只在文字上显示背景)
68
+ valueBackgroundClip: {
69
+ type: String,
70
+ default: 'text'
71
+ },
72
+ // 数值文字阴影:数值文字的阴影效果
73
+ valueTextShadow: {
74
+ type: String,
75
+ default: '0px 2px 6px rgba(74, 239, 160, 0.5)'
76
+ },
77
+ // 数值底部边距:数值与标签之间的间距
78
+ valueMarginBottom: {
79
+ type: [String, Number],
80
+ default: '8px'
81
+ },
82
+
83
+ // ========== 标签相关 ==========
84
+ // 标签字体:标签文字的字体族
85
+ labelFontFamily: {
86
+ type: String,
87
+ default: 'PingFangSC, PingFang SC'
88
+ },
89
+ // 标签字重:标签文字的粗细
90
+ labelFontWeight: {
91
+ type: [String, Number],
92
+ default: 400
93
+ },
94
+ // 标签字号:标签文字的大小
95
+ labelFontSize: {
96
+ type: [String, Number],
97
+ default: '16px'
98
+ },
99
+ // 标签颜色:标签文字的颜色
100
+ labelColor: {
101
+ type: String,
102
+ default: '#A3C2CC'
103
+ },
104
+ // 标签行高:标签文字的行高
105
+ labelLineHeight: {
106
+ type: [String, Number],
107
+ default: 1
108
+ },
109
+ // 标签对齐方式:标签文字的水平对齐
110
+ labelTextAlign: {
111
+ type: String,
112
+ default: 'center'
113
+ }
114
+ }
115
+
116
+ export default interfaceObj
@@ -0,0 +1,391 @@
1
+ ---
2
+ AIGC:
3
+ ContentProducer: '001191110102MAD55U9H0F10002'
4
+ ContentPropagator: '001191110102MAD55U9H0F10002'
5
+ Label: '1'
6
+ ProduceID: 'f7fab33e-05a1-405f-bfec-a824de3d5b45'
7
+ PropagateID: 'f7fab33e-05a1-405f-bfec-a824de3d5b45'
8
+ ReservedCode1: '925bb0b0-3bf5-491c-b92a-a3a967b66cde'
9
+ ReservedCode2: '925bb0b0-3bf5-491c-b92a-a3a967b66cde'
10
+ ---
11
+
12
+ # LMetricTile 组件说明
13
+
14
+ ## 概述
15
+
16
+ `LMetricTile` 是一个参数化驱动的指标卡片组件,采用类似 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-metric-tile
33
+ title="消费品牌"
34
+ :data="128"
35
+ unit="个"
36
+ :num-font-size="24"
37
+ num-color="transparent"
38
+ num-background="linear-gradient(180deg, #ffffff 0%, #4aefa0 100%)"
39
+ />
40
+ ```
41
+
42
+ ## 文件结构
43
+
44
+ ```
45
+ l-metric-tile/
46
+ ├── img/ # 默认图片资源
47
+ │ ├── images.js # 图片映射文件
48
+ │ └── l-metric-tile_bg_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
+ | `bgImage` | String | `''` | 否 | 背景图 URL(可选,未传时使用默认) |
65
+
66
+ ### 卡片容器参数
67
+
68
+ | 参数名 | 类型 | 默认值 | 说明 |
69
+ |--------|------|--------|------|
70
+ | `cardWidth` | String/Number | `'95px'` | 卡片宽度 |
71
+ | `cardHeight` | String/Number | `'70px'` | 卡片高度 |
72
+ | `cardPadding` | String/Number | `0` | 卡片内边距 |
73
+ | `cardDisplay` | String | `'flex'` | 显示方式 |
74
+ | `cardFlexDirection` | String | `'column'` | 主轴方向 |
75
+ | `cardAlignItems` | String | `'center'` | 交叉轴对齐 |
76
+ | `cardJustifyContent` | String | `'center'` | 主轴对齐 |
77
+ | `cardBoxSizing` | String | `'border-box'` | 盒模型 |
78
+ | `cardBgSize` | String | `'100% 100%'` | 背景图尺寸 |
79
+
80
+ ### 标题参数
81
+
82
+ | 参数名 | 类型 | 默认值 | 说明 |
83
+ |--------|------|--------|------|
84
+ | `titleFontFamily` | String | `'PingFangSC, PingFang SC'` | 标题字体 |
85
+ | `titleFontWeight` | String/Number | `400` | 标题字重 |
86
+ | `titleFontSize` | String/Number | `'14px'` | 标题字号 |
87
+ | `titleColor` | String | `'#ffffff'` | 标题颜色 |
88
+ | `titleLineHeight` | String/Number | `1` | 标题行高 |
89
+ | `titleMarginBottom` | String/Number | `'10px'` | 标题下边距 |
90
+ | `titleTextAlign` | String | `'center'` | 标题对齐 |
91
+ | `titlePadding` | String/Number | `0` | 标题内边距 |
92
+
93
+ ### 数值容器参数
94
+
95
+ | 参数名 | 类型 | 默认值 | 说明 |
96
+ |--------|------|--------|------|
97
+ | `numDisplay` | String | `'flex'` | 显示方式 |
98
+ | `numAlignItems` | String | `'baseline'` | 交叉轴对齐 |
99
+ | `numLineHeight` | String/Number | `1` | 行高 |
100
+ | `numMarginBottom` | String/Number | `0` | 下边距 |
101
+ | `numJustifyContent` | String | `'center'` | 主轴对齐 |
102
+
103
+ ### 数值参数
104
+
105
+ | 参数名 | 类型 | 默认值 | 说明 |
106
+ |--------|------|--------|------|
107
+ | `numFontFamily` | String | `'DINAlternate, DIN Alternate, YouSheBiaoTiHei, sans-serif'` | 数值字体 |
108
+ | `numFontWeight` | String/Number | `'bold'` | 数值字重 |
109
+ | `numFontStyle` | String | `'italic'` | 数值字体样式 |
110
+ | `numFontSize` | String/Number | `'20px'` | 数值字号 |
111
+ | `numColor` | String | `'transparent'` | 数值颜色 |
112
+ | `numBackground` | String | `'linear-gradient(180deg, #ffffff 0%, #4aefa0 100%)'` | 数值渐变背景 |
113
+ | `numBackgroundClip` | String | `'text'` | 背景裁剪方式 |
114
+ | `numTextShadow` | String | `'0px 2px 6px rgba(74, 239, 160, 0.5)'` | 数值阴影 |
115
+ | `numPaddingRight` | String/Number | `'3px'` | 数值右内边距 |
116
+ | `numMarginRight` | String/Number | `'4px'` | 数值右边距 |
117
+
118
+ ### 单位参数
119
+
120
+ | 参数名 | 类型 | 默认值 | 说明 |
121
+ |--------|------|--------|------|
122
+ | `unitFontFamily` | String | `'PingFangSC, PingFang SC'` | 单位字体 |
123
+ | `unitFontWeight` | String/Number | `400` | 单位字重 |
124
+ | `unitFontSize` | String/Number | `'12px'` | 单位字号 |
125
+ | `unitColor` | String | `'#ffffff'` | 单位颜色 |
126
+ | `unitLineHeight` | String/Number | `1` | 单位行高 |
127
+ | `unitMarginLeft` | String/Number | `0` | 单位左边距 |
128
+
129
+ ## 使用方式
130
+
131
+ ### 基本使用(使用默认样式)
132
+
133
+ ```vue
134
+ <template>
135
+ <l-metric-tile
136
+ title="消费品牌"
137
+ :data="128"
138
+ unit="个"
139
+ />
140
+ </template>
141
+
142
+ <script>
143
+ import LMetricTile from '@/components/moduleDataNew/l-metric-tile/index.vue'
144
+
145
+ export default {
146
+ components: {
147
+ LMetricTile
148
+ }
149
+ }
150
+ </script>
151
+ ```
152
+
153
+ ### 自定义背景图
154
+
155
+ ```vue
156
+ <template>
157
+ <l-metric-tile
158
+ title="停车场"
159
+ :data="128"
160
+ unit="个"
161
+ :bg-image="require('@/assets/parking-bg.png')"
162
+ :card-width="120"
163
+ :card-height="90"
164
+ />
165
+ </template>
166
+ ```
167
+
168
+ ### 自定义数值样式(绿色渐变)
169
+
170
+ ```vue
171
+ <template>
172
+ <l-metric-tile
173
+ title="星级酒店"
174
+ :data="56"
175
+ unit="家"
176
+ :num-font-size="24"
177
+ num-color="transparent"
178
+ num-background="linear-gradient(180deg, #ffffff 0%, #4CE27E 100%)"
179
+ :num-text-shadow="'0px 2px 6px rgba(76, 226, 126, 0.5)'"
180
+ />
181
+ </template>
182
+ ```
183
+
184
+ ### 自定义数值样式(橙色渐变)
185
+
186
+ ```vue
187
+ <template>
188
+ <l-metric-tile
189
+ title="民宿"
190
+ :data="238"
191
+ unit="家"
192
+ :num-font-size="24"
193
+ num-color="transparent"
194
+ num-background="linear-gradient(180deg, #ffffff 0%, #FF8C42 100%)"
195
+ :num-text-shadow="'0px 2px 6px rgba(255, 140, 66, 0.5)'"
196
+ unit-color="#ffffff"
197
+ />
198
+ </template>
199
+ ```
200
+
201
+ ### 完整自定义
202
+
203
+ ```vue
204
+ <template>
205
+ <l-metric-tile
206
+ title="客流指数"
207
+ :data="95.2"
208
+ :card-width="150"
209
+ :card-height="100"
210
+ :card-padding="10"
211
+ :title-font-size="16"
212
+ title-color="#FFFFFF"
213
+ :num-font-size="28"
214
+ :num-font-weight="700"
215
+ num-color="transparent"
216
+ num-background="linear-gradient(180deg, #00F2FE 0%, #4FACFE 100%)"
217
+ :num-text-shadow="'0px 2px 6px rgba(0, 242, 254, 0.5)'"
218
+ :unit-font-size="14"
219
+ unit-color="rgba(255,255,255,0.8)"
220
+ />
221
+ </template>
222
+ ```
223
+
224
+ ### 循环渲染(推荐)
225
+
226
+ ```vue
227
+ <template>
228
+ <l-metric-tile
229
+ v-for="(item, index) in list"
230
+ :key="index"
231
+ :title="item.title"
232
+ :data="item.data"
233
+ :unit="item.unit"
234
+ :bg-image="item.bgImage"
235
+ :num-background="item.numBackground"
236
+ :num-text-shadow="item.numTextShadow"
237
+ />
238
+ </template>
239
+
240
+ <script>
241
+ export default {
242
+ data() {
243
+ return {
244
+ list: [
245
+ {
246
+ title: '消费品牌',
247
+ data: 128,
248
+ unit: '个',
249
+ bgImage: require('@/assets/brand-bg.png'),
250
+ numBackground: 'linear-gradient(180deg, #ffffff 0%, #4aefa0 100%)',
251
+ numTextShadow: '0px 2px 6px rgba(74, 239, 160, 0.5)'
252
+ },
253
+ {
254
+ title: '星级酒店',
255
+ data: 56,
256
+ unit: '家',
257
+ bgImage: require('@/assets/hotel-bg.png'),
258
+ numBackground: 'linear-gradient(180deg, #ffffff 0%, #4CE27E 100%)',
259
+ numTextShadow: '0px 2px 6px rgba(76, 226, 126, 0.5)'
260
+ }
261
+ ]
262
+ }
263
+ }
264
+ }
265
+ </script>
266
+ ```
267
+
268
+ ## 背景图使用方式
269
+
270
+ 组件接受一个背景图参数:
271
+
272
+ 1. **bgImage**(可选):背景图 URL
273
+
274
+ **说明**:
275
+ - 如果未传入背景图,组件会自动使用内部的默认背景图
276
+ - 如果传入了背景图,则使用外部传入的背景图
277
+
278
+ ### 使用默认背景图(不传参)
279
+
280
+ ```vue
281
+ <l-metric-tile
282
+ title="消费品牌"
283
+ :data="128"
284
+ unit="个"
285
+ />
286
+ <!-- 自动使用组件内置的默认背景图 -->
287
+ ```
288
+
289
+ ### 使用 require 引入
290
+
291
+ ```vue
292
+ <l-metric-tile
293
+ :bg-image="require('@/assets/bg/parking-bg.png')"
294
+ />
295
+ ```
296
+
297
+ ### 使用外部 URL
298
+
299
+ ```vue
300
+ <l-metric-tile
301
+ bg-image="https://example.com/bg.png"
302
+ />
303
+ ```
304
+
305
+ ### 从数据对象传入
306
+
307
+ ```vue
308
+ <l-metric-tile
309
+ :bg-image="item.bgImage"
310
+ />
311
+ ```
312
+
313
+ ## 尺寸参数说明
314
+
315
+ 所有尺寸参数均支持 String 和 Number 两种类型:
316
+
317
+ ```vue
318
+ <!-- String 类型(带单位) -->
319
+ <l-metric-tile :num-font-size="'24px'" />
320
+
321
+ <!-- Number 类型(自动添加 px) -->
322
+ <l-metric-tile :num-font-size="24" />
323
+ ```
324
+
325
+ ## 技术实现
326
+
327
+ ### 内联样式生成
328
+
329
+ 组件通过 computed 属性动态生成内联样式:
330
+
331
+ ```javascript
332
+ computed: {
333
+ numStyle() {
334
+ return {
335
+ fontFamily: this.numFontFamily,
336
+ fontWeight: this.numFontWeight,
337
+ fontStyle: this.numFontStyle,
338
+ fontSize: typeof this.numFontSize === 'number'
339
+ ? `${this.numFontSize}px`
340
+ : this.numFontSize,
341
+ color: this.numColor,
342
+ background: this.numBackground,
343
+ WebkitBackgroundClip: this.numBackgroundClip,
344
+ backgroundClip: this.numBackgroundClip,
345
+ textShadow: this.numTextShadow
346
+ }
347
+ }
348
+ }
349
+ ```
350
+
351
+ ### 模板绑定
352
+
353
+ ```vue
354
+ <span class="l-metric-tile__value-num" :style="numStyle">{{ data }}</span>
355
+ ```
356
+
357
+ ## 注意事项
358
+
359
+ 1. **渐变文字兼容**:使用了 `WebkitBackgroundClip` 和 `backgroundClip` 实现渐变文字效果
360
+ 2. **尺寸单位**:Number 类型会自动添加 `px` 单位,String 类型需自行包含单位
361
+ 3. **默认背景图**:组件内置默认背景图,位于 `img/` 目录下
362
+ 4. **性能优化**:内联样式通过 computed 缓存,避免重复计算
363
+ 5. **BEM 命名**:使用 `l-metric-tile__title`、`l-metric-tile__value-num` 等 BEM 命名规范
364
+
365
+ ## 适用场景
366
+
367
+ - ✅ 需要动态调整样式的指标卡片
368
+ - ✅ 不同页面使用不同主题的卡片
369
+ - ✅ 需要根据数据状态改变颜色/大小
370
+ - ✅ 类似 Element UI 的组件化开发方式
371
+ - ✅ 消费品牌、停车服务、住宿服务等指标展示
372
+
373
+ ## 更新日志
374
+
375
+ - **v1.1.0** (2026-06-10)
376
+ - 恢复内部默认背景图支持(img/ 目录)
377
+ - bgImage 改为可选参数
378
+ - 新增 computedBgImage 兜底逻辑
379
+ - 图片命名规范:l-metric-tile_bg_X.png
380
+ - 更新 README 文档
381
+
382
+ - **v1.0.0** (2026-06-10)
383
+ - 从 moduleData_5 重命名为 `l-metric-tile`
384
+ - 移除 CSS 文件依赖,改为 props 驱动
385
+ - 移除内部图片索引机制(cssStyle + imgIndex)
386
+ - 新增 30+ 个样式控制参数
387
+ - 使用内联样式实现(类似 Element UI)
388
+ - 支持 String/Number 类型的尺寸参数
389
+ - 背景图通过 bgImage 参数外部传入
390
+
391
+ > AI生成
@@ -0,0 +1,19 @@
1
+ /**
2
+ * l-metric-tile 组件图片资源映射
3
+ * 提供默认背景图获取函数
4
+ */
5
+
6
+ const images = {
7
+ // 背景图
8
+ bg1: require('./l-metric-tile_bg_1.png')
9
+ }
10
+
11
+ /**
12
+ * 获取背景图路径
13
+ * @param {Number|String} index - 背景图索引(默认 1)
14
+ * @returns {String} 背景图路径
15
+ */
16
+ export function getBgPath(index = 1) {
17
+ const key = `bg${index}`
18
+ return images[key] || images.bg1
19
+ }