jufubao-base 1.0.340 → 1.0.341-beta1
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/.trae/documents//350/201/232/347/246/217/345/256/235/344/270/232/345/212/241/347/273/204/344/273/266/345/237/272/347/241/200/346/217/222/344/273/266/345/214/205/351/241/271/347/233/256/346/236/266/346/236/204/346/226/207/346/241/243.md +58 -0
- package/ARCHITECTURE.md +171 -0
- package/PRODUCTION_DOCUMENT.md +419 -0
- package/package.json +1 -1
- package/src/components/JfbBaseCardInfo/Attr.js +19 -9
- package/src/components/JfbBaseCardInfo/JfbBaseCardInfo.vue +38 -2
- package/src/components/JfbBaseCardInfo/Mock.js +13 -0
- package/src/components/JfbBaseCardInfoEntry/Attr.js +11 -0
- package/src/components/JfbBaseCardInfoEntry/JfbBaseCardInfoEntry.vue +38 -2
- package/src/components/JfbBaseCardSweepInfo/Attr.js +12 -1
- package/src/components/JfbBaseCardSweepInfo/JfbBaseCardSweepInfo.vue +37 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Attr 面板属性管理重构计划
|
|
2
|
+
|
|
3
|
+
## 任务目标
|
|
4
|
+
|
|
5
|
+
将 Attr 面板属性管理重构为 content, style, advanced 三个部分,并将这些文件统一放在组件库根目录的 cusAttr 文件夹中。
|
|
6
|
+
|
|
7
|
+
## 实施步骤
|
|
8
|
+
|
|
9
|
+
### 1. 创建组件库根目录 cusAttr 文件夹
|
|
10
|
+
|
|
11
|
+
- 在 `src/` 目录下创建 `cusAttr` 文件夹
|
|
12
|
+
- 结构如下:
|
|
13
|
+
```
|
|
14
|
+
src/
|
|
15
|
+
└── cusAttr/
|
|
16
|
+
├── content/
|
|
17
|
+
├── style/
|
|
18
|
+
└── advanced/
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 2. 整理现有属性管理文件
|
|
22
|
+
|
|
23
|
+
- 将现有的 `Attr.js` 文件内容拆分为 content, style, advanced 三个部分
|
|
24
|
+
- 将拆分后的文件放入对应的目录中
|
|
25
|
+
- 确保文件命名规范一致
|
|
26
|
+
|
|
27
|
+
### 3. 修改组件引用方式
|
|
28
|
+
|
|
29
|
+
- 更新所有组件的 Attr 引用方式
|
|
30
|
+
- 从原来的 `import Attr from "./Attr"` 改为从根目录 cusAttr 导入
|
|
31
|
+
- 确保所有组件都使用新的引用方式
|
|
32
|
+
|
|
33
|
+
### 4. 统一属性管理结构
|
|
34
|
+
|
|
35
|
+
- 为每个组件创建对应的属性管理文件
|
|
36
|
+
- 确保文件结构一致:content.js, style.js, advanced.js
|
|
37
|
+
- 统一属性定义的格式和规范
|
|
38
|
+
|
|
39
|
+
### 5. 测试验证
|
|
40
|
+
|
|
41
|
+
- 确保所有组件的 Attr 面板正常显示
|
|
42
|
+
- 验证属性修改是否生效
|
|
43
|
+
- 确保构建过程正常完成
|
|
44
|
+
|
|
45
|
+
## 技术要点
|
|
46
|
+
|
|
47
|
+
1. **文件结构规范**:严格按照 content, style, advanced 分类管理属性
|
|
48
|
+
2. **引用路径统一**:所有组件从根目录 cusAttr 导入属性管理文件
|
|
49
|
+
3. **向后兼容**:确保重构过程中不影响现有功能
|
|
50
|
+
4. **代码质量**:保持代码风格一致,添加必要的注释
|
|
51
|
+
|
|
52
|
+
## 预期成果
|
|
53
|
+
|
|
54
|
+
- 组件库根目录下创建了统一的 cusAttr 文件夹
|
|
55
|
+
- 所有组件的属性管理文件按照 content, style, advanced 分类
|
|
56
|
+
- 组件引用方式统一,代码结构清晰
|
|
57
|
+
- Attr 面板功能正常,属性修改生效
|
|
58
|
+
- 构建过程无错误
|
package/ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# 聚福宝业务组件基础插件包(jufubao-base)项目架构文档
|
|
2
|
+
|
|
3
|
+
## 1. 项目概览
|
|
4
|
+
|
|
5
|
+
**jufubao-base** 是一个基于 **uni-app** 框架的业务组件基础插件包,主要用于构建聚福宝生态下的跨平台应用,支持 H5、微信小程序、App 等多个平台。
|
|
6
|
+
|
|
7
|
+
- **项目类型**:uni-app 跨平台组件库
|
|
8
|
+
- **技术栈**:Vue 2.6.10 + Vuex 3.2.0 + uni-app
|
|
9
|
+
- **核心功能**:提供丰富的业务组件和通用功能模块
|
|
10
|
+
- **应用场景**:聚福宝生态下的各类业务应用开发
|
|
11
|
+
|
|
12
|
+
## 2. 目录结构
|
|
13
|
+
|
|
14
|
+
项目采用清晰的模块化结构,主要包含以下核心目录:
|
|
15
|
+
|
|
16
|
+
| 目录/文件 | 主要功能 | 说明 |
|
|
17
|
+
|---------|---------|------|
|
|
18
|
+
| **src/components/** | 业务组件库 | 包含大量可复用的业务组件,如登录、支付、卡片等 |
|
|
19
|
+
| **src/common/** | 通用工具和服务 | 包含网络请求、存储、日志等通用功能 |
|
|
20
|
+
| **src/api/** | API接口定义 | 定义与后端交互的接口 |
|
|
21
|
+
| **build/** | 构建配置和脚本 | 包含构建、部署、代码生成等脚本 |
|
|
22
|
+
| **commands/** | 命令行工具 | 包含组件创建、更新等命令 |
|
|
23
|
+
| **settings.*.js** | 环境配置文件 | 不同环境的配置信息 |
|
|
24
|
+
|
|
25
|
+
## 3. 核心功能模块
|
|
26
|
+
|
|
27
|
+
### 3.1 业务组件库
|
|
28
|
+
|
|
29
|
+
项目提供了丰富的业务组件,覆盖了聚福宝生态的核心业务场景:
|
|
30
|
+
|
|
31
|
+
- **认证登录**:JfbBaseLogin、JfbBasePhoneLogin 等
|
|
32
|
+
- **支付相关**:JfbBasePay、JfbBaseCardPay 等
|
|
33
|
+
- **卡片管理**:JfbBaseCard、JfbBaseCardDetail 等
|
|
34
|
+
- **地址管理**:JfbBaseAddress、JfbBaseCity 等
|
|
35
|
+
- **订单管理**:JfbBaseOrderList、JfbBaseOrderDetail 等
|
|
36
|
+
- **UI组件**:JfbBaseHeader、JfbBaseFooter、JfbBaseNotice 等
|
|
37
|
+
|
|
38
|
+
每个组件都包含完整的配置选项、API 定义和 Mock 数据,方便开发者快速集成和测试。
|
|
39
|
+
|
|
40
|
+
### 3.2 跨平台支持
|
|
41
|
+
|
|
42
|
+
项目基于 uni-app 框架,实现了一次开发多端运行:
|
|
43
|
+
|
|
44
|
+
- **H5 端**:支持浏览器访问
|
|
45
|
+
- **微信小程序**:支持微信生态
|
|
46
|
+
- **App 端**:支持 iOS 和 Android
|
|
47
|
+
|
|
48
|
+
### 3.3 构建与部署
|
|
49
|
+
|
|
50
|
+
项目提供了完整的构建和部署流程:
|
|
51
|
+
|
|
52
|
+
- **开发环境**:支持热更新和 Mock 数据
|
|
53
|
+
- **构建流程**:自动处理多平台构建
|
|
54
|
+
- **部署**:集成 OSS 上传功能,支持不同环境的部署
|
|
55
|
+
|
|
56
|
+
### 3.4 工具链
|
|
57
|
+
|
|
58
|
+
项目集成了丰富的开发工具:
|
|
59
|
+
|
|
60
|
+
- **代码生成**:通过 `coder` 命令自动生成 API、页面等代码
|
|
61
|
+
- **组件管理**:支持组件的创建、更新和预览
|
|
62
|
+
- **日志系统**:集成 xdLog 日志上报功能
|
|
63
|
+
- **Mock 数据**:方便开发和测试
|
|
64
|
+
|
|
65
|
+
## 4. 技术架构
|
|
66
|
+
|
|
67
|
+
### 4.1 技术栈
|
|
68
|
+
|
|
69
|
+
| 技术/框架 | 版本 | 用途 |
|
|
70
|
+
|---------|------|------|
|
|
71
|
+
| Vue | ^2.6.10 | 前端框架 |
|
|
72
|
+
| Vuex | ^3.2.0 | 状态管理 |
|
|
73
|
+
| uni-app | 2.0.1 | 跨平台框架 |
|
|
74
|
+
| flyio | ^0.6.2 | 网络请求 |
|
|
75
|
+
| less | ^3.12.2 | 样式预处理 |
|
|
76
|
+
| sass | ^1.29.0 | 样式预处理 |
|
|
77
|
+
| webpack | 4.44.2 | 构建工具 |
|
|
78
|
+
|
|
79
|
+
### 4.2 核心架构
|
|
80
|
+
|
|
81
|
+
项目采用分层架构设计:
|
|
82
|
+
|
|
83
|
+
1. **组件层**:业务组件和通用组件
|
|
84
|
+
2. **服务层**:API 调用、数据处理
|
|
85
|
+
3. **工具层**:通用工具函数
|
|
86
|
+
4. **配置层**:环境配置、项目设置
|
|
87
|
+
|
|
88
|
+
### 4.3 数据流
|
|
89
|
+
|
|
90
|
+
- **前端组件** → **Vuex 状态管理** → **API 服务** → **后端接口**
|
|
91
|
+
- **后端响应** → **API 服务** → **Vuex 状态更新** → **前端组件更新**
|
|
92
|
+
|
|
93
|
+
## 5. 核心 API/类/函数
|
|
94
|
+
|
|
95
|
+
### 5.1 全局配置
|
|
96
|
+
|
|
97
|
+
- **settings**:环境配置,包含 API 地址、项目信息等
|
|
98
|
+
- **projectJson**:项目配置信息,包含 xsiteid、template_id 等
|
|
99
|
+
|
|
100
|
+
### 5.2 通用服务
|
|
101
|
+
|
|
102
|
+
- **storage**:本地存储服务
|
|
103
|
+
- **cookie**:Cookie 操作(H5 端)
|
|
104
|
+
- **request**:网络请求服务
|
|
105
|
+
- **xdLog**:日志上报服务
|
|
106
|
+
|
|
107
|
+
### 5.3 核心方法
|
|
108
|
+
|
|
109
|
+
- **checkLoginStatus**:检查用户登录状态
|
|
110
|
+
- **getUserInfo**:获取用户信息
|
|
111
|
+
- **saveLogs**:上报日志
|
|
112
|
+
|
|
113
|
+
### 5.4 组件配置
|
|
114
|
+
|
|
115
|
+
每个组件都通过统一的配置文件定义属性和行为,示例:
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
{
|
|
119
|
+
ele: 'title',
|
|
120
|
+
label: '基础',
|
|
121
|
+
size: 'small',
|
|
122
|
+
groupKey: 'content'
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 6. 开发与部署
|
|
127
|
+
|
|
128
|
+
### 6.1 开发命令
|
|
129
|
+
|
|
130
|
+
| 命令 | 功能 | 说明 |
|
|
131
|
+
|-----|------|------|
|
|
132
|
+
| `npm run dev` | 启动开发服务器 | 开发环境运行 |
|
|
133
|
+
| `npm run build` | 构建生产版本 | 生产环境构建 |
|
|
134
|
+
| `npm run coder` | 代码生成 | 自动生成API、页面等代码 |
|
|
135
|
+
| `npm run create` | 创建组件 | 快速创建新组件 |
|
|
136
|
+
| `npm run update` | 更新组件 | 更新现有组件 |
|
|
137
|
+
|
|
138
|
+
### 6.2 部署流程
|
|
139
|
+
|
|
140
|
+
1. **构建**:`npm run build` 生成生产版本
|
|
141
|
+
2. **部署**:通过 `npm run oss` 命令上传到 OSS
|
|
142
|
+
3. **环境切换**:支持不同环境的部署配置
|
|
143
|
+
|
|
144
|
+
## 7. 技术特点
|
|
145
|
+
|
|
146
|
+
1. **模块化设计**:组件高度模块化,易于复用和维护
|
|
147
|
+
2. **配置化开发**:通过配置文件管理不同环境的设置
|
|
148
|
+
3. **完善的工具链**:提供丰富的命令行工具,提高开发效率
|
|
149
|
+
4. **多平台适配**:基于 uni-app 实现跨平台兼容
|
|
150
|
+
5. **完整的业务覆盖**:涵盖聚福宝生态的核心业务场景
|
|
151
|
+
|
|
152
|
+
## 8. 项目价值
|
|
153
|
+
|
|
154
|
+
- **提高开发效率**:通过复用组件和工具,减少重复开发工作
|
|
155
|
+
- **保证代码质量**:统一的代码规范和架构设计
|
|
156
|
+
- **加速业务迭代**:快速集成和部署新功能
|
|
157
|
+
- **降低维护成本**:模块化设计和完善的文档
|
|
158
|
+
|
|
159
|
+
## 9. 未来规划
|
|
160
|
+
|
|
161
|
+
1. **组件库扩展**:持续增加新的业务组件
|
|
162
|
+
2. **性能优化**:提升组件性能和加载速度
|
|
163
|
+
3. **文档完善**:提供更详细的使用文档和示例
|
|
164
|
+
4. **生态集成**:与更多聚福宝生态产品集成
|
|
165
|
+
5. **技术升级**:考虑升级到 Vue 3 和 uni-app X
|
|
166
|
+
|
|
167
|
+
## 10. 总结
|
|
168
|
+
|
|
169
|
+
jufubao-base 是一个功能完善、设计合理的业务组件基础插件包,为聚福宝生态下的应用开发提供了强大的支持。通过统一的组件库和工具链,开发者可以快速构建高质量的跨平台应用,专注于业务逻辑的实现,而无需关心底层的技术细节。
|
|
170
|
+
|
|
171
|
+
项目的模块化设计和完善的工具链,不仅提高了开发效率,也保证了代码的可维护性和可扩展性,为聚福宝生态的持续发展提供了坚实的技术基础。
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
# 聚福宝业务组件基础插件包(jufubao-base)生产文档
|
|
2
|
+
|
|
3
|
+
## 1. 组件编程思想分析
|
|
4
|
+
|
|
5
|
+
通过对 `src/components/JfbBasexxx` 系列组件的深入分析,我们发现该项目采用了一套完整、规范的组件化开发思想,具体体现在以下几个方面:
|
|
6
|
+
|
|
7
|
+
### 1.1 模块化设计
|
|
8
|
+
|
|
9
|
+
**核心思想**:将业务功能拆分为独立、可复用的模块,每个模块负责特定的业务场景。
|
|
10
|
+
|
|
11
|
+
**实现方式**:
|
|
12
|
+
- 每个组件都有独立的目录结构,包含完整的功能实现
|
|
13
|
+
- 组件间通过明确的接口进行通信,减少耦合
|
|
14
|
+
- 使用 Vue 的组件化机制,支持组件的嵌套和组合
|
|
15
|
+
|
|
16
|
+
**示例**:
|
|
17
|
+
```javascript
|
|
18
|
+
// JfbBaseCard 组件负责卡片管理相关功能
|
|
19
|
+
// JfbBaseLogin 组件负责用户登录相关功能
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 1.2 配置化开发
|
|
23
|
+
|
|
24
|
+
**核心思想**:通过配置文件定义组件的属性和行为,支持可视化编辑和动态调整。
|
|
25
|
+
|
|
26
|
+
**实现方式**:
|
|
27
|
+
- 每个组件都有对应的 `Attr.js` 文件,定义可编辑的属性
|
|
28
|
+
- 通过 `gCPVal` 函数获取配置值(`getContainerPropsValue` 的简化别名)
|
|
29
|
+
- 支持默认值设置,确保配置缺失时的稳定性
|
|
30
|
+
|
|
31
|
+
**示例**:
|
|
32
|
+
```javascript
|
|
33
|
+
// 从容器配置中获取值,如果不存在则使用默认值
|
|
34
|
+
this.cardLayout = gCPVal(container, "cardLayout", "1");
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 1.3 混入机制
|
|
38
|
+
|
|
39
|
+
**核心思想**:通过 Vue 的 mixins 实现代码复用,提取公共逻辑。
|
|
40
|
+
|
|
41
|
+
**实现方式**:
|
|
42
|
+
- 每个组件都有对应的 Mixin.js 文件
|
|
43
|
+
- 提取公共功能到通用 mixins 中,如 `componentsMixins`、`extsMixins`
|
|
44
|
+
- 支持多层混入,实现功能的组合
|
|
45
|
+
|
|
46
|
+
**示例**:
|
|
47
|
+
```javascript
|
|
48
|
+
mixins: [componentsMixins, extsMixins, JfbBaseCardMixin, openDebuggerMixins, colorCardMixins]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 1.4 跨平台适配
|
|
52
|
+
|
|
53
|
+
**核心思想**:使用 uni-app 的条件编译,实现一次开发多端运行。
|
|
54
|
+
|
|
55
|
+
**实现方式**:
|
|
56
|
+
- 使用 `// #ifdef` 和 `// #endif` 语法进行平台判断
|
|
57
|
+
- 为不同平台提供适配的实现
|
|
58
|
+
- 统一平台差异,提供一致的开发体验
|
|
59
|
+
|
|
60
|
+
**示例**:
|
|
61
|
+
```javascript
|
|
62
|
+
// #ifdef H5
|
|
63
|
+
// H5 平台特定实现
|
|
64
|
+
// #endif
|
|
65
|
+
|
|
66
|
+
// #ifdef MP-WEIXIN
|
|
67
|
+
// 微信小程序特定实现
|
|
68
|
+
// #endif
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 1.5 事件驱动
|
|
72
|
+
|
|
73
|
+
**核心思想**:通过事件系统处理组件间通信,实现松耦合的架构。
|
|
74
|
+
|
|
75
|
+
**实现方式**:
|
|
76
|
+
- 使用 `jfbRootExec` 统一调用后端 API
|
|
77
|
+
- 通过自定义事件实现组件内部通信
|
|
78
|
+
- 支持事件冒泡和捕获,实现复杂的交互逻辑
|
|
79
|
+
|
|
80
|
+
**示例**:
|
|
81
|
+
```javascript
|
|
82
|
+
// 调用后端 API
|
|
83
|
+
jfbRootExec("loginCardBind", {
|
|
84
|
+
vm: this,
|
|
85
|
+
data: { card_number: item["card_number"] },
|
|
86
|
+
})
|
|
87
|
+
.then((res) => {
|
|
88
|
+
// 处理响应
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 1.6 状态管理
|
|
93
|
+
|
|
94
|
+
**核心思想**:使用 Vuex 管理全局状态,实现状态的集中控制。
|
|
95
|
+
|
|
96
|
+
**实现方式**:
|
|
97
|
+
- 通过 `mapState` 映射全局状态到组件
|
|
98
|
+
- 使用 mutations 和 actions 处理状态变更
|
|
99
|
+
- 支持模块化的状态管理,按业务领域划分
|
|
100
|
+
|
|
101
|
+
**示例**:
|
|
102
|
+
```javascript
|
|
103
|
+
computed: {
|
|
104
|
+
...mapState(["jfbAuthorize", "siteInfo", "loginParams"]),
|
|
105
|
+
// 其他计算属性
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 1.7 错误处理
|
|
110
|
+
|
|
111
|
+
**核心思想**:完善的错误捕获和日志上报机制,提高系统的稳定性和可维护性。
|
|
112
|
+
|
|
113
|
+
**实现方式**:
|
|
114
|
+
- 使用 try-catch 捕获异常
|
|
115
|
+
- 通过 `$xdLog` 上报错误信息
|
|
116
|
+
- 提供统一的错误处理函数
|
|
117
|
+
|
|
118
|
+
**示例**:
|
|
119
|
+
```javascript
|
|
120
|
+
try {
|
|
121
|
+
// 可能出错的代码
|
|
122
|
+
} catch (err) {
|
|
123
|
+
this.$xdLog.setARMSError(err);
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 1.8 预览模式
|
|
128
|
+
|
|
129
|
+
**核心思想**:支持体验码模式,方便开发和测试。
|
|
130
|
+
|
|
131
|
+
**实现方式**:
|
|
132
|
+
- 提供预览模式开关
|
|
133
|
+
- 支持体验码登录
|
|
134
|
+
- 模拟真实环境,方便功能验证
|
|
135
|
+
|
|
136
|
+
**示例**:
|
|
137
|
+
```javascript
|
|
138
|
+
// 体验码登录
|
|
139
|
+
loginPreview(experience_code) {
|
|
140
|
+
return new Promise((resolve, reject) => {
|
|
141
|
+
jfbRootExec("loginExperience", {
|
|
142
|
+
vm: this,
|
|
143
|
+
data: { experience_code },
|
|
144
|
+
})
|
|
145
|
+
.then(res => resolve(res))
|
|
146
|
+
.catch(err => reject(err));
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## 2. 组件结构规范
|
|
152
|
+
|
|
153
|
+
### 2.1 目录结构
|
|
154
|
+
|
|
155
|
+
每个 JfbBase 组件都遵循统一的目录结构:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
JfbBaseXXX/
|
|
159
|
+
├── Api.js // API 接口定义(根据业务需要选择性生产该文件)
|
|
160
|
+
├── Mock.js // 模拟数据 (根据业务需要选择性生产该文件)
|
|
161
|
+
├── JfbBaseXXX.vue // 组件主体
|
|
162
|
+
├── JfbBaseXXXLess.less // 组件样式
|
|
163
|
+
├── JfbBaseXXXMixin.js // 组件混入
|
|
164
|
+
├── cusAttr/ // 组件级属性管理目录
|
|
165
|
+
│ ├── content.js // 内容相关属性
|
|
166
|
+
│ ├── style.js // 样式相关属性
|
|
167
|
+
│ └── advanced.js // 高级设置属性
|
|
168
|
+
└── [其他辅助文件] // 如子组件、工具函数等
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 2.2 文件命名规范
|
|
172
|
+
|
|
173
|
+
- 组件目录:`JfbBase` + 功能名称(首字母大写)
|
|
174
|
+
- 组件文件:`JfbBase` + 功能名称 + `.vue`
|
|
175
|
+
- 样式文件:`JfbBase` + 功能名称 + `Less.less`
|
|
176
|
+
- 混入文件:`JfbBase` + 功能名称 + `Mixin.js`
|
|
177
|
+
|
|
178
|
+
### 2.3 组件注册规范
|
|
179
|
+
|
|
180
|
+
- 使用全局注册和局部注册相结合的方式
|
|
181
|
+
- 遵循 Vue 组件注册规范
|
|
182
|
+
- 支持按需引入,减少打包体积
|
|
183
|
+
|
|
184
|
+
### 2.4 Attr 面板属性管理
|
|
185
|
+
|
|
186
|
+
**核心思想**:将 Attr 面板属性分为 content, style, advanced 三个部分,统一管理组件的编辑属性。
|
|
187
|
+
|
|
188
|
+
**实现方式**:
|
|
189
|
+
- 在组件库根目录创建 `cusAttr` 文件夹
|
|
190
|
+
- 每个组件的属性管理文件放在对应的 `cusAttr` 目录中
|
|
191
|
+
- 属性文件分为 content.js, style.js, advanced.js 三个部分
|
|
192
|
+
|
|
193
|
+
**目录结构**:
|
|
194
|
+
```
|
|
195
|
+
jufubao-base/
|
|
196
|
+
└── src/components
|
|
197
|
+
└── cusAttr/ # 组件库根目录的属性管理目录
|
|
198
|
+
├── content/ # 内容相关属性
|
|
199
|
+
├── style/ # 样式相关属性
|
|
200
|
+
└── advanced/ # 高级设置属性
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**使用方式**:
|
|
204
|
+
```javascript
|
|
205
|
+
// 从组件库根目录的 cusAttr 导入属性管理文件
|
|
206
|
+
import contentAttr from "@/cusAttr/content/JfbBaseCard";
|
|
207
|
+
import styleAttr from "@/cusAttr/style/JfbBaseCard";
|
|
208
|
+
import advancedAttr from "@/cusAttr/advanced/JfbBaseCard";
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## 3. 核心功能模块
|
|
212
|
+
|
|
213
|
+
### 3.1 卡片管理
|
|
214
|
+
|
|
215
|
+
**功能说明**:处理卡片的绑定、登录、查看详情等操作。
|
|
216
|
+
|
|
217
|
+
**核心组件**:`JfbBaseCard`、`JfbBaseCardDetail`、`JfbBaseCardBind`
|
|
218
|
+
|
|
219
|
+
**主要功能**:
|
|
220
|
+
- 卡片绑定(扫码绑定、链接绑定)
|
|
221
|
+
- 卡片登录
|
|
222
|
+
- 卡片列表展示
|
|
223
|
+
- 卡片详情查看
|
|
224
|
+
- 可转换卡片管理
|
|
225
|
+
|
|
226
|
+
### 3.2 登录系统
|
|
227
|
+
|
|
228
|
+
**功能说明**:处理用户登录相关操作,支持多种登录方式。
|
|
229
|
+
|
|
230
|
+
**核心组件**:`JfbBaseLogin`、`JfbBaseLoginForgetPwd`、`JfbBaseLoginSetPwd`
|
|
231
|
+
|
|
232
|
+
**主要功能**:
|
|
233
|
+
- 快捷登录(微信、钉钉等)
|
|
234
|
+
- 账号密码登录
|
|
235
|
+
- 验证码登录
|
|
236
|
+
- 忘记密码
|
|
237
|
+
- 静默登录
|
|
238
|
+
|
|
239
|
+
### 3.3 地址管理
|
|
240
|
+
|
|
241
|
+
**功能说明**:处理用户地址相关操作。
|
|
242
|
+
|
|
243
|
+
**核心组件**:`JfbBaseAddress`、`JfbBaseCity`
|
|
244
|
+
|
|
245
|
+
**主要功能**:
|
|
246
|
+
- 地址列表
|
|
247
|
+
- 地址选择
|
|
248
|
+
- 地址编辑
|
|
249
|
+
- 城市选择
|
|
250
|
+
|
|
251
|
+
### 3.4 订单管理
|
|
252
|
+
|
|
253
|
+
**功能说明**:处理订单相关操作。
|
|
254
|
+
|
|
255
|
+
**核心组件**:`JfbBaseOrderList`、`JfbBaseOrderDetail`、`JfbBaseAfterSales`
|
|
256
|
+
|
|
257
|
+
**主要功能**:
|
|
258
|
+
- 订单列表
|
|
259
|
+
- 订单详情
|
|
260
|
+
- 售后服务
|
|
261
|
+
- 物流查询
|
|
262
|
+
|
|
263
|
+
### 3.5 UI 组件
|
|
264
|
+
|
|
265
|
+
**功能说明**:提供通用的 UI 组件。
|
|
266
|
+
|
|
267
|
+
**核心组件**:`JfbBaseHeader`、`JfbBaseFooter`、`JfbBaseNotice`
|
|
268
|
+
|
|
269
|
+
**主要功能**:
|
|
270
|
+
- 头部导航
|
|
271
|
+
- 底部导航
|
|
272
|
+
- 通知栏
|
|
273
|
+
- 背景设置
|
|
274
|
+
|
|
275
|
+
## 4. 技术栈与依赖
|
|
276
|
+
|
|
277
|
+
### 4.1 核心技术栈
|
|
278
|
+
|
|
279
|
+
| 技术/框架 | 版本 | 用途 |
|
|
280
|
+
|---------|------|------|
|
|
281
|
+
| Vue | ^2.6.10 | 前端框架 |
|
|
282
|
+
| Vuex | ^3.2.0 | 状态管理 |
|
|
283
|
+
| uni-app | 2.0.1 | 跨平台框架 |
|
|
284
|
+
| less | ^3.12.2 | 样式预处理 |
|
|
285
|
+
| flyio | ^0.6.2 | 网络请求 |
|
|
286
|
+
|
|
287
|
+
### 4.2 关键依赖
|
|
288
|
+
|
|
289
|
+
| 依赖 | 版本 | 用途 |
|
|
290
|
+
|------|------|------|
|
|
291
|
+
| gxd-uni-library-editx | 1.0.17-beta2 | 编辑组件库 |
|
|
292
|
+
| js-base64 | ^2.6.4 | Base64 编码解码 |
|
|
293
|
+
| color | ^3.1.3 | 颜色处理 |
|
|
294
|
+
| vconsole | ^3.15.0 | 调试工具 |
|
|
295
|
+
|
|
296
|
+
## 5. 开发与部署流程
|
|
297
|
+
|
|
298
|
+
### 5.1 开发流程
|
|
299
|
+
|
|
300
|
+
1. **环境搭建**:安装依赖,配置开发环境
|
|
301
|
+
2. **组件创建**:使用 `npm run create` 创建新组件
|
|
302
|
+
3. **组件开发**:实现组件功能,编写样式和逻辑
|
|
303
|
+
4. **组件测试**:使用体验码模式进行测试
|
|
304
|
+
5. **组件更新**:使用 `npm run update` 更新组件
|
|
305
|
+
|
|
306
|
+
### 5.2 部署流程
|
|
307
|
+
|
|
308
|
+
1. **构建**:使用 `npm run build` 构建生产版本
|
|
309
|
+
2. **上传**:使用 `npm run oss` 上传到 OSS
|
|
310
|
+
3. **发布**:使用 `npm run release` 发布组件
|
|
311
|
+
|
|
312
|
+
## 6. 性能优化策略
|
|
313
|
+
|
|
314
|
+
### 6.1 代码优化
|
|
315
|
+
|
|
316
|
+
- **按需加载**:使用动态导入,减少初始加载体积
|
|
317
|
+
- **代码分割**:按业务模块分割代码,提高加载速度
|
|
318
|
+
- **缓存策略**:合理使用缓存,减少重复请求
|
|
319
|
+
|
|
320
|
+
### 6.2 渲染优化
|
|
321
|
+
|
|
322
|
+
- **虚拟列表**:处理长列表,减少 DOM 节点
|
|
323
|
+
- **懒加载**:图片和组件的懒加载
|
|
324
|
+
- **防抖节流**:优化高频操作
|
|
325
|
+
|
|
326
|
+
### 6.3 网络优化
|
|
327
|
+
|
|
328
|
+
- **请求合并**:合并多个请求,减少网络开销
|
|
329
|
+
- **请求缓存**:缓存重复请求的结果
|
|
330
|
+
- **压缩传输**:使用 Gzip 压缩传输数据
|
|
331
|
+
|
|
332
|
+
## 7. 最佳实践
|
|
333
|
+
|
|
334
|
+
### 7.1 组件开发
|
|
335
|
+
|
|
336
|
+
1. **遵循规范**:严格遵循项目的命名规范和目录结构
|
|
337
|
+
2. **功能单一**:每个组件负责单一的业务功能
|
|
338
|
+
3. **配置化**:通过配置文件定义组件属性,支持可视化编辑
|
|
339
|
+
4. **跨平台**:考虑不同平台的兼容性
|
|
340
|
+
5. **错误处理**:完善的错误捕获和日志上报
|
|
341
|
+
|
|
342
|
+
### 7.2 代码风格
|
|
343
|
+
|
|
344
|
+
1. **命名规范**:使用语义化的命名
|
|
345
|
+
2. **代码缩进**:使用 2 空格缩进
|
|
346
|
+
3. **注释完善**:为关键代码添加注释
|
|
347
|
+
4. **代码简洁**:避免冗余代码,保持代码简洁
|
|
348
|
+
|
|
349
|
+
### 7.3 调试技巧
|
|
350
|
+
|
|
351
|
+
1. **体验码模式**:使用体验码进行功能测试
|
|
352
|
+
2. **日志调试**:使用 `console.log` 和 `$xdLog` 进行调试
|
|
353
|
+
3. **断点调试**:使用浏览器或 IDE 的断点功能
|
|
354
|
+
4. **网络调试**:使用浏览器的网络面板查看请求
|
|
355
|
+
|
|
356
|
+
## 8. 常见问题与解决方案
|
|
357
|
+
|
|
358
|
+
### 8.1 跨平台兼容性问题
|
|
359
|
+
|
|
360
|
+
**问题**:不同平台的 API 差异导致功能异常
|
|
361
|
+
|
|
362
|
+
**解决方案**:
|
|
363
|
+
- 使用条件编译,为不同平台提供适配的实现
|
|
364
|
+
- 统一 API 调用方式,封装平台差异
|
|
365
|
+
- 充分测试,确保在所有目标平台上正常运行
|
|
366
|
+
|
|
367
|
+
### 8.2 性能问题
|
|
368
|
+
|
|
369
|
+
**问题**:组件加载缓慢,运行卡顿
|
|
370
|
+
|
|
371
|
+
**解决方案**:
|
|
372
|
+
- 优化代码结构,减少不必要的计算
|
|
373
|
+
- 使用虚拟列表处理长列表
|
|
374
|
+
- 合理使用缓存,减少重复请求
|
|
375
|
+
- 优化图片资源,使用适当的尺寸和格式
|
|
376
|
+
|
|
377
|
+
### 8.3 配置问题
|
|
378
|
+
|
|
379
|
+
**问题**:组件配置不生效或配置错误
|
|
380
|
+
|
|
381
|
+
**解决方案**:
|
|
382
|
+
- 检查配置路径是否正确
|
|
383
|
+
- 确保配置值的类型正确
|
|
384
|
+
- 使用默认值,确保配置缺失时的稳定性
|
|
385
|
+
- 查看控制台日志,定位配置错误
|
|
386
|
+
|
|
387
|
+
## 9. 未来发展方向
|
|
388
|
+
|
|
389
|
+
### 9.1 技术升级
|
|
390
|
+
|
|
391
|
+
- **Vue 3**:考虑升级到 Vue 3,使用 Composition API
|
|
392
|
+
- **uni-app X**:跟进 uni-app 的最新版本
|
|
393
|
+
- **TypeScript**:引入 TypeScript,提高代码类型安全性
|
|
394
|
+
|
|
395
|
+
### 9.2 功能扩展
|
|
396
|
+
|
|
397
|
+
- **组件库丰富**:增加更多业务组件,覆盖更多场景
|
|
398
|
+
- **功能增强**:为现有组件增加更多功能
|
|
399
|
+
- **国际化**:支持多语言
|
|
400
|
+
|
|
401
|
+
### 9.3 工具链完善
|
|
402
|
+
|
|
403
|
+
- **脚手架**:提供更完善的组件创建脚手架
|
|
404
|
+
- **文档**:完善组件文档,提供更多示例
|
|
405
|
+
- **测试**:增加自动化测试,提高代码质量
|
|
406
|
+
|
|
407
|
+
## 10. 总结
|
|
408
|
+
|
|
409
|
+
聚福宝业务组件基础插件包(jufubao-base)采用了一套完整、规范的组件化开发思想,通过模块化设计、配置化开发、混入机制、跨平台适配等技术手段,实现了高效、可维护的组件库。
|
|
410
|
+
|
|
411
|
+
该项目的编程思想和技术实践,为我们提供了宝贵的参考:
|
|
412
|
+
|
|
413
|
+
1. **模块化设计**:提高代码复用性和可维护性
|
|
414
|
+
2. **配置化开发**:支持可视化编辑,提高开发效率
|
|
415
|
+
3. **跨平台适配**:实现一次开发多端运行
|
|
416
|
+
4. **统一的代码规范**:保证代码质量和一致性
|
|
417
|
+
5. **完善的工具链**:提高开发和部署效率
|
|
418
|
+
|
|
419
|
+
通过学习和借鉴这些编程思想,我们可以在未来的项目中构建更加高效、可维护的前端应用。
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@ export default {
|
|
|
8
8
|
label: '票券绑定成功回跳票券列表地址:',
|
|
9
9
|
ele: 'xd-select-pages-path',
|
|
10
10
|
valueKey: 'back_url',
|
|
11
|
-
groupKey:'advanced',
|
|
11
|
+
groupKey: 'advanced',
|
|
12
12
|
placeholder: '请选择票券绑定成功回跳票券列表地址',
|
|
13
13
|
value: null,
|
|
14
14
|
setting: {
|
|
@@ -20,7 +20,7 @@ export default {
|
|
|
20
20
|
label: '票券绑定成功回跳票券详情地址:',
|
|
21
21
|
ele: 'xd-select-pages-path',
|
|
22
22
|
valueKey: 'back_detail_url',
|
|
23
|
-
groupKey:'advanced',
|
|
23
|
+
groupKey: 'advanced',
|
|
24
24
|
placeholder: '请选择票券绑定成功回跳票券详情地址',
|
|
25
25
|
value: null,
|
|
26
26
|
setting: {
|
|
@@ -32,7 +32,7 @@ export default {
|
|
|
32
32
|
label: '我的票券跳转地址:',
|
|
33
33
|
ele: 'xd-select-pages-path',
|
|
34
34
|
valueKey: 'my_card_url',
|
|
35
|
-
groupKey:'advanced',
|
|
35
|
+
groupKey: 'advanced',
|
|
36
36
|
placeholder: '请选择我的票券跳转地址',
|
|
37
37
|
value: null,
|
|
38
38
|
setting: {
|
|
@@ -44,20 +44,31 @@ export default {
|
|
|
44
44
|
label: "票券过期是否展示余额",
|
|
45
45
|
ele: "xd-radio",
|
|
46
46
|
valueKey: "is_show_balance",
|
|
47
|
-
groupKey:'content',
|
|
47
|
+
groupKey: 'content',
|
|
48
48
|
value: "N",
|
|
49
49
|
list: [
|
|
50
|
-
{label: "是", value: "Y"},
|
|
51
|
-
{label: "否", value: "N"},
|
|
50
|
+
{ label: "是", value: "Y" },
|
|
51
|
+
{ label: "否", value: "N" },
|
|
52
52
|
]
|
|
53
53
|
},
|
|
54
|
+
{
|
|
55
|
+
label: "配置套餐描述是否默认展开:",
|
|
56
|
+
ele: "xd-radio",
|
|
57
|
+
valueKey: "isExpandDesc",
|
|
58
|
+
value: "N",
|
|
59
|
+
list: [
|
|
60
|
+
{ label: "展示", value: "Y" },
|
|
61
|
+
{ label: "隐藏", value: "N" }
|
|
62
|
+
],
|
|
63
|
+
groupKey: "content",
|
|
64
|
+
},
|
|
54
65
|
{
|
|
55
66
|
label: '券号框自定义文案:',
|
|
56
67
|
ele: 'el-input',
|
|
57
68
|
type: 'text',
|
|
58
69
|
valueKey: 'card_num_placeholder',
|
|
59
70
|
value: '',
|
|
60
|
-
groupKey:'content',
|
|
71
|
+
groupKey: 'content',
|
|
61
72
|
placeholder: '请输入券号框自定义文案',
|
|
62
73
|
className: 'input80'
|
|
63
74
|
},
|
|
@@ -65,12 +76,11 @@ export default {
|
|
|
65
76
|
label: '密码框自定义文案:',
|
|
66
77
|
ele: 'el-input',
|
|
67
78
|
type: 'text',
|
|
68
|
-
groupKey:'content',
|
|
79
|
+
groupKey: 'content',
|
|
69
80
|
valueKey: 'card_pwd_placeholder',
|
|
70
81
|
value: '',
|
|
71
82
|
placeholder: '请输入密码框自定义文案',
|
|
72
83
|
className: 'input80'
|
|
73
84
|
},
|
|
74
|
-
|
|
75
85
|
],
|
|
76
86
|
};
|
|
@@ -154,7 +154,13 @@
|
|
|
154
154
|
|
|
155
155
|
<!-- 底部业务线描述 -->
|
|
156
156
|
<view class="jfb-base-card-info__body-type-choose-item-business">
|
|
157
|
-
|
|
157
|
+
<view :class="{ 'expanded': isItemExpanded === item.multiple_id }">
|
|
158
|
+
功能说明: {{ item.multiple_desc}}
|
|
159
|
+
</view>
|
|
160
|
+
<view :style="{color:mainColor}" v-if="isExpandDesc === 'Y'" class="jfb-base-card-info__body-type-choose-item-business-expand" @click="toggleExpand(item.multiple_id)">
|
|
161
|
+
{{ isItemExpanded === item.multiple_id ? '收起描述' : '展开描述' }}
|
|
162
|
+
<XdFontIcon style="margin-left:20rpx" size="26" :icon="isItemExpanded === item.multiple_id?'iconshang_up':'iconxia_down'"></XdFontIcon>
|
|
163
|
+
</view>
|
|
158
164
|
</view>
|
|
159
165
|
</view>
|
|
160
166
|
|
|
@@ -249,6 +255,8 @@ export default {
|
|
|
249
255
|
], // 票券类型列表
|
|
250
256
|
multiple_id: '', // 多场景ID
|
|
251
257
|
multiple_scene: '', // 多场景场景
|
|
258
|
+
isExpandDesc: "N", // 配置套餐描述是否默认展开
|
|
259
|
+
isItemExpanded: null, // 当前展开的项目ID
|
|
252
260
|
};
|
|
253
261
|
},
|
|
254
262
|
computed: {
|
|
@@ -395,6 +403,8 @@ export default {
|
|
|
395
403
|
this.card_pwd_placeholder = getContainerPropsValue(container, "content.card_pwd_placeholder", "请输入密码");
|
|
396
404
|
this.is_show_balance = getContainerPropsValue(container, 'content.is_show_balance', "N");
|
|
397
405
|
this.my_card_url = getContainerPropsValue(container, 'content.my_card_url', { value: "" }).value;
|
|
406
|
+
this.isExpandDesc = getContainerPropsValue(container,'content.isExpandDesc',"N")
|
|
407
|
+
this.isExpandDesc = "Y"
|
|
398
408
|
},
|
|
399
409
|
onJfbLoad(options) {
|
|
400
410
|
this.qrcode = options.qrcode || options.pa;
|
|
@@ -551,6 +561,9 @@ export default {
|
|
|
551
561
|
this.multiple_id = item.multiple_id;
|
|
552
562
|
this.multiple_scene = item.multiple_scene;
|
|
553
563
|
this.handleToLink()
|
|
564
|
+
},
|
|
565
|
+
toggleExpand(multipleId) {
|
|
566
|
+
this.isItemExpanded = this.isItemExpanded === multipleId ? null : multipleId;
|
|
554
567
|
}
|
|
555
568
|
},
|
|
556
569
|
};
|
|
@@ -769,7 +782,30 @@ export default {
|
|
|
769
782
|
&-business {
|
|
770
783
|
font-size: unit(24, rpx);
|
|
771
784
|
color: #999;
|
|
772
|
-
line-height: unit(36, rpx);
|
|
785
|
+
line-height: unit(36, rpx);
|
|
786
|
+
& > view:first-child {
|
|
787
|
+
display: -webkit-box;
|
|
788
|
+
-webkit-line-clamp: 1;
|
|
789
|
+
-webkit-box-orient: vertical;
|
|
790
|
+
overflow: hidden;
|
|
791
|
+
text-overflow: ellipsis;
|
|
792
|
+
margin-bottom: unit(10, rpx);
|
|
793
|
+
|
|
794
|
+
&.expanded {
|
|
795
|
+
-webkit-line-clamp: 9999;
|
|
796
|
+
overflow: visible;
|
|
797
|
+
text-overflow: clip;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
&-expand {
|
|
802
|
+
font-size: unit(26, rpx);
|
|
803
|
+
text-align: center;
|
|
804
|
+
margin-top: unit(20, rpx);
|
|
805
|
+
display: flex;
|
|
806
|
+
align-items: center;
|
|
807
|
+
justify-content: center;
|
|
808
|
+
}
|
|
773
809
|
}
|
|
774
810
|
|
|
775
811
|
&-btn-wrap {
|
|
@@ -15,6 +15,19 @@ module.exports = {
|
|
|
15
15
|
"request_id": "741c41d86c5ae0cf",
|
|
16
16
|
"main_business_code_name": "蛋糕(勿改)",
|
|
17
17
|
"other_card_point": 4073,
|
|
18
|
+
"multiple_info": {
|
|
19
|
+
is_support_multiple: "Y",
|
|
20
|
+
multiple_list: [
|
|
21
|
+
{
|
|
22
|
+
card_type_name: '多余额卡',
|
|
23
|
+
end_time: "2024-10-31 23:59:59",
|
|
24
|
+
card_number: "101001000005195",
|
|
25
|
+
card_point: 500,
|
|
26
|
+
"multiple_desc": "蛋糕、电影、礼包、在线选座、电影选座、在线选座(3D)、电影选座(3D)、提货商城、提货商城(3D)、蛋糕商城",
|
|
27
|
+
multiple_id: 1
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
18
31
|
},
|
|
19
32
|
pwdCardBind: { "id": 20, "request_id": "91f76bd11d5889be" },
|
|
20
33
|
qrcodeCardBind: {},
|
|
@@ -57,6 +57,17 @@ export default {
|
|
|
57
57
|
{label: "否", value: "N"},
|
|
58
58
|
]
|
|
59
59
|
},
|
|
60
|
+
{
|
|
61
|
+
label: "配置套餐描述是否默认展开:",
|
|
62
|
+
ele: "xd-radio",
|
|
63
|
+
valueKey: "isExpandDesc",
|
|
64
|
+
value: "N",
|
|
65
|
+
list: [
|
|
66
|
+
{ label: "展示", value: "Y" },
|
|
67
|
+
{ label: "隐藏", value: "N" }
|
|
68
|
+
],
|
|
69
|
+
groupKey: "content",
|
|
70
|
+
},
|
|
60
71
|
{
|
|
61
72
|
label: "是否展示主业务线",
|
|
62
73
|
ele: "xd-radio",
|
|
@@ -174,7 +174,13 @@
|
|
|
174
174
|
|
|
175
175
|
<!-- 底部业务线描述 -->
|
|
176
176
|
<view class="jfb-base-card-info-entry__body-type-choose-item-business">
|
|
177
|
-
|
|
177
|
+
<view :class="{ 'expanded': isItemExpanded === item.multiple_id }">
|
|
178
|
+
功能说明: {{ item.multiple_desc}}
|
|
179
|
+
</view>
|
|
180
|
+
<view v-if="isExpandDesc === 'Y'" :style="{color:mainColor}" class="jfb-base-card-info-entry__body-type-choose-item-business-expand" @click="toggleExpand(item.multiple_id)">
|
|
181
|
+
{{ isItemExpanded === item.multiple_id ? '收起描述' : '展开描述' }}
|
|
182
|
+
<xd-font-icon style="margin-left:20rpx" size="26" :icon="isItemExpanded === item.multiple_id?'iconshang_up':'iconxia_down'"></xd-font-icon>
|
|
183
|
+
</view>
|
|
178
184
|
</view>
|
|
179
185
|
</view>
|
|
180
186
|
|
|
@@ -254,6 +260,8 @@ export default {
|
|
|
254
260
|
cardTypeList: [], // 票券类型列表
|
|
255
261
|
multiple_id: '', // 多场景ID
|
|
256
262
|
multiple_scene: '', // 多场景场景
|
|
263
|
+
isExpandDesc: "N", // 配置套餐描述是否默认展开
|
|
264
|
+
isItemExpanded: null, // 当前展开的项目ID
|
|
257
265
|
};
|
|
258
266
|
},
|
|
259
267
|
watch: {
|
|
@@ -410,7 +418,8 @@ export default {
|
|
|
410
418
|
this.card_pwd_placeholder = getContainerPropsValue(container, "content.card_pwd_placeholder", "请输入密码");
|
|
411
419
|
this.my_card_url = getContainerPropsValue(container, 'content.my_card_url', { value: "" }).value;
|
|
412
420
|
this.is_show_balance = getContainerPropsValue(container, 'content.is_show_balance', "N");
|
|
413
|
-
this.isShowBuss = getContainerPropsValue(container, 'content.isShowBuss', 'N')
|
|
421
|
+
this.isShowBuss = getContainerPropsValue(container, 'content.isShowBuss', 'N');
|
|
422
|
+
this.isExpandDesc = getContainerPropsValue(container, 'content.isExpandDesc', "N");
|
|
414
423
|
//'wechat_mini_program|default'
|
|
415
424
|
this.entryGroupId = getContainerPropsValue(container,"content.entryGroupId","default");
|
|
416
425
|
},
|
|
@@ -588,6 +597,9 @@ export default {
|
|
|
588
597
|
this.hasCon = data;
|
|
589
598
|
}
|
|
590
599
|
console.log('onJfbCustomEvent',action, data);
|
|
600
|
+
},
|
|
601
|
+
toggleExpand(multipleId) {
|
|
602
|
+
this.isItemExpanded = this.isItemExpanded === multipleId ? null : multipleId;
|
|
591
603
|
}
|
|
592
604
|
},
|
|
593
605
|
};
|
|
@@ -1097,6 +1109,30 @@ export default {
|
|
|
1097
1109
|
font-size: unit(24, rpx);
|
|
1098
1110
|
color: #999;
|
|
1099
1111
|
line-height: unit(36, rpx);
|
|
1112
|
+
|
|
1113
|
+
& > view:first-child {
|
|
1114
|
+
display: -webkit-box;
|
|
1115
|
+
-webkit-line-clamp: 1;
|
|
1116
|
+
-webkit-box-orient: vertical;
|
|
1117
|
+
overflow: hidden;
|
|
1118
|
+
text-overflow: ellipsis;
|
|
1119
|
+
margin-bottom: unit(10, rpx);
|
|
1120
|
+
|
|
1121
|
+
&.expanded {
|
|
1122
|
+
-webkit-line-clamp: 9999;
|
|
1123
|
+
overflow: visible;
|
|
1124
|
+
text-overflow: clip;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
&-expand {
|
|
1129
|
+
font-size: unit(26, rpx);
|
|
1130
|
+
text-align: center;
|
|
1131
|
+
margin-top: unit(20, rpx);
|
|
1132
|
+
display: flex;
|
|
1133
|
+
align-items: center;
|
|
1134
|
+
justify-content: center;
|
|
1135
|
+
}
|
|
1100
1136
|
}
|
|
1101
1137
|
|
|
1102
1138
|
&-btn-wrap {
|
|
@@ -38,6 +38,17 @@ export default {
|
|
|
38
38
|
{label: "是", value: "Y"},
|
|
39
39
|
{label: "否", value: "N"},
|
|
40
40
|
]
|
|
41
|
-
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
label: "配置套餐描述是否默认展开:",
|
|
44
|
+
ele: "xd-radio",
|
|
45
|
+
valueKey: "isExpandDesc",
|
|
46
|
+
value: "N",
|
|
47
|
+
list: [
|
|
48
|
+
{ label: "展示", value: "Y" },
|
|
49
|
+
{ label: "隐藏", value: "N" }
|
|
50
|
+
],
|
|
51
|
+
groupKey: "content",
|
|
52
|
+
},
|
|
42
53
|
],
|
|
43
54
|
};
|
|
@@ -109,7 +109,13 @@
|
|
|
109
109
|
|
|
110
110
|
<!-- 底部业务线描述 -->
|
|
111
111
|
<view class="jfb-base-card-sweep-info__body-type-choose-item-business">
|
|
112
|
-
|
|
112
|
+
<view :class="{ 'expanded': isItemExpanded === item.multiple_id }">
|
|
113
|
+
功能说明: {{ item.multiple_desc}}
|
|
114
|
+
</view>
|
|
115
|
+
<view v-if="isExpandDesc === 'Y'" :style="{color:mainColor}" class="jfb-base-card-sweep-info__body-type-choose-item-business-expand" @click="toggleExpand(item.multiple_id)">
|
|
116
|
+
{{ isItemExpanded === item.multiple_id ? '收起描述' : '展开描述' }}
|
|
117
|
+
<xd-font-icon style="margin-left:20rpx" size="26" :icon="isItemExpanded === item.multiple_id?'iconshang_up':'iconxia_down'"></xd-font-icon>
|
|
118
|
+
</view>
|
|
113
119
|
</view>
|
|
114
120
|
</view>
|
|
115
121
|
|
|
@@ -193,6 +199,8 @@ export default {
|
|
|
193
199
|
], // 票券类型列表
|
|
194
200
|
multiple_id: '', // 多场景ID
|
|
195
201
|
multiple_scene: '', // 多场景场景
|
|
202
|
+
isExpandDesc: "N", // 配置套餐描述是否默认展开
|
|
203
|
+
isItemExpanded: null, // 当前展开的项目ID
|
|
196
204
|
};
|
|
197
205
|
},
|
|
198
206
|
watch: {
|
|
@@ -312,6 +320,7 @@ export default {
|
|
|
312
320
|
this.backUrl = getContainerPropsValue( this.container, "content.back_url", { value: "" }).value;
|
|
313
321
|
this.back_detail_url = getContainerPropsValue( this.container, "content.back_detail_url", { value: "" }).value;
|
|
314
322
|
this.is_show_balance = getContainerPropsValue(this.container, 'content.is_show_balance', "N");
|
|
323
|
+
this.isExpandDesc = getContainerPropsValue(this.container, 'content.isExpandDesc', "N");
|
|
315
324
|
},
|
|
316
325
|
handleConfirmBind(item) {
|
|
317
326
|
if (!item) {
|
|
@@ -406,6 +415,9 @@ export default {
|
|
|
406
415
|
this.hasCon = data;
|
|
407
416
|
}
|
|
408
417
|
console.log('onJfbCustomEvent',action, data);
|
|
418
|
+
},
|
|
419
|
+
toggleExpand(multipleId) {
|
|
420
|
+
this.isItemExpanded = this.isItemExpanded === multipleId ? null : multipleId;
|
|
409
421
|
}
|
|
410
422
|
},
|
|
411
423
|
};
|
|
@@ -612,6 +624,30 @@ export default {
|
|
|
612
624
|
font-size: unit(24, rpx);
|
|
613
625
|
color: #999;
|
|
614
626
|
line-height: unit(36, rpx);
|
|
627
|
+
|
|
628
|
+
& > view:first-child {
|
|
629
|
+
display: -webkit-box;
|
|
630
|
+
-webkit-line-clamp: 1;
|
|
631
|
+
-webkit-box-orient: vertical;
|
|
632
|
+
overflow: hidden;
|
|
633
|
+
text-overflow: ellipsis;
|
|
634
|
+
margin-bottom: unit(10, rpx);
|
|
635
|
+
|
|
636
|
+
&.expanded {
|
|
637
|
+
-webkit-line-clamp: 9999;
|
|
638
|
+
overflow: visible;
|
|
639
|
+
text-overflow: clip;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
&-expand {
|
|
644
|
+
font-size: unit(26, rpx);
|
|
645
|
+
text-align: center;
|
|
646
|
+
margin-top: unit(20, rpx);
|
|
647
|
+
display: flex;
|
|
648
|
+
align-items: center;
|
|
649
|
+
justify-content: center;
|
|
650
|
+
}
|
|
615
651
|
}
|
|
616
652
|
|
|
617
653
|
&-btn-wrap {
|