@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,115 @@
|
|
|
1
|
+
const interfaceObj = {
|
|
2
|
+
// ========== 基础数据 ==========
|
|
3
|
+
// 选项卡数据列表:每项包含 name(显示名称)和 value(值)
|
|
4
|
+
selectData: {
|
|
5
|
+
type: Array,
|
|
6
|
+
default: () => [
|
|
7
|
+
{ name: '松兰山景区', value: 1 }
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
// 绑定值:当前选中的选项卡值(支持 .sync)
|
|
11
|
+
selValue: {
|
|
12
|
+
type: [Number, String],
|
|
13
|
+
default: 1
|
|
14
|
+
},
|
|
15
|
+
// 宽度:单个选项卡的宽度
|
|
16
|
+
width: {
|
|
17
|
+
type: String,
|
|
18
|
+
default: '100%'
|
|
19
|
+
},
|
|
20
|
+
// 占位符:未选择时的提示文字(保留用于兼容)
|
|
21
|
+
placeholder: {
|
|
22
|
+
type: String,
|
|
23
|
+
default: '请选择'
|
|
24
|
+
},
|
|
25
|
+
// 是否可清空:是否显示清空按钮(保留用于兼容)
|
|
26
|
+
clearable: {
|
|
27
|
+
type: Boolean,
|
|
28
|
+
default: false
|
|
29
|
+
},
|
|
30
|
+
// 颜色主题:选项卡的颜色主题(保留用于兼容)
|
|
31
|
+
color: {
|
|
32
|
+
type: String,
|
|
33
|
+
default: 'blue'
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
// ========== 容器样式相关 ==========
|
|
37
|
+
// 容器显示方式:flex 布局方式
|
|
38
|
+
containerDisplay: {
|
|
39
|
+
type: String,
|
|
40
|
+
default: 'flex'
|
|
41
|
+
},
|
|
42
|
+
// 容器右边距:选项卡之间的间距
|
|
43
|
+
containerGap: {
|
|
44
|
+
type: [String, Number],
|
|
45
|
+
default: '10px'
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
// ========== 选项卡样式相关 ==========
|
|
49
|
+
// 选项卡高度:选项卡的高度
|
|
50
|
+
tabHeight: {
|
|
51
|
+
type: [String, Number],
|
|
52
|
+
default: '27px'
|
|
53
|
+
},
|
|
54
|
+
// 选项卡圆角:选项卡的圆角半径
|
|
55
|
+
tabBorderRadius: {
|
|
56
|
+
type: String,
|
|
57
|
+
default: '20px 20px 20px 0'
|
|
58
|
+
},
|
|
59
|
+
// 选项卡背景色:选项卡的背景颜色
|
|
60
|
+
tabBgColor: {
|
|
61
|
+
type: String,
|
|
62
|
+
default: '#1F364D'
|
|
63
|
+
},
|
|
64
|
+
// 选项卡边框:选项卡的边框样式
|
|
65
|
+
tabBorder: {
|
|
66
|
+
type: String,
|
|
67
|
+
default: '1px solid rgba(64, 255, 159, .5)'
|
|
68
|
+
},
|
|
69
|
+
// 选项卡文字颜色:选项卡文字的颜色
|
|
70
|
+
tabColor: {
|
|
71
|
+
type: String,
|
|
72
|
+
default: 'rgba(255,255,255,0.7)'
|
|
73
|
+
},
|
|
74
|
+
// 选项卡光标:鼠标悬停时的光标样式
|
|
75
|
+
tabCursor: {
|
|
76
|
+
type: String,
|
|
77
|
+
default: 'pointer'
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
// ========== 激活态样式相关 ==========
|
|
81
|
+
// 激活态边框:选中选项卡的边框样式
|
|
82
|
+
activeTabBorder: {
|
|
83
|
+
type: String,
|
|
84
|
+
default: '1px solid #40FF9F'
|
|
85
|
+
},
|
|
86
|
+
// 激活态文字颜色:选中选项卡的文字颜色
|
|
87
|
+
activeTabColor: {
|
|
88
|
+
type: String,
|
|
89
|
+
default: 'rgba(255,255,255,1)'
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
// ========== 文本样式相关 ==========
|
|
93
|
+
// 文本对齐方式:选项卡文本的对齐方式
|
|
94
|
+
textAlign: {
|
|
95
|
+
type: String,
|
|
96
|
+
default: 'center'
|
|
97
|
+
},
|
|
98
|
+
// 文本字体:选项卡文本的字体族
|
|
99
|
+
textFontFamily: {
|
|
100
|
+
type: String,
|
|
101
|
+
default: 'inherit'
|
|
102
|
+
},
|
|
103
|
+
// 文本字号:选项卡文本的字体大小
|
|
104
|
+
textFontSize: {
|
|
105
|
+
type: [String, Number],
|
|
106
|
+
default: 'inherit'
|
|
107
|
+
},
|
|
108
|
+
// 文本字重:选项卡文本的字体粗细
|
|
109
|
+
textFontWeight: {
|
|
110
|
+
type: [String, Number],
|
|
111
|
+
default: 'inherit'
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export default interfaceObj
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
---
|
|
2
|
+
AIGC:
|
|
3
|
+
ContentProducer: '001191110102MAD55U9H0F10002'
|
|
4
|
+
ContentPropagator: '001191110102MAD55U9H0F10002'
|
|
5
|
+
Label: '1'
|
|
6
|
+
ProduceID: '1f540422-4cf8-405a-9e03-e1af865f6666'
|
|
7
|
+
PropagateID: '1f540422-4cf8-405a-9e03-e1af865f6666'
|
|
8
|
+
ReservedCode1: '58efed1c-1dc2-4994-825b-5811193ce3de'
|
|
9
|
+
ReservedCode2: '58efed1c-1dc2-4994-825b-5811193ce3de'
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# LTrendCard 组件说明
|
|
13
|
+
|
|
14
|
+
## 概述
|
|
15
|
+
|
|
16
|
+
`LTrendCard` 是一个参数化驱动的趋势卡片组件,采用类似 Element UI 的封装方式。所有样式(背景图、图标、文字大小、颜色等)均通过 props 参数动态控制,不再依赖 CSS 样式文件。
|
|
17
|
+
|
|
18
|
+
## 核心特性
|
|
19
|
+
|
|
20
|
+
- ✅ **Props 驱动**:所有样式通过 props 参数控制,类似 Element UI
|
|
21
|
+
- ✅ **内联样式**:使用 computed 属性动态生成内联样式
|
|
22
|
+
- ✅ **高度灵活**:支持自定义背景图、图标尺寸、字体、颜色等
|
|
23
|
+
- ✅ **默认图片**:未传入图片时自动使用组件内置默认图片
|
|
24
|
+
- ✅ **类型安全**:支持 String 和 Number 类型的尺寸参数
|
|
25
|
+
- ✅ **趋势指示**:支持同比/环比数据展示,自动显示上升/下降图标
|
|
26
|
+
|
|
27
|
+
## 设计原则
|
|
28
|
+
|
|
29
|
+
### Element UI 风格封装
|
|
30
|
+
|
|
31
|
+
```vue
|
|
32
|
+
<!-- 类似 Element UI 的使用方式 -->
|
|
33
|
+
<l-trend-card
|
|
34
|
+
title="接待游客"
|
|
35
|
+
:num="12345"
|
|
36
|
+
:yoy="15.5"
|
|
37
|
+
:mom="-3.2"
|
|
38
|
+
:num-font-size="24"
|
|
39
|
+
num-color="#4aefa0"
|
|
40
|
+
/>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 文件结构
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
l-trend-card/
|
|
47
|
+
├── img/ # 默认图片资源
|
|
48
|
+
│ ├── images.js # 图片映射文件
|
|
49
|
+
│ ├── l-trend-card_bg.png # 默认背景图
|
|
50
|
+
│ ├── l-trend-card_icon_1.png # 默认图标
|
|
51
|
+
│ ├── l-trend-card_icon_up.png # 上升图标
|
|
52
|
+
│ └── l-trend-card_icon_down.png # 下降图标
|
|
53
|
+
├── interface/
|
|
54
|
+
│ └── index.js # Props 定义
|
|
55
|
+
├── index.vue # 主组件(内联样式驱动)
|
|
56
|
+
└── README.md # 组件说明文档
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Props 参数
|
|
60
|
+
|
|
61
|
+
### 基础参数
|
|
62
|
+
|
|
63
|
+
| 参数名 | 类型 | 默认值 | 必填 | 说明 |
|
|
64
|
+
|--------|------|--------|------|------|
|
|
65
|
+
| `icon` | String | `''` | 否 | 图标图片 URL(可选,未传时使用默认) |
|
|
66
|
+
| `title` | String | `''` | 否 | 标题文本 |
|
|
67
|
+
| `num` | String/Number | `''` | 否 | 数据值 |
|
|
68
|
+
| `yoy` | String/Number | `0` | 否 | 同比增长率(%) |
|
|
69
|
+
| `mom` | String/Number | `0` | 否 | 环比增长率(%) |
|
|
70
|
+
| `upIcon` | String | `''` | 否 | 上升图标 URL(可选) |
|
|
71
|
+
| `downIcon` | String | `''` | 否 | 下降图标 URL(可选) |
|
|
72
|
+
| `bgImage` | String | `''` | 否 | 背景图 URL(可选,未传时使用默认) |
|
|
73
|
+
|
|
74
|
+
### 卡片容器参数
|
|
75
|
+
|
|
76
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
77
|
+
|--------|------|--------|------|
|
|
78
|
+
| `cardWidth` | String/Number | `'150px'` | 卡片宽度 |
|
|
79
|
+
| `cardHeight` | String/Number | `'107px'` | 卡片高度 |
|
|
80
|
+
| `cardPadding` | String | `'8px 8px 0 4px'` | 卡片内边距 |
|
|
81
|
+
| `cardBoxSizing` | String | `'border-box'` | 盒模型 |
|
|
82
|
+
| `cardDisplay` | String | `'flex'` | 显示方式 |
|
|
83
|
+
| `cardBgSize` | String | `'100% 100%'` | 背景图尺寸 |
|
|
84
|
+
|
|
85
|
+
### 图标参数
|
|
86
|
+
|
|
87
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
88
|
+
|--------|------|--------|------|
|
|
89
|
+
| `iconWidth` | String/Number | `'50px'` | 图标宽度 |
|
|
90
|
+
| `iconHeight` | String/Number | `'61px'` | 图标高度 |
|
|
91
|
+
| `iconMarginLeft` | String/Number | `'2px'` | 图标左边距 |
|
|
92
|
+
| `iconMarginTop` | String/Number | `'5px'` | 图标上边距 |
|
|
93
|
+
| `iconFlexShrink` | String/Number | `0` | 图标收缩比例 |
|
|
94
|
+
|
|
95
|
+
### 内容容器参数
|
|
96
|
+
|
|
97
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
98
|
+
|--------|------|--------|------|
|
|
99
|
+
| `contentFlex` | String/Number | `1` | 弹性比例 |
|
|
100
|
+
| `contentDisplay` | String | `'flex'` | 显示方式 |
|
|
101
|
+
| `contentFlexDirection` | String | `'column'` | 主轴方向 |
|
|
102
|
+
| `contentJustifyContent` | String | `'center'` | 主轴对齐 |
|
|
103
|
+
|
|
104
|
+
### 标题参数
|
|
105
|
+
|
|
106
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
107
|
+
|--------|------|--------|------|
|
|
108
|
+
| `titleFontFamily` | String | `'PingFangSC, PingFang SC'` | 标题字体 |
|
|
109
|
+
| `titleFontWeight` | String/Number | `400` | 标题字重 |
|
|
110
|
+
| `titleFontSize` | String/Number | `'16px'` | 标题字号 |
|
|
111
|
+
| `titleColor` | String | `'#ffffff'` | 标题颜色 |
|
|
112
|
+
| `titleLineHeight` | String/Number | `1.2` | 标题行高 |
|
|
113
|
+
|
|
114
|
+
### 数值参数
|
|
115
|
+
|
|
116
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
117
|
+
|--------|------|--------|------|
|
|
118
|
+
| `numFontFamily` | String | `'DINAlternate, DIN Alternate, YouSheBiaoTiHei, sans-serif'` | 数值字体 |
|
|
119
|
+
| `numFontWeight` | String/Number | `'bold'` | 数值字重 |
|
|
120
|
+
| `numFontStyle` | String | `'italic'` | 数值字体样式 |
|
|
121
|
+
| `numFontSize` | String/Number | `'22px'` | 数值字号 |
|
|
122
|
+
| `numColor` | String | `'#4aefa0'` | 数值颜色 |
|
|
123
|
+
| `numTextShadow` | String | `'0 0 6px rgba(74, 239, 160, 0.5)'` | 数值阴影 |
|
|
124
|
+
| `numLineHeight` | String/Number | `1.2` | 数值行高 |
|
|
125
|
+
| `numMargin` | String | `'4px 0'` | 数值外边距 |
|
|
126
|
+
|
|
127
|
+
### 比率参数
|
|
128
|
+
|
|
129
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
130
|
+
|--------|------|--------|------|
|
|
131
|
+
| `rateFontSize` | String/Number | `'12px'` | 比率字号 |
|
|
132
|
+
| `rateColor` | String | `'#ffffff'` | 比率颜色 |
|
|
133
|
+
| `rateLineHeight` | String/Number | `1.6` | 比率行高 |
|
|
134
|
+
| `rateDisplay` | String | `'flex'` | 比率显示方式 |
|
|
135
|
+
| `rateAlignItems` | String | `'center'` | 比率对齐方式 |
|
|
136
|
+
| `labelMarginRight` | String/Number | `'4px'` | 标签右边距 |
|
|
137
|
+
| `valueMarginRight` | String/Number | `'4px'` | 数值右边距 |
|
|
138
|
+
|
|
139
|
+
### 趋势图标参数
|
|
140
|
+
|
|
141
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
142
|
+
|--------|------|--------|------|
|
|
143
|
+
| `trendIconWidth` | String/Number | `'7px'` | 趋势图标宽度 |
|
|
144
|
+
| `trendIconHeight` | String/Number | `'10px'` | 趋势图标高度 |
|
|
145
|
+
|
|
146
|
+
## 使用方式
|
|
147
|
+
|
|
148
|
+
### 基本使用(使用默认样式)
|
|
149
|
+
|
|
150
|
+
```vue
|
|
151
|
+
<template>
|
|
152
|
+
<l-trend-card
|
|
153
|
+
title="接待游客"
|
|
154
|
+
:num="12345"
|
|
155
|
+
:yoy="15.5"
|
|
156
|
+
:mom="-3.2"
|
|
157
|
+
/>
|
|
158
|
+
</template>
|
|
159
|
+
|
|
160
|
+
<script>
|
|
161
|
+
import LTrendCard from '@/components/moduleDataNew/l-trend-card/index.vue'
|
|
162
|
+
|
|
163
|
+
export default {
|
|
164
|
+
components: {
|
|
165
|
+
LTrendCard
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
</script>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 自定义图标和背景图
|
|
172
|
+
|
|
173
|
+
```vue
|
|
174
|
+
<template>
|
|
175
|
+
<l-trend-card
|
|
176
|
+
title="今日收入"
|
|
177
|
+
:num="9876.5"
|
|
178
|
+
:yoy="20.3"
|
|
179
|
+
:mom="5.8"
|
|
180
|
+
:icon="require('@/assets/income-icon.png')"
|
|
181
|
+
:bg-image="require('@/assets/income-bg.png')"
|
|
182
|
+
/>
|
|
183
|
+
</template>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 自定义数值样式
|
|
187
|
+
|
|
188
|
+
```vue
|
|
189
|
+
<template>
|
|
190
|
+
<l-trend-card
|
|
191
|
+
title="客流指数"
|
|
192
|
+
:num="95.2"
|
|
193
|
+
:yoy="12.5"
|
|
194
|
+
:mom="-2.1"
|
|
195
|
+
:num-font-size="28"
|
|
196
|
+
num-color="#00F2FE"
|
|
197
|
+
:num-text-shadow="'0 0 6px rgba(0, 242, 254, 0.5)'"
|
|
198
|
+
/>
|
|
199
|
+
</template>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 完整自定义
|
|
203
|
+
|
|
204
|
+
```vue
|
|
205
|
+
<template>
|
|
206
|
+
<l-trend-card
|
|
207
|
+
title="酒店预订"
|
|
208
|
+
:num="238"
|
|
209
|
+
:yoy="35.2"
|
|
210
|
+
:mom="8.5"
|
|
211
|
+
:card-width="200"
|
|
212
|
+
:card-height="140"
|
|
213
|
+
:title-font-size="18"
|
|
214
|
+
title-color="#FFFFFF"
|
|
215
|
+
:num-font-size="32"
|
|
216
|
+
:num-font-weight="700"
|
|
217
|
+
num-color="#4CE27E"
|
|
218
|
+
:num-text-shadow="'0 0 10px rgba(76, 226, 126, 0.8)'"
|
|
219
|
+
:rate-font-size="14"
|
|
220
|
+
rate-color="rgba(255,255,255,0.8)"
|
|
221
|
+
/>
|
|
222
|
+
</template>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### 循环渲染(推荐)
|
|
226
|
+
|
|
227
|
+
```vue
|
|
228
|
+
<template>
|
|
229
|
+
<l-trend-card
|
|
230
|
+
v-for="(item, index) in list"
|
|
231
|
+
:key="index"
|
|
232
|
+
:title="item.title"
|
|
233
|
+
:num="item.num"
|
|
234
|
+
:yoy="item.yoy"
|
|
235
|
+
:mom="item.mom"
|
|
236
|
+
:icon="item.icon"
|
|
237
|
+
/>
|
|
238
|
+
</template>
|
|
239
|
+
|
|
240
|
+
<script>
|
|
241
|
+
export default {
|
|
242
|
+
data() {
|
|
243
|
+
return {
|
|
244
|
+
list: [
|
|
245
|
+
{
|
|
246
|
+
title: 'A级景区',
|
|
247
|
+
num: 934,
|
|
248
|
+
yoy: 12.5,
|
|
249
|
+
mom: 3.2,
|
|
250
|
+
icon: require('@/assets/icons/scenic.png')
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
title: '星级酒店',
|
|
254
|
+
num: 437,
|
|
255
|
+
yoy: -5.3,
|
|
256
|
+
mom: -2.1,
|
|
257
|
+
icon: require('@/assets/icons/hotel.png')
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
</script>
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## 图片使用方式
|
|
267
|
+
|
|
268
|
+
组件接受多个图片参数:
|
|
269
|
+
|
|
270
|
+
1. **icon**(可选):主图标 URL
|
|
271
|
+
2. **bgImage**(可选):背景图 URL
|
|
272
|
+
3. **upIcon**(可选):上升趋势图标 URL
|
|
273
|
+
4. **downIcon**(可选):下降趋势图标 URL
|
|
274
|
+
|
|
275
|
+
**说明**:
|
|
276
|
+
- 如果未传入图片,组件会自动使用内部的默认图片
|
|
277
|
+
- 如果传入了图片,则使用外部传入的图片
|
|
278
|
+
|
|
279
|
+
### 使用默认图片(不传参)
|
|
280
|
+
|
|
281
|
+
```vue
|
|
282
|
+
<l-trend-card
|
|
283
|
+
title="接待游客"
|
|
284
|
+
:num="12345"
|
|
285
|
+
:yoy="15.5"
|
|
286
|
+
:mom="-3.2"
|
|
287
|
+
/>
|
|
288
|
+
<!-- 自动使用组件内置的默认图标和背景图 -->
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### 使用 require 引入
|
|
292
|
+
|
|
293
|
+
```vue
|
|
294
|
+
<l-trend-card
|
|
295
|
+
:icon="require('@/assets/icons/parking.png')"
|
|
296
|
+
:bg-image="require('@/assets/bg/parking-bg.png')"
|
|
297
|
+
:up-icon="require('@/assets/icons/arrow-up.png')"
|
|
298
|
+
:down-icon="require('@/assets/icons/arrow-down.png')"
|
|
299
|
+
/>
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 使用外部 URL
|
|
303
|
+
|
|
304
|
+
```vue
|
|
305
|
+
<l-trend-card
|
|
306
|
+
icon="https://example.com/icon.png"
|
|
307
|
+
bg-image="https://example.com/bg.png"
|
|
308
|
+
/>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### 从数据对象传入
|
|
312
|
+
|
|
313
|
+
```vue
|
|
314
|
+
<l-trend-card
|
|
315
|
+
:icon="item.icon"
|
|
316
|
+
:bg-image="item.bgImage"
|
|
317
|
+
:up-icon="item.upIcon"
|
|
318
|
+
:down-icon="item.downIcon"
|
|
319
|
+
/>
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## 尺寸参数说明
|
|
323
|
+
|
|
324
|
+
所有尺寸参数均支持 String 和 Number 两种类型:
|
|
325
|
+
|
|
326
|
+
```vue
|
|
327
|
+
<!-- String 类型(带单位) -->
|
|
328
|
+
<l-trend-card :num-font-size="'24px'" />
|
|
329
|
+
|
|
330
|
+
<!-- Number 类型(自动添加 px) -->
|
|
331
|
+
<l-trend-card :num-font-size="24" />
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## 数据格式化
|
|
335
|
+
|
|
336
|
+
组件内置两个工具函数用于数据处理:
|
|
337
|
+
|
|
338
|
+
- `dealPercentdDisplay(value)`:格式化百分比数据
|
|
339
|
+
- `judgeRateType(value)`:判断趋势类型('up' 或 'down')
|
|
340
|
+
|
|
341
|
+
## 技术实现
|
|
342
|
+
|
|
343
|
+
### 内联样式生成
|
|
344
|
+
|
|
345
|
+
组件通过 computed 属性动态生成内联样式:
|
|
346
|
+
|
|
347
|
+
```javascript
|
|
348
|
+
computed: {
|
|
349
|
+
numStyle() {
|
|
350
|
+
return {
|
|
351
|
+
fontFamily: this.numFontFamily,
|
|
352
|
+
fontWeight: this.numFontWeight,
|
|
353
|
+
fontStyle: this.numFontStyle,
|
|
354
|
+
fontSize: typeof this.numFontSize === 'number'
|
|
355
|
+
? `${this.numFontSize}px`
|
|
356
|
+
: this.numFontSize,
|
|
357
|
+
color: this.numColor,
|
|
358
|
+
textShadow: this.numTextShadow
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### 模板绑定
|
|
365
|
+
|
|
366
|
+
```vue
|
|
367
|
+
<div class="l-trend-card__num" :style="numStyle">{{ num }}</div>
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### 默认图片兜底
|
|
371
|
+
|
|
372
|
+
```javascript
|
|
373
|
+
computed: {
|
|
374
|
+
computedIcon() {
|
|
375
|
+
if (this.icon) {
|
|
376
|
+
return this.icon
|
|
377
|
+
}
|
|
378
|
+
return getIconPath(1)
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## 注意事项
|
|
384
|
+
|
|
385
|
+
1. **图片可选**:所有图片参数都是可选的,未传入时使用默认图片
|
|
386
|
+
2. **趋势判断**:正数显示上升图标,负数显示下降图标,0 不显示图标
|
|
387
|
+
3. **数据格式化**:yoy 和 mom 会自动通过 `dealPercentdDisplay` 函数格式化
|
|
388
|
+
4. **尺寸单位**:Number 类型会自动添加 `px` 单位,String 类型需自行包含单位
|
|
389
|
+
5. **默认图片**:组件内置默认图片,位于 `img/` 目录下
|
|
390
|
+
6. **性能优化**:内联样式通过 computed 缓存,避免重复计算
|
|
391
|
+
7. **BEM 命名**:使用 `l-trend-card__icon`、`l-trend-card__num` 等 BEM 命名规范
|
|
392
|
+
|
|
393
|
+
## 适用场景
|
|
394
|
+
|
|
395
|
+
- ✅ 需要展示同比/环比数据的指标卡片
|
|
396
|
+
- ✅ 需要动态调整样式的趋势卡片
|
|
397
|
+
- ✅ 不同页面使用不同主题的卡片
|
|
398
|
+
- ✅ 需要根据数据状态改变颜色/大小
|
|
399
|
+
- ✅ 类似 Element UI 的组件化开发方式
|
|
400
|
+
- ✅ 旅游资源、消费品牌等指标展示
|
|
401
|
+
|
|
402
|
+
## 更新日志
|
|
403
|
+
|
|
404
|
+
- **v1.0.0** (2026-06-10)
|
|
405
|
+
- 从 moduleData_4 重命名为 `l-trend-card`
|
|
406
|
+
- 移除 CSS 文件依赖,改为 props 驱动
|
|
407
|
+
- 新增默认图片支持(img/ 目录)
|
|
408
|
+
- 新增 30+ 个样式控制参数
|
|
409
|
+
- 使用内联样式实现(类似 Element UI)
|
|
410
|
+
- 支持 String/Number 类型的尺寸参数
|
|
411
|
+
- 背景图和图标通过 bgImage/icon 参数外部传入
|
|
412
|
+
- 新增 computedIcon、computedUpIcon、computedDownIcon、computedBgImage 兜底逻辑
|
|
413
|
+
- 图片命名规范:l-trend-card_bg.png、l-trend-card_icon_X.png
|
|
414
|
+
|
|
415
|
+
> AI生成
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* l-trend-card 组件图片资源映射
|
|
3
|
+
* 提供默认背景图和图标获取函数
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const images = {
|
|
7
|
+
// 背景图
|
|
8
|
+
bg: require('./l-trend-card_bg.png'),
|
|
9
|
+
// 图标
|
|
10
|
+
icons: {
|
|
11
|
+
1: require('./l-trend-card_icon_1.png'),
|
|
12
|
+
up: require('./l-trend-card_icon_up.png'),
|
|
13
|
+
down: require('./l-trend-card_icon_down.png')
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 获取背景图路径
|
|
19
|
+
* @returns {String} 背景图路径
|
|
20
|
+
*/
|
|
21
|
+
export function getBgPath() {
|
|
22
|
+
return images.bg
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 获取图标路径
|
|
27
|
+
* @param {Number|String} index - 图标索引(默认 1)或类型(up/down)
|
|
28
|
+
* @returns {String} 图标路径
|
|
29
|
+
*/
|
|
30
|
+
export function getIconPath(index = 1) {
|
|
31
|
+
return images.icons[index] || images.icons[1]
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 获取趋势图标路径(上/下)
|
|
36
|
+
* @param {String} type - 趋势类型('up' 或 'down')
|
|
37
|
+
* @returns {String} 趋势图标路径
|
|
38
|
+
*/
|
|
39
|
+
export function getTrendIconPath(type = 'up') {
|
|
40
|
+
return images.icons[type] || images.icons.up
|
|
41
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|