cloudcc-cli 2.3.0 → 2.3.2

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.
Files changed (273) hide show
  1. package/.claude/settings.json +15 -0
  2. package/.cloudcc-cache.json +17 -48
  3. package/.cursor/skills/cloudcc-cli-dev.zip +0 -0
  4. package/.cursor/skills/cloudcc-cli-usage/SKILL.md +67 -0
  5. package/README.md +22 -0
  6. package/bin/cc.js +13 -8
  7. package/bin/index.js +12 -2
  8. package/bin/mcp.js +1 -1
  9. package/build/{component-cc-test-001.common.js → component-CCPlugin1774500425584.common.js} +25 -25
  10. package/build/component-CCPlugin1774500425584.common.js.map +1 -0
  11. package/build/component-CCPlugin1774500425584.css +1 -0
  12. package/build/{component-cc-test-001.umd.js → component-CCPlugin1774500425584.umd.js} +27 -27
  13. package/build/component-CCPlugin1774500425584.umd.js.map +1 -0
  14. package/build/{component-cc-test-001.umd.min.js → component-CCPlugin1774500425584.umd.min.js} +3 -3
  15. package/build/component-CCPlugin1774500425584.umd.min.js.map +1 -0
  16. package/build/demo.html +1 -1
  17. package/{src/mcp → mcp}/tools/Class Editor Guide/handler.js +12 -4
  18. package/{src/mcp → mcp}/tools/Component Editor Guide/handler.js +15 -14
  19. package/{src/mcp → mcp}/tools/Trigger Editor Guide/handler.js +8 -2
  20. package/package.json +2 -2
  21. package/src/application/delete.js +59 -0
  22. package/src/application/doc.js +46 -0
  23. package/src/application/docs/devguide.md +173 -0
  24. package/src/application/docs/introduction.md +81 -0
  25. package/src/application/get.js +31 -5
  26. package/src/application/index.js +2 -0
  27. package/src/brief/get.js +1 -1
  28. package/src/classes/create.js +6 -1
  29. package/src/classes/delete.js +49 -0
  30. package/src/classes/detail.js +21 -7
  31. package/src/classes/doc.js +49 -472
  32. package/src/classes/docs/devguide.md +451 -0
  33. package/src/classes/get.js +9 -2
  34. package/src/classes/index.js +3 -1
  35. package/src/classes/publish.js +6 -1
  36. package/src/classes/pull.js +6 -1
  37. package/src/classes/pullList.js +6 -3
  38. package/src/config/doc.js +31 -0
  39. package/src/config/docs/devguide.md +100 -0
  40. package/src/config/index.js +5 -0
  41. package/src/customPage/create.js +109 -14
  42. package/src/customPage/delete.js +2 -2
  43. package/src/customPage/doc.js +46 -0
  44. package/src/customPage/docs/devguide.md +200 -0
  45. package/src/customPage/docs/introduction.md +224 -0
  46. package/src/customPage/get.js +1 -1
  47. package/src/customPage/index.js +1 -0
  48. package/src/customSetting/create.js +36 -0
  49. package/src/customSetting/delete.js +35 -0
  50. package/src/customSetting/deleteCustomSettingField.js +43 -0
  51. package/src/customSetting/detail.js +33 -0
  52. package/src/customSetting/doc.js +22 -179
  53. package/src/customSetting/docs/devguide.md +181 -0
  54. package/src/customSetting/docs/introduction.md +3 -0
  55. package/src/customSetting/editCustomSettingField.js +34 -0
  56. package/src/customSetting/get.js +34 -0
  57. package/src/customSetting/index.js +10 -1
  58. package/src/customSetting/modify.js +30 -0
  59. package/src/customSetting/saveCustomSettingField.js +46 -0
  60. package/src/fields/delete.js +52 -0
  61. package/src/fields/doc.js +45 -0
  62. package/src/fields/docs/devguide.md +224 -0
  63. package/src/fields/docs/introduction.md +217 -0
  64. package/src/fields/index.js +2 -0
  65. package/src/globalSelectList/create.js +51 -0
  66. package/src/globalSelectList/delete.js +56 -0
  67. package/src/globalSelectList/detail.js +45 -0
  68. package/src/globalSelectList/doc.js +52 -0
  69. package/src/globalSelectList/docs/devguide.md +212 -0
  70. package/src/globalSelectList/docs/introduction.md +82 -0
  71. package/src/globalSelectList/get.js +31 -0
  72. package/src/globalSelectList/index.js +16 -0
  73. package/src/menu/create-page.js +54 -26
  74. package/src/menu/create-script.js +67 -19
  75. package/src/menu/create.js +9 -3
  76. package/src/menu/delete.js +59 -0
  77. package/src/menu/doc.js +57 -0
  78. package/src/menu/docs/devguide.md +203 -0
  79. package/src/menu/docs/introduction.md +99 -0
  80. package/src/menu/get.js +56 -0
  81. package/src/menu/index.js +3 -0
  82. package/src/menu/validator.js +80 -0
  83. package/src/object/delete.js +51 -0
  84. package/src/object/doc.js +45 -0
  85. package/src/object/docs/devguide.md +112 -0
  86. package/src/object/docs/introduction.md +187 -0
  87. package/src/object/get.js +1 -23
  88. package/src/object/index.js +2 -0
  89. package/src/pagelayout/create.js +123 -0
  90. package/src/pagelayout/doc.js +46 -0
  91. package/src/pagelayout/docs/devguide.md +295 -0
  92. package/src/pagelayout/docs/introduction.md +44 -0
  93. package/src/pagelayout/get.js +46 -0
  94. package/src/pagelayout/index.js +9 -0
  95. package/src/plugin/detail.js +14 -6
  96. package/src/plugin/doc.js +43 -863
  97. package/src/plugin/docs/devguide.md +923 -0
  98. package/src/plugin/publish1.js +3 -3
  99. package/src/profile/create.js +108 -0
  100. package/src/profile/delete.js +59 -0
  101. package/src/profile/doc.js +46 -0
  102. package/src/profile/docs/devguide.md +332 -0
  103. package/src/profile/docs/introduction.md +123 -0
  104. package/src/profile/get.js +55 -0
  105. package/src/profile/index.js +14 -0
  106. package/src/project/doc.js +39 -372
  107. package/src/project/docs/devguide.md +359 -0
  108. package/src/project/docs/introduction.md +3 -0
  109. package/src/recordType/create.js +77 -0
  110. package/src/recordType/delete.js +52 -0
  111. package/src/recordType/doc.js +36 -0
  112. package/src/recordType/docs/devguide.md +160 -0
  113. package/src/recordType/docs/introduction.md +53 -0
  114. package/src/recordType/editInfo.js +39 -0
  115. package/src/recordType/editSave.js +47 -0
  116. package/src/recordType/get.js +1 -1
  117. package/src/recordType/getList.js +31 -0
  118. package/src/recordType/index.js +16 -3
  119. package/src/recordType/newInfo.js +39 -0
  120. package/src/recordType/validDelete.js +91 -0
  121. package/src/res.md +66 -0
  122. package/src/role/create.js +153 -0
  123. package/src/role/delete.js +59 -0
  124. package/src/role/doc.js +46 -0
  125. package/src/role/docs/devguide.md +387 -0
  126. package/src/role/docs/introduction.md +124 -0
  127. package/src/role/get.js +57 -0
  128. package/src/role/index.js +10 -0
  129. package/src/scheduleJob/delete.js +26 -0
  130. package/src/scheduleJob/detail.js +23 -0
  131. package/src/scheduleJob/doc.js +49 -0
  132. package/src/scheduleJob/docs/devguide.md +79 -0
  133. package/src/scheduleJob/docs/introduction.md +101 -0
  134. package/src/scheduleJob/get.js +26 -0
  135. package/src/scheduleJob/index.js +15 -0
  136. package/src/script/delete.js +112 -0
  137. package/src/script/doc.js +31 -245
  138. package/src/script/docs/devguide.md +290 -0
  139. package/src/script/docs/introduction.md +48 -0
  140. package/src/script/index.js +1 -0
  141. package/src/staticResource/count.js +46 -0
  142. package/src/staticResource/create.js +97 -0
  143. package/src/staticResource/delete.js +48 -0
  144. package/src/staticResource/detail.js +46 -0
  145. package/src/staticResource/doc.js +39 -0
  146. package/src/staticResource/docs/devguide.md +157 -0
  147. package/src/staticResource/docs/introduction.md +3 -0
  148. package/src/staticResource/get.js +48 -0
  149. package/src/staticResource/index.js +13 -0
  150. package/src/timer/create.js +6 -1
  151. package/src/timer/delete.js +49 -0
  152. package/src/timer/detail.js +5 -5
  153. package/src/timer/doc.js +57 -0
  154. package/src/timer/get.js +7 -1
  155. package/src/timer/index.js +4 -1
  156. package/src/timer/publish.js +6 -1
  157. package/src/timer/pull.js +6 -1
  158. package/src/timer/pullList.js +5 -3
  159. package/src/triggers/delete.js +46 -0
  160. package/src/triggers/detail.js +5 -5
  161. package/src/triggers/doc.js +49 -364
  162. package/src/triggers/docs/devguide.md +334 -0
  163. package/src/triggers/get.js +7 -3
  164. package/src/triggers/index.js +2 -4
  165. package/src/triggers/pullList.js +7 -7
  166. package/src/user/create.js +50 -0
  167. package/src/user/delete.js +59 -0
  168. package/src/user/doc.js +46 -0
  169. package/src/user/docs/devguide.md +634 -0
  170. package/src/user/docs/introduction.md +124 -0
  171. package/src/user/get.js +112 -0
  172. package/src/user/index.js +12 -0
  173. package/src/user/update.js +96 -0
  174. package/src/user/view.js +60 -0
  175. package/test/application.cli.test.js +49 -8
  176. package/test/classes.cli.test.js +14 -5
  177. package/test/customPage.cli.test.js +96 -0
  178. package/test/customSetting.cli.test.js +84 -0
  179. package/test/fields.cli.test.js +18 -3
  180. package/test/globalSelectList.cli.test.js +94 -0
  181. package/test/menu-script.cli.test.js +147 -0
  182. package/test/menu.cli.test.js +42 -5
  183. package/test/object.cli.test.js +17 -1
  184. package/test/plugin.cli.test.js +5 -3
  185. package/test/scheduleJob.cli.test.js +52 -0
  186. package/test/staticResource.cli.test.js +78 -0
  187. package/test/timer.cli.test.js +20 -7
  188. package/test/trigger.cli.test.js +13 -5
  189. package/tmp_customsetting_detail.json +1 -0
  190. package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +0 -97
  191. package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +0 -78
  192. package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +0 -137
  193. package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +0 -215
  194. package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +0 -241
  195. package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +0 -59
  196. package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +0 -120
  197. package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +0 -98
  198. package/.cursor/skills/cloudcc-cli-dev/SKILL.md +0 -44
  199. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_COMPONENT.md +0 -151
  200. package/build/component-cc-test-001.common.js.map +0 -1
  201. package/build/component-cc-test-001.css +0 -1
  202. package/build/component-cc-test-001.umd.js.map +0 -1
  203. package/build/component-cc-test-001.umd.min.js.map +0 -1
  204. package/classes/CCdd/CCdd.java +0 -22
  205. package/classes/CCdd/CCddTest.java +0 -11
  206. package/classes/CCdd/config.json +0 -1
  207. package/core.zip +0 -0
  208. package/plugins/cc-test-001/cc-test-001.vue +0 -32
  209. package/plugins/cc-test-001/components/HelloWorld.vue +0 -11
  210. package/plugins/cc-test-001/config.json +0 -6
  211. package/schedule/CCdd/CCdd.java +0 -11
  212. package/schedule/CCdd/config.json +0 -1
  213. package/src/approval/approve.js +0 -105
  214. package/src/approval/get.js +0 -245
  215. package/src/approval/index.js +0 -11
  216. package/src/approval/reject.js +0 -105
  217. package/src/plugin/readme.md +0 -7
  218. package/target/ccopenapi-0.0.4-classes.jar +0 -0
  219. package/target/ccopenapi-0.0.4.jar +0 -0
  220. package/target/classes/CCdd/CCdd.class +0 -0
  221. package/target/classes/CCdd/CCddTest.class +0 -0
  222. package/target/classes/CCdd/config.json +0 -1
  223. package/target/maven-archiver/pom.properties +0 -3
  224. package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -20
  225. package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
  226. /package/{src/mcp → mcp}/cliRunner.js +0 -0
  227. /package/{src/mcp → mcp}/index.js +0 -0
  228. /package/{src/mcp → mcp}/readme.md +0 -0
  229. /package/{src/mcp → mcp}/tools/Application Creator/handler.js +0 -0
  230. /package/{src/mcp → mcp}/tools/Approval/handler.js +0 -0
  231. /package/{src/mcp → mcp}/tools/Class Creator/handler.js +0 -0
  232. /package/{src/mcp → mcp}/tools/Class Detail Retriever/handler.js +0 -0
  233. /package/{src/mcp → mcp}/tools/Class List Retriever/handler.js +0 -0
  234. /package/{src/mcp → mcp}/tools/Class Publisher/handler.js +0 -0
  235. /package/{src/mcp → mcp}/tools/Class Puller/handler.js +0 -0
  236. /package/{src/mcp → mcp}/tools/Client Script Detail Retriever/handler.js +0 -0
  237. /package/{src/mcp → mcp}/tools/Client Script Editor Guide/handler.js +0 -0
  238. /package/{src/mcp → mcp}/tools/Client Script List Retriever/handler.js +0 -0
  239. /package/{src/mcp → mcp}/tools/Client Script Publisher/handler.js +0 -0
  240. /package/{src/mcp → mcp}/tools/Client Script Puller/handler.js +0 -0
  241. /package/{src/mcp → mcp}/tools/CloudCC Development Overview/handler.js +0 -0
  242. /package/{src/mcp → mcp}/tools/Component Creator/handler.js +0 -0
  243. /package/{src/mcp → mcp}/tools/Component Detail Retriever/handler.js +0 -0
  244. /package/{src/mcp → mcp}/tools/Component List Retriever/handler.js +0 -0
  245. /package/{src/mcp → mcp}/tools/Component Publisher/handler.js +0 -0
  246. /package/{src/mcp → mcp}/tools/Component Puller/handler.js +0 -0
  247. /package/{src/mcp → mcp}/tools/Dev Environment Creator/fetcher.js +0 -0
  248. /package/{src/mcp → mcp}/tools/Dev Environment Creator/handler.js +0 -0
  249. /package/{src/mcp → mcp}/tools/Dev Environment Validator/handler.js +0 -0
  250. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/fetcher.js +0 -0
  251. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/handler.js +0 -0
  252. /package/{src/mcp → mcp}/tools/JSP Migrator/handler.js +0 -0
  253. /package/{src/mcp → mcp}/tools/Menu Creator/handler.js +0 -0
  254. /package/{src/mcp → mcp}/tools/Object Creator/handler.js +0 -0
  255. /package/{src/mcp → mcp}/tools/Object Fields Creator/handler.js +0 -0
  256. /package/{src/mcp → mcp}/tools/Object Fields Retriever/handler.js +0 -0
  257. /package/{src/mcp → mcp}/tools/Object List Retriever/handler.js +0 -0
  258. /package/{src/mcp → mcp}/tools/Scheduled Class Creator/handler.js +0 -0
  259. /package/{src/mcp → mcp}/tools/Scheduled Class Detail Retriever/handler.js +0 -0
  260. /package/{src/mcp → mcp}/tools/Scheduled Class List Retriever/handler.js +0 -0
  261. /package/{src/mcp → mcp}/tools/Scheduled Class Publisher/handler.js +0 -0
  262. /package/{src/mcp → mcp}/tools/Scheduled Class Puller/handler.js +0 -0
  263. /package/{src/mcp → mcp}/tools/Trigger Creator/handler.js +0 -0
  264. /package/{src/mcp → mcp}/tools/Trigger Detail Retriever/handler.js +0 -0
  265. /package/{src/mcp → mcp}/tools/Trigger List Retriever/handler.js +0 -0
  266. /package/{src/mcp → mcp}/tools/Trigger Publisher/handler.js +0 -0
  267. /package/{src/mcp → mcp}/tools/Trigger Puller/handler.js +0 -0
  268. /package/{src/mcp → mcp}/tools/index.js +0 -0
  269. /package/{docs//350/207/252/345/256/232/344/271/211/347/261/273.md" → src/classes/docs/introduction.md} +0 -0
  270. /package/{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" → src/plugin/docs/introduction.md} +0 -0
  271. /package/{docs/cloudcc/345/256/232/346/227/266/344/275/234/344/270/232.md" → src/timer/docs/devguide.md} +0 -0
  272. /package/{docs/cloudcc/345/256/232/346/227/266/347/261/273.md" → src/timer/docs/introduction.md} +0 -0
  273. /package/{docs//350/247/246/345/217/221/345/231/250/347/261/273.md" → src/triggers/docs/introduction.md} +0 -0
@@ -3,20 +3,30 @@ const { getPackageJson } = require('../../utils/config');
3
3
  const { post } = require('../../utils/http');
4
4
  const BaseUrl = 'https://developer.apis.cloudcc.cn';
5
5
 
6
+ function isEmptyArg(v) {
7
+ return v == null || String(v).trim() === '';
8
+ }
9
+
6
10
  /**
7
11
  * 新建自定义页面
8
12
  *
9
- * 用法:cc customPage create <pageLabel> <pageApi> [projectPath]
13
+ * 用法:
14
+ * cc create customPage <pageLabel> <pageApi> <pluginId|compLabel> [projectPath]
15
+ * 无参数(仅 create customPage)时:拉取自定义组件列表,使用第一个组件,并自动生成 pageLabel / pageApi。
10
16
  */
11
17
  async function createCustomPage(argvs) {
12
- const pageLabel = argvs[2];
13
- const pageApi = argvs[3];
14
- const projectPath = argvs[4] || process.cwd();
18
+ const projectPath = argvs[5] || process.cwd();
19
+ let pageLabel = argvs[2];
20
+ let pageApi = argvs[3];
21
+ let pluginIdentifier = argvs[4];
22
+
23
+ const noPageArgs =
24
+ isEmptyArg(pageLabel) && isEmptyArg(pageApi) && isEmptyArg(pluginIdentifier);
15
25
 
16
- if (!pageLabel || !pageApi) {
26
+ if (!noPageArgs && (isEmptyArg(pageLabel) || isEmptyArg(pageApi) || isEmptyArg(pluginIdentifier))) {
17
27
  console.error();
18
- console.error(chalk.red('Error: pageLabel and pageApi are required'));
19
- console.error(chalk.yellow('Usage: cc customPage create <pageLabel> <pageApi> [projectPath]'));
28
+ console.error(chalk.red('Error: pageLabelpageApi、pluginId/compLabel 需同时提供,或全部省略以使用第一个自定义组件'));
29
+ console.error(chalk.yellow('Usage: cc create customPage [<pageLabel> <pageApi> <pluginId|compLabel>] [projectPath]'));
20
30
  console.error();
21
31
  return;
22
32
  }
@@ -39,20 +49,105 @@ async function createCustomPage(argvs) {
39
49
  version: 'public',
40
50
  };
41
51
 
52
+ const listRes = await post(
53
+ `${baseUrl}${devSvcDispatch}/custom/pc/1.0/post/listCustomComp`,
54
+ { orgId: config.orgId || '' },
55
+ header
56
+ );
57
+ if (!listRes || String(listRes.returnCode) !== '200') {
58
+ throw new Error('Create Custom Page Failed: list custom components failed');
59
+ }
60
+
61
+ const groupedCompMap = listRes.data || {};
62
+ const compList = Array.isArray(groupedCompMap['label.dev.bizType.custom'])
63
+ ? groupedCompMap['label.dev.bizType.custom']
64
+ : [];
65
+ if (compList.length === 0) {
66
+ throw new Error('Create Custom Page Failed: no custom components found');
67
+ }
68
+
69
+ let pluginDetail;
70
+ if (noPageArgs) {
71
+ pluginDetail = compList[0];
72
+ const ts = Date.now();
73
+ pageLabel = `CLI自动页面_${ts}`;
74
+ pageApi = `cc_cli_page_${ts}`;
75
+ pluginIdentifier = pluginDetail.id || pluginDetail.compLabel || pluginDetail.compUniName;
76
+ console.error();
77
+ console.error(
78
+ chalk.cyan(
79
+ `未指定页面参数,使用第一个自定义组件创建:` +
80
+ `${pluginDetail.compLabel || pluginDetail.compName || pluginDetail.compUniName || pluginIdentifier} (${pluginIdentifier})`
81
+ )
82
+ );
83
+ } else {
84
+ pluginDetail = compList.find(
85
+ (item) =>
86
+ item &&
87
+ (item.id === pluginIdentifier ||
88
+ item.compLabel === pluginIdentifier ||
89
+ item.compUniName === pluginIdentifier)
90
+ );
91
+ if (!pluginDetail) {
92
+ throw new Error(`Create Custom Page Failed: component "${pluginIdentifier}" not found in custom component list`);
93
+ }
94
+ }
95
+
96
+ let vueData = {};
97
+ try {
98
+ vueData = pluginDetail.vueData ? JSON.parse(pluginDetail.vueData) : {};
99
+ } catch (e) {
100
+ throw new Error('Create Custom Page Failed: plugin vueData is not valid JSON');
101
+ }
102
+
103
+ const randomId = (len = 10) => Math.random().toString(36).slice(2, 2 + len);
104
+ const itemId = randomId(10);
105
+ const compUniName = pluginDetail.compUniName || pluginDetail.component || pluginDetail.name;
106
+ const compLabel = pluginDetail.compLabel || pluginDetail.compName || compUniName;
107
+ const compDesc = pluginDetail.compDesc || '';
108
+ const templatePropObj = vueData.propObj && typeof vueData.propObj === 'object' ? vueData.propObj : {};
109
+
110
+ const pageContentItem = {
111
+ ...vueData,
112
+ id: itemId,
113
+ comId: pluginDetail.id,
114
+ name: compUniName,
115
+ componentInfo: {
116
+ ...(vueData.componentInfo || {}),
117
+ component: compUniName,
118
+ compName: compLabel,
119
+ compDesc,
120
+ },
121
+ propObj: {
122
+ ...templatePropObj,
123
+ id: itemId,
124
+ key: templatePropObj.key || randomId(4),
125
+ pageApi,
126
+ },
127
+ };
128
+
42
129
  const body = {
43
130
  id: '',
44
131
  pageLabel,
45
132
  pageApi,
46
- pageContent: '[]',
47
- orgId: config.orgId || '',
48
- renderVersion: '',
49
- compList: [],
50
- canvasStyleData: JSON.stringify({ width: 100, height: 100, scale: 100, unit: '%' }),
133
+ pageContent: JSON.stringify([pageContentItem]),
134
+ orgId: pluginDetail.orgId || config.orgId || '',
135
+ compList: [
136
+ {
137
+ id: pluginDetail.id,
138
+ compUniName,
139
+ },
140
+ ],
141
+ canvasStyleData: JSON.stringify({ width: 100, height: 100, scale: 100, unit: '%', pageApi }),
51
142
  isTemplate: 0,
52
143
  };
53
144
 
54
145
  console.error();
55
- console.error(chalk.green(`Creating custom page "${pageLabel}" (api: ${pageApi}), please wait...`));
146
+ console.error(
147
+ chalk.green(
148
+ `Creating custom page "${pageLabel}" (api: ${pageApi}, component: ${pluginIdentifier}), please wait...`
149
+ )
150
+ );
56
151
 
57
152
  const res = await post(
58
153
  `${baseUrl}${devSvcDispatch}/custom/pc/1.0/post/insertCustomPage`,
@@ -60,7 +155,7 @@ async function createCustomPage(argvs) {
60
155
  header
61
156
  );
62
157
 
63
- if (res && res.returnCode == 200) {
158
+ if (res && String(res.returnCode) === '200') {
64
159
  const id = res.data?.id || res.data || '';
65
160
  console.error(chalk.green(`Success! Custom page created.${id ? ' ID: ' + id : ''}`));
66
161
  console.error();
@@ -6,7 +6,7 @@ const BaseUrl = 'https://developer.apis.cloudcc.cn';
6
6
  /**
7
7
  * 删除自定义页面
8
8
  *
9
- * 用法:cc customPage delete <id> [projectPath]
9
+ * 用法:cc delete customPage <id> [projectPath]
10
10
  */
11
11
  async function deleteCustomPage(argvs) {
12
12
  const id = argvs[2];
@@ -15,7 +15,7 @@ async function deleteCustomPage(argvs) {
15
15
  if (!id) {
16
16
  console.error();
17
17
  console.error(chalk.red('Error: Custom page ID is required'));
18
- console.error(chalk.yellow('Usage: cc customPage delete <id> [projectPath]'));
18
+ console.error(chalk.yellow('Usage: cc delete customPage <id> [projectPath]'));
19
19
  console.error();
20
20
  return;
21
21
  }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * customPage 文档入口:正文均在 `docs/` 目录。
3
+ */
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+
7
+ const DOCS_DIR = path.join(__dirname, "docs");
8
+
9
+ function readDocFile(basename) {
10
+ return fs.readFileSync(path.join(DOCS_DIR, `${basename}.md`), "utf8");
11
+ }
12
+
13
+ /** 介绍文档:自定义页面概念与能力 */
14
+ function getIntroductionDoc() {
15
+ return readDocFile("introduction");
16
+ }
17
+
18
+ /** 开发指导:搭建、集成与调试 */
19
+ function getDevGuideDoc() {
20
+ return readDocFile("devguide");
21
+ }
22
+
23
+ /**
24
+ * cc doc customPage <introduction|devguide>
25
+ * @param {string[]} argvs [doc, type, introduction|devguide, ...]
26
+ */
27
+ function doc(argvs) {
28
+ const subType = argvs[2];
29
+ const key = String(subType || "").trim().toLowerCase();
30
+ if (!key) {
31
+ throw new Error("cc doc customPage 需要子命令:introduction 或 devguide");
32
+ }
33
+ if (key === "introduction") {
34
+ const content = getIntroductionDoc();
35
+ console.log(content);
36
+ return content;
37
+ }
38
+ if (key === "devguide") {
39
+ const content = getDevGuideDoc();
40
+ console.log(content);
41
+ return content;
42
+ }
43
+ throw new Error(`doc 不支持的子命令: ${subType},请使用 introduction 或 devguide`);
44
+ }
45
+
46
+ module.exports = doc;
@@ -0,0 +1,200 @@
1
+ # CloudCC 自定义页面开发指南
2
+
3
+ ## 1. 模块定位
4
+
5
+ `customPage` 模块用于通过 CLI 管理自定义页面,当前提供:
6
+
7
+ - 创建页面:`cc create customPage ...`
8
+ - 查询页面:`cc get customPage ...`
9
+ - 删除页面:`cc delete customPage ...`
10
+ - 文档查看:`cc doc customPage introduction|devguide`
11
+
12
+ ---
13
+
14
+ ## 2. 开发前准备
15
+
16
+ 执行命令前请确认:
17
+
18
+ - 已完成 `cc doc project devguide` 的环境准备
19
+ - 项目路径下存在可用配置,且包含 `accessToken`
20
+ - 当前组织已存在至少一个自定义组件(创建页面时会依赖组件列表)
21
+
22
+ 若配置缺失,命令会报错:
23
+
24
+ ```text
25
+ Error: Configuration not found or accessToken is missing
26
+ ```
27
+
28
+ ---
29
+
30
+ ## 3. 命令总览(以代码实现为准)
31
+
32
+ ```bash
33
+ cc create customPage [<pageLabel> <pageApi> <pluginId|compLabel>] [projectPath]
34
+ cc get customPage [pageNo] [pageSize] [projectPath]
35
+ cc delete customPage <id> [projectPath]
36
+ cc doc customPage <introduction|devguide>
37
+ ```
38
+
39
+ ---
40
+
41
+ ## 4. 创建自定义页面
42
+
43
+ ## 4.1 标准创建模式
44
+
45
+ ```bash
46
+ cc create customPage <pageLabel> <pageApi> <pluginId|compLabel> [projectPath]
47
+ ```
48
+
49
+ 参数说明:
50
+
51
+ - `pageLabel`:页面名称
52
+ - `pageApi`:页面 API 名称
53
+ - `pluginId|compLabel`:组件标识,支持以下任一匹配:
54
+ - 组件 `id`
55
+ - 组件 `compLabel`
56
+ - 组件 `compUniName`
57
+ - `projectPath`:项目路径,默认当前目录
58
+
59
+ 示例:
60
+
61
+ ```bash
62
+ cc create customPage "合同助手页面" contract_assistant_page 2f9d0d6d2a ./
63
+ cc create customPage "合同助手页面" contract_assistant_page 合同助手组件
64
+ ```
65
+
66
+ ## 4.2 自动创建模式(无参数)
67
+
68
+ ```bash
69
+ cc create customPage
70
+ ```
71
+
72
+ 当不传 `pageLabel/pageApi/plugin` 三个参数时,CLI 会自动:
73
+
74
+ 1. 拉取自定义组件列表
75
+ 2. 使用列表第一个组件
76
+ 3. 生成页面名:`CLI自动页面_<timestamp>`
77
+ 4. 生成页面 API:`cc_cli_page_<timestamp>`
78
+
79
+ 这是快速验证环境是否可用的便捷方式。
80
+
81
+ ## 4.3 参数校验规则
82
+
83
+ - 三个核心参数要么**同时传入**,要么**全部省略**
84
+ - 若只传部分参数,会报错并提示正确用法:
85
+
86
+ ```text
87
+ Error: pageLabel、pageApi、pluginId/compLabel 需同时提供,或全部省略以使用第一个自定义组件
88
+ Usage: cc create customPage [<pageLabel> <pageApi> <pluginId|compLabel>] [projectPath]
89
+ ```
90
+
91
+ ## 4.4 创建过程说明
92
+
93
+ 创建命令内部会执行以下步骤:
94
+
95
+ 1. 读取项目配置(token、org 等)
96
+ 2. 请求组件列表接口:`listCustomComp`
97
+ 3. 按 `id/compLabel/compUniName` 匹配组件
98
+ 4. 读取组件 `vueData`,并拼装页面内容
99
+ 5. 调用创建接口:`insertCustomPage`
100
+
101
+ 常见失败场景:
102
+
103
+ - 组件列表为空:`no custom components found`
104
+ - 指定组件未找到:`component "<x>" not found in custom component list`
105
+ - `vueData` 非合法 JSON:`plugin vueData is not valid JSON`
106
+
107
+ ---
108
+
109
+ ## 5. 查询自定义页面
110
+
111
+ ```bash
112
+ cc get customPage [pageNo] [pageSize] [projectPath]
113
+ ```
114
+
115
+ 参数说明:
116
+
117
+ - `pageNo`:页码,默认 `1`
118
+ - `pageSize`:每页数量,默认 `20`
119
+ - `projectPath`:项目路径,默认当前目录
120
+
121
+ 示例:
122
+
123
+ ```bash
124
+ cc get customPage
125
+ cc get customPage 1 50 ./
126
+ ```
127
+
128
+ 执行成功后会输出总数,并逐条打印页面:
129
+
130
+ - `ID`
131
+ - `Label`(`pageLabel`)
132
+ - `API`(`pageApi`)
133
+
134
+ ---
135
+
136
+ ## 6. 删除自定义页面
137
+
138
+ ```bash
139
+ cc delete customPage <id> [projectPath]
140
+ ```
141
+
142
+ 参数说明:
143
+
144
+ - `id`:页面 ID(必填)
145
+ - `projectPath`:项目路径,默认当前目录
146
+
147
+ 示例:
148
+
149
+ ```bash
150
+ cc delete customPage 2f9d0d6d2a
151
+ cc delete customPage 2f9d0d6d2a ./
152
+ ```
153
+
154
+ 若缺少 `id`,会报错:
155
+
156
+ ```text
157
+ Error: Custom page ID is required
158
+ Usage: cc delete customPage <id> [projectPath]
159
+ ```
160
+
161
+ ---
162
+
163
+ ## 7. 文档命令
164
+
165
+ ```bash
166
+ cc doc customPage introduction
167
+ cc doc customPage devguide
168
+ ```
169
+
170
+ 说明:
171
+
172
+ - 仅支持 `introduction` 与 `devguide`
173
+ - 传入其他子命令会抛错
174
+
175
+ ---
176
+
177
+ ## 8. 推荐操作流程
178
+
179
+ ```bash
180
+ # 1) 先查列表,确认现有页面
181
+ cc get customPage
182
+
183
+ # 2) 创建页面(标准模式)
184
+ cc create customPage "合同助手页面" contract_assistant_page 2f9d0d6d2a
185
+
186
+ # 3) 再查列表,确认创建成功并记录 ID
187
+ cc get customPage
188
+
189
+ # 4) 如需回滚,按 ID 删除
190
+ cc delete customPage <id>
191
+ ```
192
+
193
+ ---
194
+
195
+ ## 9. 注意事项
196
+
197
+ - `create` 强依赖自定义组件,先确保组件已存在
198
+ - 建议优先使用可读性高的 `pageApi` 命名(如业务域+功能)
199
+ - 删除前先确认页面未被菜单或其他入口依赖
200
+ - 生产环境操作前,先在测试环境验证参数与组件匹配
@@ -0,0 +1,224 @@
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.4 调试与发布
203
+
204
+ - 使用预览功能测试页面
205
+ - 移动端使用 eruda 调试
206
+ - 发布后配置页面入口
207
+
208
+ ---
209
+
210
+ ## 九、总结
211
+
212
+ 自定义页面是 CloudCC 平台提供的**低代码页面构建解决方案**,核心价值在于:
213
+
214
+ - 🎯 **提效** - 减少重复开发,加速交付
215
+ - 🔧 **灵活** - 适应各种业务场景
216
+ - 📦 **复用** - 组件化设计,一次开发多处使用
217
+ - 🚀 **扩展** - 支持自定义组件,无上限扩展
218
+
219
+ **适用原则**:标准功能优先,个性化需求用自定义页面。
220
+
221
+ ---
222
+
223
+ _文档版本:1.0_\
224
+ _最后更新:2026-03-25_
@@ -6,7 +6,7 @@ const BaseUrl = 'https://developer.apis.cloudcc.cn';
6
6
  /**
7
7
  * 获取自定义页面列表
8
8
  *
9
- * 用法:cc customPage list [pageNo] [pageSize] [projectPath]
9
+ * 用法:cc get customPage [pageNo] [pageSize] [projectPath]
10
10
  */
11
11
  async function listCustomPage(argvs) {
12
12
  const pageNo = parseInt(argvs[2], 10) || 1;
@@ -2,6 +2,7 @@ const cc = {};
2
2
  cc.create = require('./create');
3
3
  cc.delete = require('./delete');
4
4
  cc.get = require('./get');
5
+ cc.doc = require('./doc');
5
6
 
6
7
  function CustomPage(action, argvs) {
7
8
  cc[action](argvs);
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 自定义设置 - 新建/更新(保存主对象)
3
+ * API: POST {setupSvc}/api/customsetting/save
4
+ * CLI: cc create customSetting <projectPath> <encodedBodyJson>
5
+ * 参数说明:
6
+ * - projectPath: 项目根目录
7
+ * - encodedBodyJson: encodeURI(JSON.stringify(body))
8
+ * - body: { tpSysObjectVO: { id, label, schemetableName, dataType, accessable, remark, ... } }
9
+ */
10
+ const chalk = require("chalk");
11
+ const { getPackageJson } = require("../../utils/config");
12
+ const { postClass } = require("../../utils/http");
13
+
14
+ async function create(projectPath = process.cwd(), encodedBodyJson) {
15
+ if (!encodedBodyJson) {
16
+ throw new Error("Create Custom Setting Failed: encodedBodyJson is required");
17
+ }
18
+ const body = JSON.parse(decodeURI(encodedBodyJson));
19
+ const config = await getPackageJson(projectPath);
20
+ console.error();
21
+ console.error(chalk.green("Creating custom setting, please wait..."));
22
+ console.error();
23
+ const res = await postClass(
24
+ config.setupSvc + "/api/customsetting/save",
25
+ body,
26
+ config.accessToken
27
+ );
28
+ if (res && res.result) {
29
+ console.error(chalk.green("Success! Custom setting saved."));
30
+ console.error();
31
+ return res;
32
+ }
33
+ throw new Error("Create Custom Setting Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
34
+ }
35
+
36
+ module.exports = create;