@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,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
|
+
}
|
|
Binary file
|