cloudcc-cli 2.3.0 → 2.3.1
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/.cloudcc-cache.json +4 -52
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +15 -1
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +82 -8
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +13 -0
- package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +234 -77
- package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +37 -216
- package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +9 -6
- package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +99 -5
- package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +15 -0
- package/.cursor/skills/cloudcc-cli-dev/SKILL.md +29 -7
- package/.cursor/skills/cloudcc-cli-dev/STATIC-RESOURCE-API.md +60 -0
- package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_PAGE.md +216 -0
- package/.cursor/skills/cloudcc-cli-dev/docs//350/207/252/345/256/232/344/271/211/351/241/265/351/235/242.md +228 -0
- package/README.md +11 -0
- package/bin/index.js +3 -0
- package/package.json +2 -2
- package/src/application/delete.js +59 -0
- package/src/application/get.js +31 -5
- package/src/application/index.js +1 -0
- package/src/classes/delete.js +43 -0
- package/src/classes/detail.js +14 -7
- package/src/classes/index.js +1 -0
- package/src/customPage/create.js +74 -12
- package/src/customPage/delete.js +2 -2
- package/src/customPage/get.js +1 -1
- package/src/customSetting/create.js +27 -0
- package/src/customSetting/delete.js +26 -0
- package/src/customSetting/detail.js +24 -0
- package/src/customSetting/get.js +25 -0
- package/src/customSetting/index.js +4 -0
- package/src/fields/delete.js +52 -0
- package/src/fields/index.js +1 -0
- package/src/menu/create-page.js +16 -25
- package/src/menu/create.js +9 -3
- package/src/menu/delete.js +59 -0
- package/src/menu/get.js +56 -0
- package/src/menu/index.js +2 -0
- package/src/object/delete.js +51 -0
- package/src/object/index.js +1 -0
- package/src/plugin/detail.js +14 -6
- package/src/plugin/publish1.js +3 -3
- package/src/recordType/get.js +1 -1
- package/src/scheduleJob/delete.js +26 -0
- package/src/scheduleJob/detail.js +23 -0
- package/src/scheduleJob/get.js +26 -0
- package/src/scheduleJob/index.js +10 -0
- package/src/staticResource/count.js +25 -0
- package/src/staticResource/delete.js +26 -0
- package/src/staticResource/detail.js +24 -0
- package/src/staticResource/doc.js +106 -0
- package/src/staticResource/get.js +25 -0
- package/src/staticResource/index.js +12 -0
- package/src/timer/delete.js +43 -0
- package/src/timer/index.js +1 -0
- package/src/triggers/delete.js +46 -0
- package/src/triggers/index.js +1 -0
- package/test/application.cli.test.js +49 -8
- package/test/classes.cli.test.js +9 -3
- package/test/customSetting.cli.test.js +84 -0
- package/test/fields.cli.test.js +18 -3
- package/test/menu.cli.test.js +34 -4
- package/test/object.cli.test.js +17 -1
- package/test/scheduleJob.cli.test.js +52 -0
- package/test/staticResource.cli.test.js +78 -0
- package/test/timer.cli.test.js +8 -2
- package/test/trigger.cli.test.js +8 -2
- package/build/component-cc-test-001.common.js +0 -831
- package/build/component-cc-test-001.common.js.map +0 -1
- package/build/component-cc-test-001.css +0 -1
- package/build/component-cc-test-001.umd.js +0 -874
- package/build/component-cc-test-001.umd.js.map +0 -1
- package/build/component-cc-test-001.umd.min.js +0 -8
- package/build/component-cc-test-001.umd.min.js.map +0 -1
- package/build/demo.html +0 -1
- package/classes/CCdd/CCdd.java +0 -22
- package/classes/CCdd/CCddTest.java +0 -11
- package/classes/CCdd/config.json +0 -1
- package/core.zip +0 -0
- package/plugins/cc-test-001/cc-test-001.vue +0 -32
- package/plugins/cc-test-001/components/HelloWorld.vue +0 -11
- package/plugins/cc-test-001/config.json +0 -6
- package/schedule/CCdd/CCdd.java +0 -11
- package/schedule/CCdd/config.json +0 -1
- package/target/ccopenapi-0.0.4-classes.jar +0 -0
- package/target/ccopenapi-0.0.4.jar +0 -0
- package/target/classes/CCdd/CCdd.class +0 -0
- package/target/classes/CCdd/CCddTest.class +0 -0
- package/target/classes/CCdd/config.json +0 -1
- package/target/maven-archiver/pom.properties +0 -3
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -20
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
- /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}/CloudCC/350/207/252/345/256/232/344/271/211/347/273/204/344/273/266/344/275/277/347/224/250/350/257/264/346/230/216.md" +0 -0
- /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}/cloudcc/345/256/232/346/227/266/344/275/234/344/270/232.md" +0 -0
- /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}/cloudcc/345/256/232/346/227/266/347/261/273.md" +0 -0
- /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}//350/207/252/345/256/232/344/271/211/347/261/273.md" +0 -0
- /package/{docs → .cursor/skills/cloudcc-cli-dev/docs}//350/247/246/345/217/221/345/231/250/347/261/273.md" +0 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# 自定义页面(Custom Page)
|
|
2
|
+
|
|
3
|
+
## 覆盖范围
|
|
4
|
+
|
|
5
|
+
本篇聚焦 CloudCC 自定义页面(Custom Page)的 CLI 操作(仅 `cc` 命令):
|
|
6
|
+
|
|
7
|
+
- 创建自定义页面
|
|
8
|
+
- 获取页面列表
|
|
9
|
+
- 删除自定义页面
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 什么是自定义页面
|
|
14
|
+
|
|
15
|
+
自定义页面是 CloudCC 平台提供的**可视化低代码页面构建工具**,基于**自定义组件**创建,通过拖拽组件的方式调整布局、配置属性,快速实现各种业务需求(仪表盘、审批流程、数据大屏等)。
|
|
16
|
+
|
|
17
|
+
> 注意:自定义页面的内容由自定义组件组成。页面本身是"容器",组件才是"内容"。
|
|
18
|
+
> 推荐最佳实践:**一页一组件**,画布和组件均设置 100% 宽高,复杂布局在组件内部实现。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## CLI 命令速查
|
|
23
|
+
|
|
24
|
+
> CLI 调用模式:`cc <action> <type> ...`(动作在前,类型在后)
|
|
25
|
+
|
|
26
|
+
| 操作 | 命令 |
|
|
27
|
+
| -------- | ---------------------------------------------------------- |
|
|
28
|
+
| 创建页面 | `cc create customPage <pageLabel> <pageApi> <pluginId\|compLabel\|compUniName> [projectPath]` |
|
|
29
|
+
| 查询列表 | `cc get customPage [pageNo] [pageSize] [projectPath]` |
|
|
30
|
+
| 删除页面 | `cc delete customPage <id> [projectPath]` |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 创建自定义页面
|
|
35
|
+
|
|
36
|
+
### 命令
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cc create customPage <pageLabel> <pageApi> <pluginId|compLabel|compUniName> [projectPath]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 参数说明
|
|
43
|
+
|
|
44
|
+
| 参数 | 必填 | 说明 |
|
|
45
|
+
| -------------------------------------- | ---- | ----------------------------------------------------------------------------------- |
|
|
46
|
+
| `pageLabel` | 是 | 页面显示名称(中文/英文均可) |
|
|
47
|
+
| `pageApi` | 是 | 页面 API 名称(唯一标识,英文) |
|
|
48
|
+
| `pluginId\|compLabel\|compUniName` | 是 | 组件标识:可传组件 ID、组件显示名(`compLabel`)或组件唯一名(`compUniName`) |
|
|
49
|
+
| `projectPath` | 否 | 项目路径,默认为当前工作目录 `cwd` |
|
|
50
|
+
|
|
51
|
+
### 示例
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 使用组件 ID 创建
|
|
55
|
+
cc create customPage 销售仪表盘 salesDashboard 69bba42dda48d241327d1cf7
|
|
56
|
+
|
|
57
|
+
# 使用组件显示名(compLabel)创建
|
|
58
|
+
cc create customPage 销售仪表盘 salesDashboard 合同助手
|
|
59
|
+
|
|
60
|
+
# 使用组件唯一名(compUniName)创建
|
|
61
|
+
cc create customPage 销售仪表盘 salesDashboard component-contract-assistant
|
|
62
|
+
|
|
63
|
+
# 指定项目路径
|
|
64
|
+
cc create customPage 销售仪表盘 salesDashboard 69bba42dda48d241327d1cf7 /path/to/project
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 说明
|
|
68
|
+
|
|
69
|
+
- 创建成功后,控制台会输出页面 ID:`Success! Custom page created. ID: xxx`
|
|
70
|
+
- `cc create customPage` 会自动创建“带组件”的页面,不再是空页面
|
|
71
|
+
|
|
72
|
+
### `create` 命令补充说明(带组件场景)
|
|
73
|
+
|
|
74
|
+
当前 `create` 命令内部采用以下流程生成 `pageContent`:
|
|
75
|
+
|
|
76
|
+
1. 运行 `cc create customPage ...` 后,CLI 会自动从当前组织读取可用自定义组件,并只使用自定义组件分组(`label.dev.bizType.custom`)
|
|
77
|
+
|
|
78
|
+
2. 在该分组中按输入标识匹配组件(优先支持:`id`、`compLabel`、`compUniName`)
|
|
79
|
+
|
|
80
|
+
3. 以匹配到组件的 `vueData` 作为 `pageContent` 模板,并做如下处理:
|
|
81
|
+
|
|
82
|
+
- 将 `vueData` 反序列化为对象(或数组元素对象)
|
|
83
|
+
- 保留 `renderMode`、`isLock`、`events`、`eventsOption`、`style`、`styleOption`、`componentInfo`、`propObj`、`propOption` 等结构
|
|
84
|
+
- 按页面实例补齐/替换基础字段:`id`、`comId`、`name`、`propObj.id`、`propObj.pageApi`
|
|
85
|
+
- 生成 `compList`(最小字段:`id`、`compUniName`)
|
|
86
|
+
|
|
87
|
+
> 推荐做法:一页一组件,画布与组件都使用 100% 宽高,复杂布局放到组件内部实现。
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 查询自定义页面列表
|
|
92
|
+
|
|
93
|
+
### 命令
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
cc get customPage [pageNo] [pageSize] [projectPath]
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 参数说明
|
|
100
|
+
|
|
101
|
+
| 参数 | 必填 | 默认值 | 说明 |
|
|
102
|
+
| ------------- | ---- | ------ | ---------------------------------- |
|
|
103
|
+
| `pageNo` | 否 | `1` | 当前页码 |
|
|
104
|
+
| `pageSize` | 否 | `20` | 每页条数 |
|
|
105
|
+
| `projectPath` | 否 | `cwd` | 项目路径,默认为当前工作目录 |
|
|
106
|
+
|
|
107
|
+
### 示例
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# 获取第 1 页,每页 20 条(默认)
|
|
111
|
+
cc get customPage
|
|
112
|
+
|
|
113
|
+
# 获取第 2 页,每页 10 条
|
|
114
|
+
cc get customPage 2 10
|
|
115
|
+
|
|
116
|
+
# 指定项目路径
|
|
117
|
+
cc get customPage 1 20 /path/to/project
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 输出格式
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
[1] ID: abc123 Label: 销售仪表盘 API: salesDashboard
|
|
124
|
+
[2] ID: def456 Label: 审批流程 API: approvalFlow
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 将自定义页面挂到菜单(page 菜单)
|
|
130
|
+
|
|
131
|
+
当你要把某个自定义页面放到导航菜单中时,需要先拿到该页面的 `pageApi`(上面列表输出中的 `API` 字段)。
|
|
132
|
+
|
|
133
|
+
### 命令
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
cc create menu page <projectPath> <pageApi> <tabName> <pname> [tabStyle] [mobileimg] [cloudccservicetab] [mobileurl]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 关键规则
|
|
140
|
+
|
|
141
|
+
- `pageApi` 为自定义页面 API 名(例如 `avaya-callcenter`)。
|
|
142
|
+
- CLI 内部会自动拼接 `lightningPage = pageApi + "#lightning"`。
|
|
143
|
+
- `pageType` 固定为 `customPage`(无需手动传)。
|
|
144
|
+
- `pname` 为菜单名称(必填,建议英文/数字/下划线)。
|
|
145
|
+
- `mobileurl` 默认为空字符串 `""`。
|
|
146
|
+
|
|
147
|
+
### 示例
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# 1) 先查页面,拿 API 字段
|
|
151
|
+
cc get customPage
|
|
152
|
+
|
|
153
|
+
# 2) 用 pageApi 创建 page 类型菜单
|
|
154
|
+
cc create menu page . avaya-callcenter "Avaya 呼叫中心" avaya_callcenter_menu
|
|
155
|
+
|
|
156
|
+
# 3) 查询菜单确认
|
|
157
|
+
cc get menu .
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 删除自定义页面
|
|
163
|
+
|
|
164
|
+
### 命令
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
cc delete customPage <id> [projectPath]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 参数说明
|
|
171
|
+
|
|
172
|
+
| 参数 | 必填 | 说明 |
|
|
173
|
+
| ------------- | ---- | ---------------------------------- |
|
|
174
|
+
| `id` | 是 | 页面 ID(从 `list` 命令中获取) |
|
|
175
|
+
| `projectPath` | 否 | 项目路径,默认为当前工作目录 `cwd` |
|
|
176
|
+
|
|
177
|
+
### 示例
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# 删除 ID 为 abc123 的自定义页面
|
|
181
|
+
cc delete customPage abc123
|
|
182
|
+
|
|
183
|
+
# 指定项目路径
|
|
184
|
+
cc delete customPage abc123 /path/to/project
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 说明
|
|
188
|
+
|
|
189
|
+
- 删除成功后控制台会输出:`Success! Custom page (ID: abc123) deleted.`
|
|
190
|
+
- 删除仅影响**云端**记录,不影响本地任何文件
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 典型工作流
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# 1. 查询已有页面列表,记录 ID
|
|
198
|
+
cc get customPage
|
|
199
|
+
|
|
200
|
+
# 2. 创建新页面(获取到 ID 后在开发者控制台拖拽组件填充)
|
|
201
|
+
cc create customPage 销售仪表盘 salesDashboard 69bba42dda48d241327d1cf7
|
|
202
|
+
|
|
203
|
+
# 3. 删除废弃页面
|
|
204
|
+
cc delete customPage <id>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 注意事项
|
|
210
|
+
|
|
211
|
+
- 所有命令需要项目目录下存在 `cloudcc-cli.config.js`(或 `package.json` 中包含 `accessToken`)才能正常工作
|
|
212
|
+
- `pageApi` 在同一组织内必须唯一
|
|
213
|
+
- `cc create customPage` 当前依赖“自定义组件分组(label.dev.bizType.custom)”数据
|
|
214
|
+
- 目标组件必须在该分组中可匹配,且包含 `vueData` 字段
|
|
215
|
+
|
|
216
|
+
---
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# CloudCC 自定义页面说明文档
|
|
2
|
+
|
|
3
|
+
## 一、什么是自定义页面
|
|
4
|
+
|
|
5
|
+
自定义页面是 CloudCC
|
|
6
|
+
平台提供的可视化页面构建工具,基于**自定义组件**创建,通过**拖拉拽**的方式调整页面布局、配置组件属性,实现各种业务需求。
|
|
7
|
+
|
|
8
|
+
### 核心特点
|
|
9
|
+
|
|
10
|
+
- 🎨 **可视化编辑** - 无需编码,通过拖拽组件快速搭建页面
|
|
11
|
+
- 🧩 **组件化** - 基于自定义组件构建,支持复用和扩展
|
|
12
|
+
- 📱 **自适应布局** - 支持像素、百分比、视口等多种单位
|
|
13
|
+
- 🔌 **灵活集成** - 支持菜单、内嵌、代码调用等多种使用方式
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 二、自定义页面能干什么
|
|
18
|
+
|
|
19
|
+
### 1. 快速构建业务页面
|
|
20
|
+
|
|
21
|
+
通过物料库中的基础组件和数据组件,快速搭建符合业务需求的页面,无需从零开始编码。
|
|
22
|
+
|
|
23
|
+
### 2. 灵活布局设计
|
|
24
|
+
|
|
25
|
+
- 支持固定宽高布局(像素单位)
|
|
26
|
+
- 支持自适应布局(百分比单位)
|
|
27
|
+
- 支持响应式布局(视口单位)
|
|
28
|
+
|
|
29
|
+
### 3. 组件间通信
|
|
30
|
+
|
|
31
|
+
通过 `$CCDK.CCBus` 实现组件间的消息传递,支持复杂业务逻辑的协同工作。
|
|
32
|
+
|
|
33
|
+
### 4. 多场景集成
|
|
34
|
+
|
|
35
|
+
- 创建独立菜单页面
|
|
36
|
+
- 内嵌到系统详情页
|
|
37
|
+
- 通过 `ccdk.openCustomPage()` 代码调用
|
|
38
|
+
|
|
39
|
+
### 5. 移动端调试
|
|
40
|
+
|
|
41
|
+
支持使用 eruda 插件在移动端 App 中调试 H5 页面。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 三、主要作用
|
|
46
|
+
|
|
47
|
+
| 作用 | 说明 |
|
|
48
|
+
| --------------- | ---------------------------- |
|
|
49
|
+
| 🚀 **加速开发** | 可视化搭建,减少重复编码工作 |
|
|
50
|
+
| 🔄 **组件复用** | 一次开发组件,多处页面使用 |
|
|
51
|
+
| 🎯 **业务适配** | 灵活配置,快速响应业务变化 |
|
|
52
|
+
| 📦 **降低门槛** | 非开发人员也可参与页面搭建 |
|
|
53
|
+
| 🔧 **易于维护** | 组件化设计,修改影响范围可控 |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 四、为什么要用自定义页面
|
|
58
|
+
|
|
59
|
+
### 传统开发方式的问题
|
|
60
|
+
|
|
61
|
+
- ❌ 每个页面都需要单独编码,重复工作多
|
|
62
|
+
- ❌ 样式和布局不统一,维护成本高
|
|
63
|
+
- ❌ 业务变更时需要修改代码,发布周期长
|
|
64
|
+
- ❌ 非开发人员无法参与,依赖开发资源
|
|
65
|
+
|
|
66
|
+
### 自定义页面的优势
|
|
67
|
+
|
|
68
|
+
- ✅ **标准化** - 统一的组件规范和页面结构
|
|
69
|
+
- ✅ **高效** - 拖拽式操作,分钟级完成页面搭建
|
|
70
|
+
- ✅ **灵活** - 组件可配置,适应不同业务场景
|
|
71
|
+
- ✅ **可扩展** - 支持自定义组件开发,满足特殊需求
|
|
72
|
+
- ✅ **低代码** - 业务人员可参与,减少开发依赖
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 五、自定义页面能解决哪些问题
|
|
77
|
+
|
|
78
|
+
### 1. 个性化业务需求
|
|
79
|
+
|
|
80
|
+
标准页面无法满足的个性化业务场景,通过自定义页面快速实现。
|
|
81
|
+
|
|
82
|
+
**示例**:特殊的审批流程页面、定制化的数据展示面板
|
|
83
|
+
|
|
84
|
+
### 2. 复杂数据展示
|
|
85
|
+
|
|
86
|
+
需要多维度、多格式展示数据的场景。
|
|
87
|
+
|
|
88
|
+
**示例**:仪表盘、统计报表、数据可视化大屏
|
|
89
|
+
|
|
90
|
+
### 3. 特殊交互需求
|
|
91
|
+
|
|
92
|
+
标准组件无法满足的交互逻辑。
|
|
93
|
+
|
|
94
|
+
**示例**:拖拽排序、动态表单、联动筛选
|
|
95
|
+
|
|
96
|
+
### 4. 第三方系统集成
|
|
97
|
+
|
|
98
|
+
需要嵌入外部系统或调用外部 API 的场景。
|
|
99
|
+
|
|
100
|
+
**示例**:嵌入 BI 报表、调用外部服务接口
|
|
101
|
+
|
|
102
|
+
### 5. 移动端适配
|
|
103
|
+
|
|
104
|
+
需要同时支持 PC 和移动端的页面。
|
|
105
|
+
|
|
106
|
+
**示例**:外勤人员使用的移动审批页面
|
|
107
|
+
|
|
108
|
+
### 6. 快速原型验证
|
|
109
|
+
|
|
110
|
+
业务需求不明确时,快速搭建原型进行验证。
|
|
111
|
+
|
|
112
|
+
**示例**:新功能 MVP 验证、用户反馈收集
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 六、使用场景与业务场景
|
|
117
|
+
|
|
118
|
+
### 6.1 推荐使用自定义页面的场景
|
|
119
|
+
|
|
120
|
+
| 场景类型 | 具体场景 | 推荐理由 |
|
|
121
|
+
| --------------- | ---------------------------- | -------------------- |
|
|
122
|
+
| 📊 **数据展示** | 仪表盘、统计报表、数据大屏 | 灵活布局,多组件组合 |
|
|
123
|
+
| 📝 **表单录入** | 复杂表单、动态表单、多级表单 | 组件可配置,校验灵活 |
|
|
124
|
+
| 🔍 **查询搜索** | 高级搜索、多条件筛选 | 组件间通信方便 |
|
|
125
|
+
| 📋 **审批流程** | 定制化审批页、特殊流程 | 业务逻辑可定制 |
|
|
126
|
+
| 📱 **移动端** | 外勤应用、移动办公 | 自适应布局支持好 |
|
|
127
|
+
| 🔗 **系统集成** | 嵌入外部系统、API 调用 | 扩展性强 |
|
|
128
|
+
| 🎨 **品牌定制** | 企业个性化页面 | 样式可完全定制 |
|
|
129
|
+
|
|
130
|
+
### 6.2 不推荐使用自定义页面的场景
|
|
131
|
+
|
|
132
|
+
| 场景 | 原因 | 建议方案 |
|
|
133
|
+
| -------------- | ------------ | ---------------- |
|
|
134
|
+
| 标准 CRUD 操作 | 杀鸡用牛刀 | 使用系统标准页面 |
|
|
135
|
+
| 简单信息展示 | 过度设计 | 使用系统详情页 |
|
|
136
|
+
| 一次性使用 | 投入产出比低 | 评估是否需要 |
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 七、最佳实践
|
|
141
|
+
|
|
142
|
+
### 7.1 页面设计原则
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
┌─────────────────────────────────┐
|
|
146
|
+
│ 自定义页面 (100%) │
|
|
147
|
+
│ ┌───────────────────────────┐ │
|
|
148
|
+
│ │ 自定义组件 (100%) │ │
|
|
149
|
+
│ │ │ │
|
|
150
|
+
│ │ 组件内部自由布局 │ │
|
|
151
|
+
│ │ │ │
|
|
152
|
+
│ └───────────────────────────┘ │
|
|
153
|
+
└─────────────────────────────────┘
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- 📐 **一页一组件** - 一个页面只放一个组件,画布和组件都设置 100% 宽高
|
|
157
|
+
- 🧩 **组件内布局** - 复杂布局在组件内部实现,保持页面简洁
|
|
158
|
+
- 🔄 **组件复用** - 通用功能封装成组件,多处复用
|
|
159
|
+
|
|
160
|
+
### 7.2 组件通信规范
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
// 组件 A - 接收消息
|
|
164
|
+
mounted() {
|
|
165
|
+
this.$CCDK.CCBus.$on('demoB2A', (args) => {
|
|
166
|
+
console.log("收到消息", args)
|
|
167
|
+
})
|
|
168
|
+
},
|
|
169
|
+
beforeDestroy() {
|
|
170
|
+
this.$CCDK.CCBus.$off('demoB2A') // 记得解绑
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// 组件 B - 发送消息
|
|
174
|
+
methods: {
|
|
175
|
+
emit() {
|
|
176
|
+
this.$CCDK.CCBus.$emit("demoB2A", "消息内容")
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### 7.3 页面入口选择
|
|
182
|
+
|
|
183
|
+
| 入口方式 | 适用场景 | 配置方式 |
|
|
184
|
+
| ---------- | ------------------ | ----------------------- |
|
|
185
|
+
| 菜单 | 独立功能模块 | 自定义页面菜单 |
|
|
186
|
+
| 内嵌详情页 | 关联业务展示 | 系统详情页配置 |
|
|
187
|
+
| 代码调用 | 动态跳转、条件打开 | `ccdk.openCustomPage()` |
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 八、快速开始
|
|
192
|
+
|
|
193
|
+
### 8.1 创建自定义页面
|
|
194
|
+
|
|
195
|
+
1. 登录 CloudCC 系统
|
|
196
|
+
2. 点击右上角头像 → 开发者控制台
|
|
197
|
+
3. 自定义布局 → 自定义页面 → 新建
|
|
198
|
+
4. 从物料库拖拽组件到画布
|
|
199
|
+
5. 配置组件属性
|
|
200
|
+
6. 保存页面
|
|
201
|
+
|
|
202
|
+
### 8.2 开发自定义组件
|
|
203
|
+
|
|
204
|
+
参考:[自定义组件开发文档](https://cloudccone.feishu.cn/wiki/AzyWwgHBPiEG2gkeDEXcb56snbb)
|
|
205
|
+
|
|
206
|
+
### 8.3 调试与发布
|
|
207
|
+
|
|
208
|
+
- 使用预览功能测试页面
|
|
209
|
+
- 移动端使用 eruda 调试
|
|
210
|
+
- 发布后配置页面入口
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 九、总结
|
|
215
|
+
|
|
216
|
+
自定义页面是 CloudCC 平台提供的**低代码页面构建解决方案**,核心价值在于:
|
|
217
|
+
|
|
218
|
+
- 🎯 **提效** - 减少重复开发,加速交付
|
|
219
|
+
- 🔧 **灵活** - 适应各种业务场景
|
|
220
|
+
- 📦 **复用** - 组件化设计,一次开发多处使用
|
|
221
|
+
- 🚀 **扩展** - 支持自定义组件,无上限扩展
|
|
222
|
+
|
|
223
|
+
**适用原则**:标准功能优先,个性化需求用自定义页面。
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
_文档版本:1.0_\
|
|
228
|
+
_最后更新:2026-03-25_
|
package/README.md
CHANGED
|
@@ -22,6 +22,17 @@ sudo npm i -g cloudcc-cli
|
|
|
22
22
|
}
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
+
# ReleaseV2.3.1
|
|
26
|
+
|
|
27
|
+
#### Release Date: 2026-3-25
|
|
28
|
+
|
|
29
|
+
#### Release Scope: Full
|
|
30
|
+
|
|
31
|
+
#### Release Content
|
|
32
|
+
|
|
33
|
+
- Optimization
|
|
34
|
+
- Adjusted unit tests
|
|
35
|
+
|
|
25
36
|
# ReleaseV2.3.0
|
|
26
37
|
|
|
27
38
|
#### Release Date: 2026-3-25
|
package/bin/index.js
CHANGED
|
@@ -8,6 +8,7 @@ cc.classes = require("../src/classes/index")
|
|
|
8
8
|
|
|
9
9
|
cc.customSetting = require("../src/customSetting/index")
|
|
10
10
|
|
|
11
|
+
cc.staticResource = require("../src/staticResource/index")
|
|
11
12
|
cc.customPage = require("../src/customPage/index")
|
|
12
13
|
|
|
13
14
|
cc.schedule = require("../src/timer/index")
|
|
@@ -38,6 +39,8 @@ cc.menu = require("../src/menu/index")
|
|
|
38
39
|
|
|
39
40
|
cc.application = require("../src/application/index")
|
|
40
41
|
|
|
42
|
+
cc.scheduleJob = require("../src/scheduleJob/index")
|
|
43
|
+
|
|
41
44
|
|
|
42
45
|
|
|
43
46
|
module.exports = cc;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cloudcc-cli",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"description": "cloudcc-cli",
|
|
5
5
|
"author": "cloudcc",
|
|
6
6
|
"license": "ISC",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"cc-mcp": "bin/mcp.js"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
|
-
"test-cli-one": "node --test test/
|
|
19
|
+
"test-cli-one": "node --test test/menu.cli.test.js",
|
|
20
20
|
"test-cli-all": "node --test ",
|
|
21
21
|
"cc-pull": "git fetch --tags -f && git pull",
|
|
22
22
|
"publish-lib": "npm publish --registry https://registry.npmjs.org && git add . && git commit -m 'update' && git push && curl https://npmmirror.com/sync/cloudcc-cli",
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const chalk = require("chalk");
|
|
2
|
+
const { postClass } = require("../../utils/http");
|
|
3
|
+
const { getPackageJson } = require("../../utils/config");
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 删除应用(Application)
|
|
7
|
+
* 用法:cc delete application <projectPath> <appId>
|
|
8
|
+
*/
|
|
9
|
+
async function remove(argvs) {
|
|
10
|
+
try {
|
|
11
|
+
const projectPath = argvs[2] || process.cwd();
|
|
12
|
+
const appId = argvs[3];
|
|
13
|
+
|
|
14
|
+
if (!appId) {
|
|
15
|
+
console.error();
|
|
16
|
+
console.error(chalk.red("Error: 缺少应用 ID"));
|
|
17
|
+
console.error(chalk.yellow("用法: cc delete application <projectPath> <appId>"));
|
|
18
|
+
console.error();
|
|
19
|
+
throw new Error("缺少必需参数: appId");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const config = await getPackageJson(projectPath);
|
|
23
|
+
if (!config || !config.accessToken) {
|
|
24
|
+
console.error();
|
|
25
|
+
console.error(chalk.red("Error: 配置未找到或 accessToken 缺失"));
|
|
26
|
+
console.error();
|
|
27
|
+
throw new Error("配置未找到或 accessToken 缺失");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
console.error();
|
|
31
|
+
console.error(chalk.green(`Deleting application (${appId}), please wait...`));
|
|
32
|
+
console.error();
|
|
33
|
+
|
|
34
|
+
const result = await postClass(
|
|
35
|
+
config.setupSvc + "/api/appProgram/deleteApp",
|
|
36
|
+
{ id: appId },
|
|
37
|
+
config.accessToken
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
if (result && result.result) {
|
|
41
|
+
console.error();
|
|
42
|
+
console.error(chalk.green("Success! Application deleted."));
|
|
43
|
+
console.error();
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const msg = result && (result.returnInfo || result.message) ? (result.returnInfo || result.message) : "Unknown error";
|
|
48
|
+
console.error();
|
|
49
|
+
console.error(chalk.red("Error: " + msg));
|
|
50
|
+
console.error();
|
|
51
|
+
throw new Error("Delete Application Failed: " + msg);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
console.error();
|
|
54
|
+
console.error(chalk.red("应用删除失败:"), error);
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = remove;
|
package/src/application/get.js
CHANGED
|
@@ -2,12 +2,38 @@ const { postClass } = require("../../utils/http")
|
|
|
2
2
|
const { getPackageJson } = require("../../utils/config")
|
|
3
3
|
|
|
4
4
|
async function get(argvs, isMcp = false) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const projectPath = argvs[2] || process.cwd();
|
|
6
|
+
const condArg = argvs[3];
|
|
7
|
+
|
|
8
|
+
let body = {};
|
|
9
|
+
if (condArg) {
|
|
10
|
+
try {
|
|
11
|
+
body = JSON.parse(decodeURI(condArg));
|
|
12
|
+
} catch (e) {
|
|
13
|
+
throw new Error("Get Application List Failed: encodedCondJson 解析失败,请传 encodeURI(JSON.stringify(...))");
|
|
14
|
+
}
|
|
9
15
|
}
|
|
10
|
-
|
|
16
|
+
|
|
17
|
+
const config = await getPackageJson(projectPath);
|
|
18
|
+
const result = await postClass(
|
|
19
|
+
config.setupSvc + "/api/appProgram/queryAppList",
|
|
20
|
+
body,
|
|
21
|
+
config.accessToken
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
if (result && result.result) {
|
|
25
|
+
const data = result.data;
|
|
26
|
+
const rawList = Array.isArray(data)
|
|
27
|
+
? data
|
|
28
|
+
: (data && Array.isArray(data.list) ? data.list : []);
|
|
29
|
+
if (!isMcp) {
|
|
30
|
+
console.log(JSON.stringify(rawList));
|
|
31
|
+
}
|
|
32
|
+
return rawList;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const msg = result && (result.returnInfo || result.message) ? (result.returnInfo || result.message) : "Unknown error";
|
|
36
|
+
throw new Error("Get Application List Failed: " + msg);
|
|
11
37
|
}
|
|
12
38
|
|
|
13
39
|
module.exports = get;
|
package/src/application/index.js
CHANGED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
const chalk = require("chalk");
|
|
4
|
+
const { getPackageJson } = require("../../utils/config");
|
|
5
|
+
const { postClass } = require("../../utils/http");
|
|
6
|
+
|
|
7
|
+
async function remove(nameOrId, projectPath = process.cwd()) {
|
|
8
|
+
let classId = nameOrId;
|
|
9
|
+
const classPath = path.join(projectPath, `classes/${nameOrId}/`);
|
|
10
|
+
const configPath = path.join(classPath, "config.json");
|
|
11
|
+
|
|
12
|
+
if (fs.existsSync(configPath)) {
|
|
13
|
+
const configContent = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
14
|
+
if (configContent.id) {
|
|
15
|
+
classId = configContent.id;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!classId) {
|
|
20
|
+
throw new Error("Delete Class Failed: class name or id is required");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const config = await getPackageJson(projectPath);
|
|
24
|
+
console.error();
|
|
25
|
+
console.error(chalk.green(`Deleting class (${classId}), please wait...`));
|
|
26
|
+
console.error();
|
|
27
|
+
|
|
28
|
+
const res = await postClass(
|
|
29
|
+
config.setupSvc + "/api/ccfag/delete",
|
|
30
|
+
{ id: classId },
|
|
31
|
+
config.accessToken
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
if (res && res.result) {
|
|
35
|
+
console.error(chalk.green("Success! Class deleted."));
|
|
36
|
+
console.error();
|
|
37
|
+
return res;
|
|
38
|
+
}
|
|
39
|
+
const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
|
|
40
|
+
throw new Error("Delete Class Failed: " + msg);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = remove;
|