@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,125 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="l-module-box">
|
|
3
|
+
<div @click="handleReset" class="l-module-box__header" :style="headerStyle">
|
|
4
|
+
<img class="l-module-box__icon" :src="computedIcon" :style="iconStyle" alt="">
|
|
5
|
+
<span class="l-module-box__text" :style="titleStyle">{{ title }}</span>
|
|
6
|
+
<div class="l-module-box__btn-container" :style="btnContainerStyle">
|
|
7
|
+
<slot name="headerBtn"></slot>
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="l-module-box__main-slot">
|
|
11
|
+
<slot />
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script>
|
|
17
|
+
import interfaceObj from './interface/index'
|
|
18
|
+
import { getIconPath, getBgPath } from './img/images'
|
|
19
|
+
|
|
20
|
+
export default {
|
|
21
|
+
name: 'LModuleBox',
|
|
22
|
+
props: interfaceObj,
|
|
23
|
+
components: {},
|
|
24
|
+
data() {
|
|
25
|
+
return {}
|
|
26
|
+
},
|
|
27
|
+
computed: {
|
|
28
|
+
// 图标图片(外部传入优先,否则使用默认)
|
|
29
|
+
computedIcon() {
|
|
30
|
+
if (this.icon) {
|
|
31
|
+
return this.icon
|
|
32
|
+
}
|
|
33
|
+
// 使用默认图标
|
|
34
|
+
return getIconPath()
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
// 背景图(外部传入优先,否则使用默认)
|
|
38
|
+
computedBgImage() {
|
|
39
|
+
if (this.bgImage) {
|
|
40
|
+
return this.bgImage
|
|
41
|
+
}
|
|
42
|
+
// 使用默认背景图
|
|
43
|
+
return getBgPath()
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
// 头部样式
|
|
47
|
+
headerStyle() {
|
|
48
|
+
return {
|
|
49
|
+
width: typeof this.bgWidth === 'number' ? `${this.bgWidth}px` : this.bgWidth,
|
|
50
|
+
height: typeof this.bgHeight === 'number' ? `${this.bgHeight}px` : this.bgHeight,
|
|
51
|
+
background: this.computedBgImage ? `url(${this.computedBgImage}) 0 0 no-repeat` : '',
|
|
52
|
+
backgroundSize: this.bgSize,
|
|
53
|
+
display: 'flex',
|
|
54
|
+
alignItems: 'center',
|
|
55
|
+
gap: typeof this.iconGap === 'number' ? `${this.iconGap}px` : this.iconGap,
|
|
56
|
+
padding: this.bgPadding,
|
|
57
|
+
position: 'relative'
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
// 图标样式
|
|
62
|
+
iconStyle() {
|
|
63
|
+
return {
|
|
64
|
+
flexShrink: 0,
|
|
65
|
+
width: typeof this.iconWidth === 'number' ? `${this.iconWidth}px` : this.iconWidth,
|
|
66
|
+
height: typeof this.iconHeight === 'number' ? `${this.iconHeight}px` : this.iconHeight
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
// 标题样式
|
|
71
|
+
titleStyle() {
|
|
72
|
+
return {
|
|
73
|
+
fontFamily: this.titleFontFamily,
|
|
74
|
+
fontSize: typeof this.titleFontSize === 'number' ? `${this.titleFontSize}px` : this.titleFontSize,
|
|
75
|
+
color: this.titleColor,
|
|
76
|
+
lineHeight: typeof this.titleLineHeight === 'number' ? this.titleLineHeight : this.titleLineHeight,
|
|
77
|
+
textShadow: this.titleTextShadow
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
// 按钮容器样式
|
|
82
|
+
btnContainerStyle() {
|
|
83
|
+
return {
|
|
84
|
+
position: 'absolute',
|
|
85
|
+
right: typeof this.btnContainerRight === 'number' ? `${this.btnContainerRight}px` : this.btnContainerRight
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
watch: {},
|
|
90
|
+
mounted() {},
|
|
91
|
+
created() {},
|
|
92
|
+
methods: {
|
|
93
|
+
handleReset() {
|
|
94
|
+
this.$emit('handleReset')
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
</script>
|
|
99
|
+
|
|
100
|
+
<style lang="scss" scoped>
|
|
101
|
+
.l-module-box {
|
|
102
|
+
width: 100%;
|
|
103
|
+
height: 100%;
|
|
104
|
+
|
|
105
|
+
&__header {
|
|
106
|
+
// 头部样式通过内联样式控制
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
&__icon {
|
|
110
|
+
// 图标样式通过内联样式控制
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
&__text {
|
|
114
|
+
// 标题样式通过内联样式控制
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
&__btn-container {
|
|
118
|
+
// 按钮容器样式通过内联样式控制
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
&__main-slot {
|
|
122
|
+
// 主内容区域
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
</style>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const interfaceObj = {
|
|
2
|
+
// ========== 基础数据 ==========
|
|
3
|
+
// 标题文本:显示在模块盒上的标题文字
|
|
4
|
+
title: {
|
|
5
|
+
type: String,
|
|
6
|
+
default: '中文标题'
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
// ========== 背景图相关 ==========
|
|
10
|
+
// 背景图图片:模块盒标题的背景图URL,未传入时使用默认背景图
|
|
11
|
+
bgImage: {
|
|
12
|
+
type: String,
|
|
13
|
+
default: ''
|
|
14
|
+
},
|
|
15
|
+
// 背景图宽度:背景图的宽度
|
|
16
|
+
bgWidth: {
|
|
17
|
+
type: [String, Number],
|
|
18
|
+
default: '432px'
|
|
19
|
+
},
|
|
20
|
+
// 背景图高度:背景图的高度
|
|
21
|
+
bgHeight: {
|
|
22
|
+
type: [String, Number],
|
|
23
|
+
default: '32px'
|
|
24
|
+
},
|
|
25
|
+
// 背景图尺寸:背景图的缩放方式
|
|
26
|
+
bgSize: {
|
|
27
|
+
type: String,
|
|
28
|
+
default: '100% 100%'
|
|
29
|
+
},
|
|
30
|
+
// 背景图内边距:背景图的内边距
|
|
31
|
+
bgPadding: {
|
|
32
|
+
type: String,
|
|
33
|
+
default: '0 8px'
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
// ========== 图标相关 ==========
|
|
37
|
+
// 图标图片:标题左侧的图标URL,未传入时使用默认图标
|
|
38
|
+
icon: {
|
|
39
|
+
type: String,
|
|
40
|
+
default: ''
|
|
41
|
+
},
|
|
42
|
+
// 图标宽度:图标的宽度
|
|
43
|
+
iconWidth: {
|
|
44
|
+
type: [String, Number],
|
|
45
|
+
default: '20px'
|
|
46
|
+
},
|
|
47
|
+
// 图标高度:图标的高度
|
|
48
|
+
iconHeight: {
|
|
49
|
+
type: [String, Number],
|
|
50
|
+
default: '20px'
|
|
51
|
+
},
|
|
52
|
+
// 图标右边距:图标与标题之间的间距
|
|
53
|
+
iconGap: {
|
|
54
|
+
type: [String, Number],
|
|
55
|
+
default: '7px'
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
// ========== 标题文字相关 ==========
|
|
59
|
+
// 标题字体:标题文字的字体族
|
|
60
|
+
titleFontFamily: {
|
|
61
|
+
type: String,
|
|
62
|
+
default: 'YouSheBiaoTiHei'
|
|
63
|
+
},
|
|
64
|
+
// 标题字号:标题文字的大小
|
|
65
|
+
titleFontSize: {
|
|
66
|
+
type: [String, Number],
|
|
67
|
+
default: '20px'
|
|
68
|
+
},
|
|
69
|
+
// 标题颜色:标题文字的颜色
|
|
70
|
+
titleColor: {
|
|
71
|
+
type: String,
|
|
72
|
+
default: '#FFFFFF'
|
|
73
|
+
},
|
|
74
|
+
// 标题行高:标题文字的行高
|
|
75
|
+
titleLineHeight: {
|
|
76
|
+
type: [String, Number],
|
|
77
|
+
default: '26px'
|
|
78
|
+
},
|
|
79
|
+
// 标题文字阴影:标题文字的阴影效果
|
|
80
|
+
titleTextShadow: {
|
|
81
|
+
type: String,
|
|
82
|
+
default: '0px 2px 4px rgba(0,0,0,0.5)'
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
// ========== 按钮容器相关 ==========
|
|
86
|
+
// 按钮容器右边距:按钮容器距离右侧的间距
|
|
87
|
+
btnContainerRight: {
|
|
88
|
+
type: [String, Number],
|
|
89
|
+
default: '8px'
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export default interfaceObj
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
AIGC:
|
|
3
|
+
ContentProducer: '001191110102MAD55U9H0F10002'
|
|
4
|
+
ContentPropagator: '001191110102MAD55U9H0F10002'
|
|
5
|
+
Label: '1'
|
|
6
|
+
ProduceID: 'f28852ce-0ffe-44de-8515-10617f50fb00'
|
|
7
|
+
PropagateID: 'f28852ce-0ffe-44de-8515-10617f50fb00'
|
|
8
|
+
ReservedCode1: '32664611-682d-4c5c-9c16-c5cfbaa4b4c5'
|
|
9
|
+
ReservedCode2: '32664611-682d-4c5c-9c16-c5cfbaa4b4c5'
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# LModuleTag 组件说明
|
|
13
|
+
|
|
14
|
+
## 概述
|
|
15
|
+
|
|
16
|
+
`LModuleTag` 是一个参数化驱动的模块标签组件,采用类似 Element UI 的封装方式。用于展示带圆形图标、标题和底部线条的模块标签。所有样式(圆形图标、标题文字、底部线条等)均通过 props 参数动态控制。
|
|
17
|
+
|
|
18
|
+
## 核心特性
|
|
19
|
+
|
|
20
|
+
- ✅ **Props 驱动**:所有样式通过 props 参数控制,类似 Element UI
|
|
21
|
+
- ✅ **高度灵活**:支持自定义圆形图标、标题样式、底部线条等
|
|
22
|
+
- ✅ **类型安全**:支持 String 和 Number 类型的尺寸参数
|
|
23
|
+
- ✅ **插槽支持**:支持 `headerBtn` 插槽用于添加按钮
|
|
24
|
+
|
|
25
|
+
## 文件结构
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
l-module-tag/
|
|
29
|
+
├── img/ # 图片资源目录(如有需要)
|
|
30
|
+
├── interface/
|
|
31
|
+
│ ── index.js # Props 定义(17个参数)
|
|
32
|
+
├── index.vue # 主组件(内联样式驱动)
|
|
33
|
+
└── README.md # 组件说明文档
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Props 参数
|
|
37
|
+
|
|
38
|
+
### 基础数据
|
|
39
|
+
|
|
40
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
41
|
+
|--------|------|--------|------|
|
|
42
|
+
| `title` | String | `'中文标题'` | 显示的标题文字 |
|
|
43
|
+
|
|
44
|
+
### 圆形图标相关
|
|
45
|
+
|
|
46
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
47
|
+
|--------|------|--------|------|
|
|
48
|
+
| `circleRingWidth` | String/Number | `'10px'` | 圆形外环宽度 |
|
|
49
|
+
| `circleRingHeight` | String/Number | `'10px'` | 圆形外环高度 |
|
|
50
|
+
| `circleRingBg` | String | `'rgba(64, 255, 143, 0.3)'` | 圆形外环背景色 |
|
|
51
|
+
| `circleRingShadow` | String | `'0px 0px 4px 1px rgba(64,255,143,0.5)'` | 圆形外环阴影 |
|
|
52
|
+
| `circleWidth` | String/Number | `'6px'` | 圆形内环宽度 |
|
|
53
|
+
| `circleHeight` | String/Number | `'6px'` | 圆形内环高度 |
|
|
54
|
+
| `circleBg` | String | `'rgb(64, 255, 143)'` | 圆形内环背景色 |
|
|
55
|
+
| `circleShadow` | String | `'0px 0px 4px 1px rgba(64,255,143,0.5)'` | 圆形内环阴影 |
|
|
56
|
+
| `circleMarginRight` | String/Number | `'10px'` | 圆形右边距(与标题的间距) |
|
|
57
|
+
|
|
58
|
+
### 标题文字相关
|
|
59
|
+
|
|
60
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
61
|
+
|--------|------|--------|------|
|
|
62
|
+
| `titleFontFamily` | String | `'YouSheBiaoTiHei'` | 标题字体 |
|
|
63
|
+
| `titleFontSize` | String/Number | `'20px'` | 标题字号 |
|
|
64
|
+
| `titleColor` | String | `'#FFFFFF'` | 标题颜色 |
|
|
65
|
+
|
|
66
|
+
### 底部线条相关
|
|
67
|
+
|
|
68
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
69
|
+
|--------|------|--------|------|
|
|
70
|
+
| `bottomMarginTop` | String/Number | `'5px'` | 底部线条上边距 |
|
|
71
|
+
| `bottomHeight` | String/Number | `'2px'` | 底部线条高度 |
|
|
72
|
+
| `bottomBackground` | String | `'linear-gradient(270deg, rgba(64,255,143,0) 0%, rgba(64,255,143,0.2) 54%, rgba(64,255,143,0.5) 100%)'` | 底部线条渐变背景 |
|
|
73
|
+
|
|
74
|
+
## 使用方式
|
|
75
|
+
|
|
76
|
+
### 基本使用
|
|
77
|
+
|
|
78
|
+
```vue
|
|
79
|
+
<template>
|
|
80
|
+
<l-module-tag title="文旅风险隐患监管" />
|
|
81
|
+
</template>
|
|
82
|
+
|
|
83
|
+
<script>
|
|
84
|
+
import LModuleTag from '@/components/moduleBox/l-module-tag/index.vue'
|
|
85
|
+
|
|
86
|
+
export default {
|
|
87
|
+
components: {
|
|
88
|
+
LModuleTag
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
</script>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 带按钮插槽
|
|
95
|
+
|
|
96
|
+
```vue
|
|
97
|
+
<template>
|
|
98
|
+
<l-module-tag title="旅游投诉处理">
|
|
99
|
+
<template #headerBtn>
|
|
100
|
+
<el-button size="mini">重置</el-button>
|
|
101
|
+
</template>
|
|
102
|
+
</l-module-tag>
|
|
103
|
+
</template>
|
|
104
|
+
|
|
105
|
+
<script>
|
|
106
|
+
import LModuleTag from '@/components/moduleBox/l-module-tag/index.vue'
|
|
107
|
+
|
|
108
|
+
export default {
|
|
109
|
+
components: {
|
|
110
|
+
LModuleTag
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
</script>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 自定义圆形图标颜色
|
|
117
|
+
|
|
118
|
+
```vue
|
|
119
|
+
<template>
|
|
120
|
+
<l-module-tag
|
|
121
|
+
title="停车服务"
|
|
122
|
+
:circleRingBg="'rgba(255, 183, 105, 0.3)'"
|
|
123
|
+
:circleRingShadow="'0px 0px 4px 1px rgba(255,183,105,0.5)'"
|
|
124
|
+
circleBg="rgb(255, 183, 105)"
|
|
125
|
+
:circleShadow="'0px 0px 4px 1px rgba(255,183,105,0.5)'"
|
|
126
|
+
:bottomBackground="'linear-gradient(270deg, rgba(255,183,105,0) 0%, rgba(255,183,105,0.2) 54%, rgba(255,183,105,0.5) 100%)'"
|
|
127
|
+
/>
|
|
128
|
+
</template>
|
|
129
|
+
|
|
130
|
+
<script>
|
|
131
|
+
import LModuleTag from '@/components/moduleBox/l-module-tag/index.vue'
|
|
132
|
+
|
|
133
|
+
export default {
|
|
134
|
+
components: {
|
|
135
|
+
LModuleTag
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
</script>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 完整自定义
|
|
142
|
+
|
|
143
|
+
```vue
|
|
144
|
+
<template>
|
|
145
|
+
<l-module-tag
|
|
146
|
+
title="旅游服务"
|
|
147
|
+
:circleRingWidth="12"
|
|
148
|
+
:circleRingHeight="12"
|
|
149
|
+
:circleWidth="8"
|
|
150
|
+
:circleHeight="8"
|
|
151
|
+
:circleMarginRight="12"
|
|
152
|
+
:titleFontSize="22"
|
|
153
|
+
titleColor="#4CE27E"
|
|
154
|
+
:bottomMarginTop="8"
|
|
155
|
+
:bottomHeight="3"
|
|
156
|
+
>
|
|
157
|
+
<template #headerBtn>
|
|
158
|
+
<el-button size="mini" type="primary">操作</el-button>
|
|
159
|
+
</template>
|
|
160
|
+
</l-module-tag>
|
|
161
|
+
</template>
|
|
162
|
+
|
|
163
|
+
<script>
|
|
164
|
+
import LModuleTag from '@/components/moduleBox/l-module-tag/index.vue'
|
|
165
|
+
|
|
166
|
+
export default {
|
|
167
|
+
components: {
|
|
168
|
+
LModuleTag
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
</script>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## 技术实现
|
|
175
|
+
|
|
176
|
+
### 内联样式生成
|
|
177
|
+
|
|
178
|
+
组件通过 computed 属性动态生成内联样式:
|
|
179
|
+
|
|
180
|
+
```javascript
|
|
181
|
+
computed: {
|
|
182
|
+
circleRingStyle() {
|
|
183
|
+
return {
|
|
184
|
+
marginRight: typeof this.circleMarginRight === 'number'
|
|
185
|
+
? `${this.circleMarginRight}px`
|
|
186
|
+
: this.circleMarginRight,
|
|
187
|
+
width: typeof this.circleRingWidth === 'number'
|
|
188
|
+
? `${this.circleRingWidth}px`
|
|
189
|
+
: this.circleRingWidth,
|
|
190
|
+
background: this.circleRingBg,
|
|
191
|
+
boxShadow: this.circleRingShadow,
|
|
192
|
+
borderRadius: '50%'
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 模板绑定
|
|
199
|
+
|
|
200
|
+
```vue
|
|
201
|
+
<template>
|
|
202
|
+
<div class="l-module-tag" :style="containerStyle">
|
|
203
|
+
<div class="l-module-tag__header" :style="headerStyle">
|
|
204
|
+
<div class="l-module-tag__circle-ring" :style="circleRingStyle">
|
|
205
|
+
<div class="l-module-tag__circle" :style="circleStyle"></div>
|
|
206
|
+
</div>
|
|
207
|
+
<span class="l-module-tag__title" :style="titleStyle">{{ title }}</span>
|
|
208
|
+
<div class="l-module-tag__btn-container">
|
|
209
|
+
<slot name="headerBtn"></slot>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
<div class="l-module-tag__bottom" :style="bottomStyle"></div>
|
|
213
|
+
</div>
|
|
214
|
+
</template>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 注意事项
|
|
218
|
+
|
|
219
|
+
1. **尺寸单位**:Number 类型会自动添加 `px` 单位,String 类型需自行包含单位
|
|
220
|
+
2. **性能优化**:内联样式通过 computed 缓存,避免重复计算
|
|
221
|
+
3. **BEM 命名**:使用 `l-module-tag__header`、`l-module-tag__circle-ring` 等 BEM 命名规范
|
|
222
|
+
4. **插槽支持**:通过 `headerBtn` 插槽可以添加按钮或其他元素
|
|
223
|
+
5. **圆形图标**:圆形图标由外环和内环两层组成,可以分别自定义样式
|
|
224
|
+
|
|
225
|
+
## 适用场景
|
|
226
|
+
|
|
227
|
+
- ✅ 模块标题标签展示
|
|
228
|
+
- ✅ 带图标的标题展示
|
|
229
|
+
- ✅ 需要自定义颜色和样式的场景
|
|
230
|
+
- ✅ 需要添加操作按钮的场景
|
|
231
|
+
|
|
232
|
+
## 更新日志
|
|
233
|
+
|
|
234
|
+
- **v1.0.0** (2026-06-18)
|
|
235
|
+
- 从 `ModuleBoxTag` 重命名为 `l-module-tag`
|
|
236
|
+
- 参考 `l-stat-card` 封装结构进行参数化重构
|
|
237
|
+
- 所有样式配置项抽离为 Props 参数
|
|
238
|
+
- 添加详细的字段注释说明
|
|
239
|
+
- 支持圆形图标、标题、底部线条等样式自定义
|
|
240
|
+
- 使用内联样式实现(类似 Element UI)
|
|
241
|
+
- 支持 `headerBtn` 插槽
|
|
242
|
+
|
|
243
|
+
> AI生成
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="l-module-tag" :style="containerStyle">
|
|
3
|
+
<div class="l-module-tag__header" :style="headerStyle">
|
|
4
|
+
<div class="l-module-tag__circle-ring" :style="circleRingStyle">
|
|
5
|
+
<div class="l-module-tag__circle" :style="circleStyle"></div>
|
|
6
|
+
</div>
|
|
7
|
+
<span class="l-module-tag__title" :style="titleStyle">{{ title }}</span>
|
|
8
|
+
<div class="l-module-tag__btn-container">
|
|
9
|
+
<slot name="headerBtn"></slot>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="l-module-tag__bottom" :style="bottomStyle"></div>
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script>
|
|
17
|
+
import interfaceObj from './interface/index'
|
|
18
|
+
|
|
19
|
+
export default {
|
|
20
|
+
name: 'LModuleTag',
|
|
21
|
+
props: interfaceObj,
|
|
22
|
+
components: {},
|
|
23
|
+
data() {
|
|
24
|
+
return {}
|
|
25
|
+
},
|
|
26
|
+
computed: {
|
|
27
|
+
// 容器样式
|
|
28
|
+
containerStyle() {
|
|
29
|
+
return {
|
|
30
|
+
width: '100%',
|
|
31
|
+
background: 'none',
|
|
32
|
+
paddingTop: '0'
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
// 头部样式
|
|
37
|
+
headerStyle() {
|
|
38
|
+
return {
|
|
39
|
+
fontFamily: this.titleFontFamily,
|
|
40
|
+
fontSize: typeof this.titleFontSize === 'number' ? `${this.titleFontSize}px` : this.titleFontSize,
|
|
41
|
+
color: this.titleColor,
|
|
42
|
+
display: 'flex',
|
|
43
|
+
alignItems: 'center',
|
|
44
|
+
position: 'relative'
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
// 圆形外环样式
|
|
49
|
+
circleRingStyle() {
|
|
50
|
+
return {
|
|
51
|
+
marginRight: typeof this.circleMarginRight === 'number' ? `${this.circleMarginRight}px` : this.circleMarginRight,
|
|
52
|
+
display: 'flex',
|
|
53
|
+
justifyContent: 'center',
|
|
54
|
+
alignItems: 'center',
|
|
55
|
+
width: typeof this.circleRingWidth === 'number' ? `${this.circleRingWidth}px` : this.circleRingWidth,
|
|
56
|
+
height: typeof this.circleRingHeight === 'number' ? `${this.circleRingHeight}px` : this.circleRingHeight,
|
|
57
|
+
background: this.circleRingBg,
|
|
58
|
+
boxShadow: this.circleRingShadow,
|
|
59
|
+
borderRadius: '50%'
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// 圆形内环样式
|
|
64
|
+
circleStyle() {
|
|
65
|
+
return {
|
|
66
|
+
width: typeof this.circleWidth === 'number' ? `${this.circleWidth}px` : this.circleWidth,
|
|
67
|
+
height: typeof this.circleHeight === 'number' ? `${this.circleHeight}px` : this.circleHeight,
|
|
68
|
+
background: this.circleBg,
|
|
69
|
+
boxShadow: this.circleShadow,
|
|
70
|
+
borderRadius: '50%'
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
// 标题样式
|
|
75
|
+
titleStyle() {
|
|
76
|
+
return {}
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
// 按钮容器样式
|
|
80
|
+
btnContainerStyle() {
|
|
81
|
+
return {
|
|
82
|
+
position: 'absolute',
|
|
83
|
+
right: '0'
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
// 底部线条样式
|
|
88
|
+
bottomStyle() {
|
|
89
|
+
return {
|
|
90
|
+
marginTop: typeof this.bottomMarginTop === 'number' ? `${this.bottomMarginTop}px` : this.bottomMarginTop,
|
|
91
|
+
width: '100%',
|
|
92
|
+
height: typeof this.bottomHeight === 'number' ? `${this.bottomHeight}px` : this.bottomHeight,
|
|
93
|
+
background: this.bottomBackground
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
watch: {},
|
|
98
|
+
mounted() {},
|
|
99
|
+
created() {},
|
|
100
|
+
methods: {
|
|
101
|
+
handleReset() {
|
|
102
|
+
this.$emit('handleReset')
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
</script>
|
|
107
|
+
|
|
108
|
+
<style lang="scss" scoped>
|
|
109
|
+
.l-module-tag {
|
|
110
|
+
// 基础样式通过内联样式控制
|
|
111
|
+
|
|
112
|
+
&__header {
|
|
113
|
+
// 头部样式通过内联样式控制
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
&__circle-ring {
|
|
117
|
+
// 圆形外环样式通过内联样式控制
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
&__circle {
|
|
121
|
+
// 圆形内环样式通过内联样式控制
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
&__title {
|
|
125
|
+
// 标题样式通过内联样式控制
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
&__btn-container {
|
|
129
|
+
position: absolute;
|
|
130
|
+
right: 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
&__bottom {
|
|
134
|
+
// 底部线条样式通过内联样式控制
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
</style>
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const interfaceObj = {
|
|
2
|
+
// ========== 基础数据 ==========
|
|
3
|
+
// 标题文本:显示在标签上的标题文字
|
|
4
|
+
title: {
|
|
5
|
+
type: String,
|
|
6
|
+
default: '中文标题'
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
// ========== 圆形图标相关 ==========
|
|
10
|
+
// 圆形外环宽度:外环的宽度
|
|
11
|
+
circleRingWidth: {
|
|
12
|
+
type: [String, Number],
|
|
13
|
+
default: '10px'
|
|
14
|
+
},
|
|
15
|
+
// 圆形外环高度:外环的高度
|
|
16
|
+
circleRingHeight: {
|
|
17
|
+
type: [String, Number],
|
|
18
|
+
default: '10px'
|
|
19
|
+
},
|
|
20
|
+
// 圆形外环背景色:外环的背景颜色
|
|
21
|
+
circleRingBg: {
|
|
22
|
+
type: String,
|
|
23
|
+
default: 'rgba(64, 255, 143, 0.3)'
|
|
24
|
+
},
|
|
25
|
+
// 圆形外环阴影:外环的阴影效果
|
|
26
|
+
circleRingShadow: {
|
|
27
|
+
type: String,
|
|
28
|
+
default: '0px 0px 4px 1px rgba(64,255,143,0.5)'
|
|
29
|
+
},
|
|
30
|
+
// 圆形内环宽度:内环的宽度
|
|
31
|
+
circleWidth: {
|
|
32
|
+
type: [String, Number],
|
|
33
|
+
default: '6px'
|
|
34
|
+
},
|
|
35
|
+
// 圆形内环高度:内环的高度
|
|
36
|
+
circleHeight: {
|
|
37
|
+
type: [String, Number],
|
|
38
|
+
default: '6px'
|
|
39
|
+
},
|
|
40
|
+
// 圆形内环背景色:内环的背景颜色
|
|
41
|
+
circleBg: {
|
|
42
|
+
type: String,
|
|
43
|
+
default: 'rgb(64, 255, 143)'
|
|
44
|
+
},
|
|
45
|
+
// 圆形内环阴影:内环的阴影效果
|
|
46
|
+
circleShadow: {
|
|
47
|
+
type: String,
|
|
48
|
+
default: '0px 0px 4px 1px rgba(64,255,143,0.5)'
|
|
49
|
+
},
|
|
50
|
+
// 圆形右边距:圆形与标题之间的间距
|
|
51
|
+
circleMarginRight: {
|
|
52
|
+
type: [String, Number],
|
|
53
|
+
default: '10px'
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
// ========== 标题文字相关 ==========
|
|
57
|
+
// 标题字体:标题文字的字体族
|
|
58
|
+
titleFontFamily: {
|
|
59
|
+
type: String,
|
|
60
|
+
default: 'YouSheBiaoTiHei'
|
|
61
|
+
},
|
|
62
|
+
// 标题字号:标题文字的大小
|
|
63
|
+
titleFontSize: {
|
|
64
|
+
type: [String, Number],
|
|
65
|
+
default: '20px'
|
|
66
|
+
},
|
|
67
|
+
// 标题颜色:标题文字的颜色
|
|
68
|
+
titleColor: {
|
|
69
|
+
type: String,
|
|
70
|
+
default: '#FFFFFF'
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
// ========== 底部线条相关 ==========
|
|
74
|
+
// 底部线条上边距:线条与标题之间的间距
|
|
75
|
+
bottomMarginTop: {
|
|
76
|
+
type: [String, Number],
|
|
77
|
+
default: '5px'
|
|
78
|
+
},
|
|
79
|
+
// 底部线条高度:线条的高度
|
|
80
|
+
bottomHeight: {
|
|
81
|
+
type: [String, Number],
|
|
82
|
+
default: '2px'
|
|
83
|
+
},
|
|
84
|
+
// 底部线条渐变背景:线条的渐变背景
|
|
85
|
+
bottomBackground: {
|
|
86
|
+
type: String,
|
|
87
|
+
default: 'linear-gradient(270deg, rgba(64,255,143,0) 0%, rgba(64,255,143,0.2) 54%, rgba(64,255,143,0.5) 100%)'
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export default interfaceObj
|