cloudcc-cli 2.3.1 → 2.3.3

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 (232) hide show
  1. package/.claude/settings.json +25 -0
  2. package/.cloudcc-cache.json +21 -4
  3. package/.cursor/skills/cloudcc-cli-dev.zip +0 -0
  4. package/.cursor/skills/cloudcc-cli-usage/SKILL.md +68 -0
  5. package/README.md +22 -0
  6. package/bin/cc.js +13 -8
  7. package/bin/index.js +9 -2
  8. package/bin/mcp.js +1 -1
  9. package/build/component-CCPlugin1774500425584.common.js +831 -0
  10. package/build/component-CCPlugin1774500425584.common.js.map +1 -0
  11. package/build/component-CCPlugin1774500425584.css +1 -0
  12. package/build/component-CCPlugin1774500425584.umd.js +874 -0
  13. package/build/component-CCPlugin1774500425584.umd.js.map +1 -0
  14. package/build/component-CCPlugin1774500425584.umd.min.js +8 -0
  15. package/build/component-CCPlugin1774500425584.umd.min.js.map +1 -0
  16. package/build/demo.html +1 -0
  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 +3 -2
  21. package/src/application/doc.js +46 -0
  22. package/src/application/docs/devguide.md +173 -0
  23. package/src/application/docs/introduction.md +81 -0
  24. package/src/application/index.js +1 -0
  25. package/src/brief/get.js +1 -1
  26. package/src/classes/create.js +6 -1
  27. package/src/classes/delete.js +7 -1
  28. package/src/classes/detail.js +8 -1
  29. package/src/classes/doc.js +49 -472
  30. package/src/classes/docs/devguide.md +541 -0
  31. package/src/classes/get.js +9 -2
  32. package/src/classes/index.js +2 -1
  33. package/src/classes/publish.js +6 -1
  34. package/src/classes/pull.js +6 -1
  35. package/src/classes/pullList.js +6 -3
  36. package/src/config/doc.js +31 -0
  37. package/src/config/docs/devguide.md +100 -0
  38. package/src/config/index.js +5 -0
  39. package/src/customPage/create.js +52 -19
  40. package/src/customPage/doc.js +46 -0
  41. package/src/customPage/docs/devguide.md +200 -0
  42. package/{.cursor/skills/cloudcc-cli-dev/docs//350/207/252/345/256/232/344/271/211/351/241/265/351/235/242.md → src/customPage/docs/introduction.md} +1 -5
  43. package/src/customPage/index.js +1 -0
  44. package/src/customSetting/create.js +9 -0
  45. package/src/customSetting/delete.js +10 -1
  46. package/src/customSetting/deleteCustomSettingField.js +43 -0
  47. package/src/customSetting/detail.js +10 -1
  48. package/src/customSetting/doc.js +22 -179
  49. package/src/customSetting/docs/devguide.md +181 -0
  50. package/src/customSetting/docs/introduction.md +3 -0
  51. package/src/customSetting/editCustomSettingField.js +34 -0
  52. package/src/customSetting/get.js +9 -0
  53. package/src/customSetting/index.js +6 -1
  54. package/src/customSetting/modify.js +30 -0
  55. package/src/customSetting/saveCustomSettingField.js +46 -0
  56. package/src/fields/doc.js +45 -0
  57. package/src/fields/docs/devguide.md +224 -0
  58. package/src/fields/docs/introduction.md +217 -0
  59. package/src/fields/index.js +1 -0
  60. package/src/globalSelectList/create.js +51 -0
  61. package/src/globalSelectList/delete.js +56 -0
  62. package/src/globalSelectList/detail.js +45 -0
  63. package/src/globalSelectList/doc.js +52 -0
  64. package/src/globalSelectList/docs/devguide.md +153 -0
  65. package/src/globalSelectList/docs/introduction.md +82 -0
  66. package/src/globalSelectList/get.js +31 -0
  67. package/src/globalSelectList/index.js +16 -0
  68. package/src/menu/create-page.js +43 -6
  69. package/src/menu/create-script.js +67 -19
  70. package/src/menu/doc.js +57 -0
  71. package/src/menu/docs/devguide.md +129 -0
  72. package/src/menu/docs/introduction.md +99 -0
  73. package/src/menu/index.js +1 -0
  74. package/src/menu/validator.js +80 -0
  75. package/src/object/doc.js +45 -0
  76. package/src/object/docs/devguide.md +112 -0
  77. package/src/object/docs/introduction.md +187 -0
  78. package/src/object/get.js +1 -23
  79. package/src/object/index.js +1 -0
  80. package/src/pagelayout/create.js +123 -0
  81. package/src/pagelayout/delete.js +57 -0
  82. package/src/pagelayout/doc.js +46 -0
  83. package/src/pagelayout/docs/devguide.md +83 -0
  84. package/src/pagelayout/docs/introduction.md +44 -0
  85. package/src/pagelayout/get.js +46 -0
  86. package/src/pagelayout/index.js +10 -0
  87. package/src/plugin/doc.js +43 -863
  88. package/src/plugin/docs/devguide.md +996 -0
  89. package/src/profile/create.js +108 -0
  90. package/src/profile/delete.js +59 -0
  91. package/src/profile/doc.js +46 -0
  92. package/src/profile/docs/devguide.md +77 -0
  93. package/src/profile/docs/introduction.md +123 -0
  94. package/src/profile/get.js +55 -0
  95. package/src/profile/index.js +14 -0
  96. package/src/project/doc.js +39 -372
  97. package/src/project/docs/devguide.md +359 -0
  98. package/src/project/docs/introduction.md +3 -0
  99. package/src/recordType/create.js +77 -0
  100. package/src/recordType/delete.js +52 -0
  101. package/src/recordType/doc.js +36 -0
  102. package/src/recordType/docs/devguide.md +160 -0
  103. package/src/recordType/docs/introduction.md +53 -0
  104. package/src/recordType/editInfo.js +39 -0
  105. package/src/recordType/editSave.js +47 -0
  106. package/src/recordType/getList.js +31 -0
  107. package/src/recordType/index.js +16 -3
  108. package/src/recordType/newInfo.js +39 -0
  109. package/src/recordType/validDelete.js +91 -0
  110. package/src/res.md +66 -0
  111. package/src/role/create.js +153 -0
  112. package/src/role/delete.js +59 -0
  113. package/src/role/doc.js +46 -0
  114. package/src/role/docs/devguide.md +81 -0
  115. package/src/role/docs/introduction.md +124 -0
  116. package/src/role/get.js +57 -0
  117. package/src/role/index.js +10 -0
  118. package/src/scheduleJob/doc.js +49 -0
  119. package/src/scheduleJob/docs/devguide.md +79 -0
  120. package/src/scheduleJob/docs/introduction.md +101 -0
  121. package/src/scheduleJob/index.js +5 -0
  122. package/src/script/delete.js +112 -0
  123. package/src/script/doc.js +31 -245
  124. package/src/script/docs/devguide.md +290 -0
  125. package/src/script/docs/introduction.md +48 -0
  126. package/src/script/index.js +1 -0
  127. package/src/staticResource/count.js +31 -10
  128. package/src/staticResource/create.js +97 -0
  129. package/src/staticResource/delete.js +30 -8
  130. package/src/staticResource/detail.js +32 -10
  131. package/src/staticResource/doc.js +21 -88
  132. package/src/staticResource/docs/devguide.md +157 -0
  133. package/src/staticResource/docs/introduction.md +3 -0
  134. package/src/staticResource/get.js +31 -8
  135. package/src/staticResource/index.js +2 -1
  136. package/src/timer/create.js +6 -1
  137. package/src/timer/delete.js +7 -1
  138. package/src/timer/detail.js +5 -5
  139. package/src/timer/doc.js +57 -0
  140. package/{.cursor/skills/cloudcc-cli-dev/docs/cloudcc/345/256/232/346/227/266/344/275/234/344/270/232.md → src/timer/docs/devguide.md} +83 -1
  141. package/src/timer/get.js +7 -1
  142. package/src/timer/index.js +3 -1
  143. package/src/timer/publish.js +6 -1
  144. package/src/timer/pull.js +6 -1
  145. package/src/timer/pullList.js +5 -3
  146. package/src/triggers/detail.js +5 -5
  147. package/src/triggers/doc.js +49 -364
  148. package/src/triggers/docs/devguide.md +442 -0
  149. package/src/triggers/get.js +7 -3
  150. package/src/triggers/index.js +1 -4
  151. package/src/triggers/pullList.js +7 -7
  152. package/src/user/create.js +50 -0
  153. package/src/user/delete.js +59 -0
  154. package/src/user/doc.js +46 -0
  155. package/src/user/docs/devguide.md +122 -0
  156. package/src/user/docs/introduction.md +124 -0
  157. package/src/user/get.js +112 -0
  158. package/src/user/index.js +12 -0
  159. package/src/user/update.js +96 -0
  160. package/src/user/view.js +60 -0
  161. package/test/classes.cli.test.js +7 -4
  162. package/test/customPage.cli.test.js +96 -0
  163. package/test/globalSelectList.cli.test.js +94 -0
  164. package/test/menu-script.cli.test.js +147 -0
  165. package/test/menu.cli.test.js +8 -1
  166. package/test/plugin.cli.test.js +5 -3
  167. package/test/timer.cli.test.js +15 -8
  168. package/test/trigger.cli.test.js +5 -3
  169. package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +0 -111
  170. package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +0 -152
  171. package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +0 -150
  172. package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +0 -372
  173. package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +0 -62
  174. package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +0 -62
  175. package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +0 -214
  176. package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +0 -113
  177. package/.cursor/skills/cloudcc-cli-dev/SKILL.md +0 -66
  178. package/.cursor/skills/cloudcc-cli-dev/STATIC-RESOURCE-API.md +0 -60
  179. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_COMPONENT.md +0 -151
  180. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_PAGE.md +0 -216
  181. package/src/approval/approve.js +0 -105
  182. package/src/approval/get.js +0 -245
  183. package/src/approval/index.js +0 -11
  184. package/src/approval/reject.js +0 -105
  185. package/src/plugin/readme.md +0 -7
  186. /package/{src/mcp → mcp}/cliRunner.js +0 -0
  187. /package/{src/mcp → mcp}/index.js +0 -0
  188. /package/{src/mcp → mcp}/readme.md +0 -0
  189. /package/{src/mcp → mcp}/tools/Application Creator/handler.js +0 -0
  190. /package/{src/mcp → mcp}/tools/Approval/handler.js +0 -0
  191. /package/{src/mcp → mcp}/tools/Class Creator/handler.js +0 -0
  192. /package/{src/mcp → mcp}/tools/Class Detail Retriever/handler.js +0 -0
  193. /package/{src/mcp → mcp}/tools/Class List Retriever/handler.js +0 -0
  194. /package/{src/mcp → mcp}/tools/Class Publisher/handler.js +0 -0
  195. /package/{src/mcp → mcp}/tools/Class Puller/handler.js +0 -0
  196. /package/{src/mcp → mcp}/tools/Client Script Detail Retriever/handler.js +0 -0
  197. /package/{src/mcp → mcp}/tools/Client Script Editor Guide/handler.js +0 -0
  198. /package/{src/mcp → mcp}/tools/Client Script List Retriever/handler.js +0 -0
  199. /package/{src/mcp → mcp}/tools/Client Script Publisher/handler.js +0 -0
  200. /package/{src/mcp → mcp}/tools/Client Script Puller/handler.js +0 -0
  201. /package/{src/mcp → mcp}/tools/CloudCC Development Overview/handler.js +0 -0
  202. /package/{src/mcp → mcp}/tools/Component Creator/handler.js +0 -0
  203. /package/{src/mcp → mcp}/tools/Component Detail Retriever/handler.js +0 -0
  204. /package/{src/mcp → mcp}/tools/Component List Retriever/handler.js +0 -0
  205. /package/{src/mcp → mcp}/tools/Component Publisher/handler.js +0 -0
  206. /package/{src/mcp → mcp}/tools/Component Puller/handler.js +0 -0
  207. /package/{src/mcp → mcp}/tools/Dev Environment Creator/fetcher.js +0 -0
  208. /package/{src/mcp → mcp}/tools/Dev Environment Creator/handler.js +0 -0
  209. /package/{src/mcp → mcp}/tools/Dev Environment Validator/handler.js +0 -0
  210. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/fetcher.js +0 -0
  211. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/handler.js +0 -0
  212. /package/{src/mcp → mcp}/tools/JSP Migrator/handler.js +0 -0
  213. /package/{src/mcp → mcp}/tools/Menu Creator/handler.js +0 -0
  214. /package/{src/mcp → mcp}/tools/Object Creator/handler.js +0 -0
  215. /package/{src/mcp → mcp}/tools/Object Fields Creator/handler.js +0 -0
  216. /package/{src/mcp → mcp}/tools/Object Fields Retriever/handler.js +0 -0
  217. /package/{src/mcp → mcp}/tools/Object List Retriever/handler.js +0 -0
  218. /package/{src/mcp → mcp}/tools/Scheduled Class Creator/handler.js +0 -0
  219. /package/{src/mcp → mcp}/tools/Scheduled Class Detail Retriever/handler.js +0 -0
  220. /package/{src/mcp → mcp}/tools/Scheduled Class List Retriever/handler.js +0 -0
  221. /package/{src/mcp → mcp}/tools/Scheduled Class Publisher/handler.js +0 -0
  222. /package/{src/mcp → mcp}/tools/Scheduled Class Puller/handler.js +0 -0
  223. /package/{src/mcp → mcp}/tools/Trigger Creator/handler.js +0 -0
  224. /package/{src/mcp → mcp}/tools/Trigger Detail Retriever/handler.js +0 -0
  225. /package/{src/mcp → mcp}/tools/Trigger List Retriever/handler.js +0 -0
  226. /package/{src/mcp → mcp}/tools/Trigger Publisher/handler.js +0 -0
  227. /package/{src/mcp → mcp}/tools/Trigger Puller/handler.js +0 -0
  228. /package/{src/mcp → mcp}/tools/index.js +0 -0
  229. /package/{.cursor/skills/cloudcc-cli-dev/docs//350/207/252/345/256/232/344/271/211/347/261/273.md" → src/classes/docs/introduction.md} +0 -0
  230. /package/{.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" → src/plugin/docs/introduction.md} +0 -0
  231. /package/{.cursor/skills/cloudcc-cli-dev/docs/cloudcc/345/256/232/346/227/266/347/261/273.md" → src/timer/docs/introduction.md} +0 -0
  232. /package/{.cursor/skills/cloudcc-cli-dev/docs//350/247/246/345/217/221/345/231/250/347/261/273.md" → src/triggers/docs/introduction.md} +0 -0
@@ -0,0 +1,996 @@
1
+ # CloudCC 自定义组件开发指南
2
+
3
+ > 目标:指导开发者从 0 到 1
4
+ > 创建、调试、发布组件,并掌握常用能力(启动型组件、防止样式污染、ECharts、调用自定义类、引入第三方库/图片、日志上报、扩展属性与事件等)。
5
+
6
+ ---
7
+
8
+ ## CLI 与本地文件(必读)
9
+
10
+ `plugins/<插件名>/` 目录、`config.json` 以及首次发布写回的 `id` 均与 **cloudcc-cli** 的创建、发布、拉取逻辑绑定。**必须通过下列命令** 完成新建插件目录、与云端同步、发布与删除;不要手工整包复制其他项目的 `plugins/`、不要私自篡改 `config.json` 中的 `id` 或破坏元数据,否则容易导致编译入口错误、发布失败或与云端不一致。
11
+
12
+ **允许的做法**:在 CLI 已生成的目录内用 IDE 编辑 `.vue`、子组件与 `utils/` 等源码;与云端列表、详情、拉取、删除、发布相关的操作一律走命令。
13
+
14
+ 执行命令前请确认:已完成 `cc doc project devguide` 中的环境初始化,项目根目录配置可用且具备 `accessToken`(发布流程还会使用 `pluginToken` / 账号密钥等,以你项目配置为准)。
15
+
16
+ ### 命令总览(以代码实现为准)
17
+
18
+ ```bash
19
+ cc create plugin <name>
20
+ cc publish plugin <name>
21
+ cc get plugin [projectPath]
22
+ cc detail plugin <pluginName> [pluginId] [projectPath]
23
+ cc detail plugin "" <pluginId> [projectPath]
24
+ cc pull plugin <pluginNameOrId> [projectPath]
25
+ cc delete plugin <pluginNameOrId> [projectPath]
26
+ cc doc plugin <introduction|devguide>
27
+ ```
28
+
29
+ 参数约定:
30
+
31
+ - `name` / `pluginName`:插件目录名,与 `plugins/<name>/` 一致。
32
+ - `projectPath`:项目根路径;不传则使用当前工作目录。`get` 的第一个可选参数即为 `projectPath`。
33
+ - `pluginNameOrId`:本地目录名,或云端组件 ID;若本地存在 `config.json` 且含 `id`,`pull` / `delete` 会优先使用该 `id`。
34
+ - `pluginId`:`detail` 仅查云端时,将 `pluginName` 置空:`cc detail plugin "" <pluginId>`。
35
+
36
+ ### 命令作用摘要
37
+
38
+ | 命令 | 作用 |
39
+ |------|------|
40
+ | `create` | 在 `plugins/<name>/` 生成入口 `.vue`、`components/`、`config.json` 等模板 |
41
+ | `publish` | 使用 `vue-cli-service` 编译并上传;首次成功且接口返回 `id` 时可写回 `config.json` |
42
+ | `get` | 拉取云端组件列表,标准输出为 JSON |
43
+ | `detail` | 按目录名读本地;或按 `pluginId` 读云端(不传 `pluginName` 时) |
44
+ | `pull` | 按本地 `id` 或按传入的 ID 从云端还原文件到本地 `plugins/` 等路径 |
45
+ | `delete` | 调用接口删除云端组件 |
46
+ | `doc` | 输出 `introduction` 或 `devguide`(`devguide` 含附录 CCDK SDK 速查) |
47
+
48
+ ### 推荐操作顺序
49
+
50
+ ```bash
51
+ # 1) 查看云端已有组件(可选)
52
+ cc get plugin .
53
+
54
+ # 2) 仅通过 create 生成目录与模板
55
+ cc create plugin my_plugin
56
+
57
+ # 3) 本地调试后发布(勿跳过 CLI 发布流程)
58
+ cc publish plugin my_plugin
59
+
60
+ # 4) 与云端对齐或迁移机器时拉取
61
+ cc pull plugin my_plugin
62
+ # 或已知云端 ID:cc pull plugin <id> .
63
+
64
+ # 5) 不再使用时删除云端组件
65
+ cc delete plugin my_plugin
66
+ ```
67
+
68
+ ---
69
+
70
+ ## 0. 自定义组件概述(能力与场景)
71
+
72
+ 本文节整合了仓库内实践用法,帮助你在开始编码前先判断:什么是自定义组件、能解决什么问题、何时该用。
73
+
74
+ ### 0.1 什么是自定义组件(本项目语境)
75
+
76
+ 在本项目中,**自定义组件**通常指以 **Vue 2 单文件组件(`.vue`)** 为入口、放在
77
+ `plugins/<插件名>/` 下,通过 `cloudccBuild` / `cloudccBuild2` 等 CLI
78
+ 命令打包后,嵌入 CloudCC 页面或应用的前端能力单元。
79
+
80
+ 一个插件一般包含:
81
+
82
+ | 内容 | 作用 |
83
+ | ---------------------------------- | -------------------------------------------- |
84
+ | 入口 `.vue`(如 `cc-ai-chat.vue`) | 组件 UI 与业务逻辑 |
85
+ | `config.json` | 组件标识、名称、描述、分类、加载模式等元数据 |
86
+ | `components/`、`utils/` 等 | 子组件、HTTP 封装、适配器、第三方 SDK 封装 |
87
+
88
+ 入口组件中常见 `componentInfo` 对象,与 `config.json`
89
+ 呼应,用于平台展示组件信息与加载策略。
90
+
91
+ ### 0.2 自定义组件能做什么
92
+
93
+ - 扩展标准 CRM 页面:在记录页、列表页、门户中挂载专用界面
94
+ - 对接外部系统:接入 OpenAPI、Agent、地图、图可视化等复杂交互
95
+ - 使用 CloudCC 运行时能力:通过 `$CCDK` 读取用户、Token、网关、事件总线
96
+ - 实现独立数据层(按需):对接组织允许的外部存储或服务
97
+ - 搭建实施与诊断工具:同步、调试、日志、排查面板等运营能力
98
+
99
+ 一句话:自定义组件是在 CloudCC 宿主内运行、可独立版本化的前端扩展能力。
100
+
101
+ ### 0.3 为什么要用自定义组件
102
+
103
+ | 原因 | 说明 |
104
+ | ------------ | ----------------------------------------------------------- |
105
+ | 标准功能边界 | 标准布局与字段配置难覆盖甘特图、对话式 AI、复杂工作台等场景 |
106
+ | 体验与品牌 | 需要统一交互、定制视觉与复合布局体验 |
107
+ | 集成成本 | 第三方 SaaS/自研 API 更适合在前端组件中做适配封装 |
108
+ | 迭代效率 | 前端组件可独立发版,与后端逻辑解耦,支持小步快跑 |
109
+ | 复用能力 | 同一组件可复用到多个页面,通过属性配置实现差异化 |
110
+
111
+ ### 0.4 典型可解决问题
112
+
113
+ 1. 平台可配置但体验较差:通过专用 UI 优化录入、查询、可视化流程
114
+ 2. 必须与外部系统实时协同:在组件内完成请求与回调闭环
115
+ 3. 需要强上下文:利用 `$CCDK` 获取当前用户、视图与凭证避免重复登录
116
+ 4. 需要跨模块联动:借助总线事件让多个区域同步响应
117
+ 5. 需要工具化交付:建设调试与运维面板降低人工操作风险
118
+
119
+ ### 0.5 什么时候优先考虑自定义组件
120
+
121
+ | 场景类型 | 示例 |
122
+ | -------------- | ------------------------------ |
123
+ | 复杂可视化 | 甘特图、关系图、统计大屏 |
124
+ | 对话与智能助手 | 嵌入式 AI 聊天、Agent 工具面板 |
125
+ | 行业专用工作台 | 客户 360、项目工作台、专题门户 |
126
+ | 门户与附件增强 | 文件上传下载、模板导出导入 |
127
+ | 表单 + 外部库 | 自定义流程表单 + 第三方服务 |
128
+ | 实施与运维工具 | SQL 工具、健康检查、调试面板 |
129
+
130
+ 不建议强行使用自定义组件的场景:
131
+
132
+ - 仅靠标准字段、列表、校验即可满足需求时
133
+ - 需要强安全与一致性的核心业务规则(应放在服务端)
134
+
135
+ ### 0.6 开发与构建要点(仓库实践)
136
+
137
+ - 依赖按需引入,避免插件无关依赖膨胀
138
+ - 使用 `npm run build-plugin`(`cloudccBuild`)产出发布包
139
+ - 本地通过 `npm run serve` 快速调试组件交互
140
+ - 运行环境通过注入 `$CCDK` 提供统一账号、网关、上传、日志与事件能力
141
+
142
+ ### 0.7 结论
143
+
144
+ - 自定义组件 = CloudCC 宿主内的 Vue 插件包 + 元数据 + 可选 `$CCDK` 集成
145
+ - 核心价值:在保持平台一致性的同时,快速交付标准配置覆盖不到的能力
146
+ - 选型建议:复杂
147
+ UI、多系统集成、强上下文、工具化需求优先;可标准配置解决则优先标准方案
148
+
149
+ ---
150
+
151
+ ## 1. 快速上手:发布第一个组件
152
+
153
+ ### 1.1 启动项目
154
+
155
+ 在已完成环境搭建与模板项目创建后(见 `env-setup.md`),启动本地项目:
156
+
157
+ ```bash
158
+ npm run serve
159
+ ```
160
+
161
+ 浏览器访问 `http://localhost:8080/`,确认模板项目能正常运行。
162
+
163
+ ### 1.2 创建组件
164
+
165
+ - **使用本 CLI 时**:在项目根执行 `cc create plugin <name>`,会在 `plugins/<name>/` 生成标准模板(推荐)。
166
+ - 或在模板工程中手动新建入口文件,**组件名称必须满足 DOM 命名规则**,例如:`cc-com-demo.vue`
167
+ - 推荐遵循:以 `cc-` 开头,后续使用小写单词和 `-` 连接。
168
+
169
+ ### 1.3 在 `App` 中引入组件
170
+
171
+ 在模板项目的入口(通常是 `App.vue`
172
+ 或特定页面组件)中,引入你创建的组件并挂载到页面。
173
+
174
+ ### 1.4 本地预览
175
+
176
+ 保持 `npm run serve` 运行,在浏览器中访问
177
+ `http://localhost:8080/`,确认组件渲染正常。
178
+
179
+ ### 1.5 发布组件
180
+
181
+ **推荐(与仓库、CI 一致)**:在项目根目录执行:
182
+
183
+ ```bash
184
+ cc publish plugin <与目录名一致的 name>
185
+ ```
186
+
187
+ CLI 会编译 `plugins/<name>/<name>.vue` 并上传;首次成功且接口返回 `id` 时可能写回 `plugins/<name>/config.json`。
188
+
189
+ 也可在 VS Code 中右键组件入口文件,选择「发布组件」(CloudCC 扩展),控制台提示成功即表示已上传至平台,可在页面编辑器中使用。
190
+
191
+ ---
192
+
193
+ ## 2. 启动型组件(loadModel=start)
194
+
195
+ > 通过设置
196
+ > `loadModel: "start"`,可以让组件在应用启动时加载,而不是等页面渲染时再加载,适合做布局调整、全局样式/脚本注入、全局监听等。
197
+
198
+ ### 2.1 场景示例
199
+
200
+ 示例:使用启动型组件隐藏详情页右侧区域(如联系人详情页右侧活动动态 Card)。
201
+
202
+ ### 2.2 代码示例
203
+
204
+ ```vue
205
+ <template>
206
+ <div></div>
207
+ </template>
208
+
209
+ <script>
210
+ console.log("JS 脚本可以写在这里,会在组件加载时自动执行");
211
+
212
+ export default {
213
+ data() {
214
+ return {
215
+ componentInfo: {
216
+ // 组件唯一标识,全局唯一
217
+ component: "cloudcc-demo-a",
218
+ // 组件名称,在页面编辑器显示的名字
219
+ compName: "cloudcc-demo-a",
220
+ // 组件描述信息
221
+ compDesc: "组件描述信息",
222
+ // 设置组件在应用启动的时候加载
223
+ loadModel: "start"
224
+ },
225
+
226
+ };
227
+ }
228
+ };
229
+ </script>
230
+
231
+ <style lang="scss">
232
+ // 下方样式选择器仅作示例,具体 DOM 结构请以实际页面为准
233
+ .detail001 {
234
+ .main.left.scrollBoxUnique {
235
+ width: 100% !important;
236
+ }
237
+ .layoutSwitchBox {
238
+ display: none !important;
239
+ }
240
+ .right.scrollBoxUnique {
241
+ display: none !important;
242
+ }
243
+ }
244
+ </style>
245
+ ```
246
+
247
+ 说明:
248
+
249
+ - 示例中通过类名(如 `.detail001`)与子选择器控制布局与显示/隐藏。
250
+ - DOM
251
+ 结构可能随版本调整,**不要依赖不稳定选择器**,必要时配合「正确查找页面元素」最佳实践。
252
+
253
+ ---
254
+
255
+ ## 3. 避免样式污染(scoped)
256
+
257
+ > Vue 组件中不加 `scoped` 的 `style`
258
+ > 会导致全局样式污染。平台推荐所有组件样式默认使用 `scoped`。
259
+
260
+ ### 3.1 最小示例
261
+
262
+ ```vue
263
+ <template>
264
+ <div></div>
265
+ </template>
266
+
267
+ <script>
268
+ export default {
269
+ data() {
270
+ return {
271
+ componentInfo: {
272
+ component: "cloudcc-demo-a",
273
+ compName: "cloudcc-demo-a",
274
+ compDesc: "组件描述信息"
275
+ },
276
+
277
+ };
278
+ }
279
+ };
280
+ </script>
281
+
282
+ <style lang="scss" scoped>
283
+ // 因为设置了 scoped,此标签下的样式仅作用于当前组件
284
+ </style>
285
+ ```
286
+
287
+ 要点:
288
+
289
+ - `lang="scss"`:推荐统一使用 SCSS
290
+ - `scoped`:保证样式只作用在当前组件,避免影响宿主页面与其他组件
291
+
292
+ ---
293
+
294
+ ## 4. 使用 ECharts 绘制图表
295
+
296
+ > 平台已集成 `echarts@5.3.2`,组件打包时会排除该库,发布到平台后会自动引用平台
297
+ > ECharts 资源。
298
+
299
+ ### 4.1 代码示例(区域图)
300
+
301
+ ```vue
302
+ <template>
303
+ <div id="chartId" :style="{ width: '100%', height: '400px' }"></div>
304
+ </template>
305
+
306
+ <script>
307
+ import * as echarts from "echarts";
308
+
309
+ export default {
310
+ data() {
311
+ return {
312
+ componentInfo: {
313
+ component: "cloudcc-demo-a",
314
+ compName: "cloudcc-demo-a",
315
+ compDesc: "组件描述信息"
316
+ },
317
+ myChart: null
318
+ };
319
+ },
320
+ mounted() {
321
+ this.myChart = echarts.init(document.getElementById("chartId"));
322
+ this.myChart.setOption({
323
+ // 此处为官方示例配置,可按需裁剪和修改
324
+ color: ["#80FFA5", "#00DDFF", "#37A2FF", "#FF0087", "#FFBF00"],
325
+ title: { text: "Gradient Stacked Area Chart" },
326
+ tooltip: {
327
+ trigger: "axis",
328
+ axisPointer: {
329
+ type: "cross",
330
+ label: { backgroundColor: "#6a7985" }
331
+ }
332
+ },
333
+ legend: { data: ["Line 1", "Line 2", "Line 3", "Line 4", "Line 5"] },
334
+ toolbox: { feature: { saveAsImage: {} } },
335
+ grid: {
336
+ left: "3%",
337
+ right: "4%",
338
+ bottom: "3%",
339
+ containLabel: true
340
+ },
341
+ xAxis: [{ type: "category", boundaryGap: false, data: ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"] }],
342
+ yAxis: [{ type: "value" }],
343
+ series: [
344
+ // 省略部分 series 配置,可按官方示例使用
345
+ ]
346
+ });
347
+ }
348
+ };
349
+ </script>
350
+
351
+ <style lang="scss" scoped>
352
+ .cc-container {
353
+ text-align: center;
354
+ padding: 8px;
355
+ background: goldenrod;
356
+ }
357
+ </style>
358
+ ```
359
+
360
+ 建议:
361
+
362
+ - 在 `beforeDestroy`/`unmounted` 生命周期中调用 `this.myChart.dispose()`
363
+ 释放资源,避免内存泄露。
364
+
365
+ ---
366
+
367
+ ## 5. 在组件中调用自定义类(后端接口)
368
+
369
+ > 自定义组件调用后台自定义类已封装在 `CCDK` 中,**不要自己拼接 HTTP
370
+ > 地址**,统一使用 `$CCDK.CCCommon.post`。
371
+
372
+ ### 5.1 代码示例
373
+
374
+ ```vue
375
+ <template>
376
+ <div class="cc-container" @click="getInfo">Hello World</div>
377
+ </template>
378
+
379
+ <script>
380
+ export default {
381
+ data() {
382
+ return {
383
+ componentInfo: {
384
+ component: "cloudcc-demo-a",
385
+ compName: "cloudcc-demo-a",
386
+ compDesc: "组件描述信息"
387
+ },
388
+ };
389
+ },
390
+ methods: {
391
+ getInfo() {
392
+ const className = "AccountClass";
393
+ const methodName = "selectAccount";
394
+ const params = [
395
+ { argType: "java.lang.String", argValue: "hello" },
396
+ { argType: "java.lang.String", argValue: "world" }
397
+ ];
398
+
399
+ window.$CCDK.CCCommon.post(className, methodName, params)
400
+ .then(res => {
401
+ console.log(res);
402
+ })
403
+ .catch(error => {
404
+ console.error(error);
405
+ });
406
+ }
407
+ }
408
+ };
409
+ </script>
410
+
411
+ <style lang="scss" scoped>
412
+ .cc-container {
413
+ text-align: center;
414
+ padding: 8px;
415
+ background: goldenrod;
416
+ }
417
+ </style>
418
+ ```
419
+
420
+ 要点:
421
+
422
+ - `className`、`methodName` 必须与 CloudCC 后端自定义类和方法保持一致
423
+ - `params` 为按顺序传入的参数数组,每项包括 `argType`(Java 类型)与 `argValue`
424
+
425
+ ---
426
+
427
+ ## 6. 引入第三方库与静态资源
428
+
429
+ ### 6.1 通过 CCDK 注入第三方 JS(示例:jQuery)
430
+
431
+ > 平台提供统一 JS 注入能力 `CCDK.CCLoad.loadJs`,无需将第三方库打包进组件。
432
+
433
+ ```vue
434
+ <template>
435
+ <div></div>
436
+ </template>
437
+
438
+ <script>
439
+ // 在组件加载前引入 jQuery
440
+ window.$CCDK.CCLoad.loadJs(
441
+ "https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"
442
+ );
443
+
444
+ export default {
445
+ data() {
446
+ return {
447
+ componentInfo: {
448
+ component: "cloudcc-demo-a",
449
+ compName: "cloudcc-demo-a",
450
+ compDesc: "组件描述信息",
451
+ // 启动加载,确保第三方库在应用启动时就注入
452
+ loadModel: "start"
453
+ },
454
+
455
+ };
456
+ }
457
+ };
458
+ </script>
459
+ ```
460
+
461
+ 注意:
462
+
463
+ - 建议优先使用平台已集成的库;如需外部 CDN,要考虑可用性与合规性。
464
+
465
+ ### 6.2 使用静态资源图片
466
+
467
+ 1. 在「开发者控制台 → 静态资源」中新建并上传图片
468
+ 2. 在列表中复制该资源的访问地址
469
+ 3. 在组件中直接使用该 URL:
470
+
471
+ ```vue
472
+ <template>
473
+ <div>
474
+ <img
475
+ style="width: 800px; height: 800px"
476
+ src="https://res.lightning.cloudcc.cn/staticResource/org08f84e9c0566eaf0c/202309/16945042351857583.png"
477
+ />
478
+ </div>
479
+ </template>
480
+
481
+ <script>
482
+ export default {
483
+ data() {
484
+ return {
485
+ componentInfo: {
486
+ component: "cloudcc-demo-a",
487
+ compName: "cloudcc-demo-a",
488
+ compDesc: "组件描述信息",
489
+ loadModel: "start"
490
+ },
491
+
492
+ };
493
+ }
494
+ };
495
+ </script>
496
+ ```
497
+
498
+ ---
499
+
500
+ ## 7. 日志上报:CCLog(Info / Error)
501
+
502
+ > 为方便排查线上问题,平台提供 `CCDK.CCLog` 上报日志到监控平台,支持 Info 和
503
+ > Error 等级。
504
+
505
+ ### 7.1 上报 Info 日志
506
+
507
+ ```vue
508
+ <template>
509
+ <div>
510
+ <el-button @click="reportInfo">上报 Info 日志</el-button>
511
+ </div>
512
+ </template>
513
+
514
+ <script>
515
+ export default {
516
+ data() {
517
+ return {
518
+ componentInfo: {
519
+ component: "cloudcc-demo-a",
520
+ compName: "cloudcc-demo-a",
521
+ compDesc: "组件描述信息",
522
+ loadModel: "start"
523
+ },
524
+
525
+ };
526
+ },
527
+ methods: {
528
+ reportInfo() {
529
+ const logInfo = {
530
+ infoType: "debug", // 日志级别,如 debug/info 等
531
+ serviceName: "my app", // 服务/组件名称
532
+ infoMessage: "描述信息" // 描述内容
533
+ };
534
+ window.$CCDK.CCLog.reportInfoLog(logInfo);
535
+ }
536
+ }
537
+ };
538
+ </script>
539
+ ```
540
+
541
+ ### 7.2 上报 Error 日志
542
+
543
+ ```vue
544
+ <template>
545
+ <div>
546
+ <el-button @click="reportError">上报 Error 日志</el-button>
547
+ </div>
548
+ </template>
549
+
550
+ <script>
551
+ export default {
552
+ data() {
553
+ return {
554
+ componentInfo: {
555
+ component: "cloudcc-demo-a",
556
+ compName: "cloudcc-demo-a",
557
+ compDesc: "组件描述信息",
558
+ loadModel: "start"
559
+ },
560
+
561
+ };
562
+ },
563
+ methods: {
564
+ reportError() {
565
+ const logInfo = {
566
+ serviceName: "my app",
567
+ errorMessage: "错误描述信息",
568
+ printStackTraceInfo: "堆栈信息或补充说明"
569
+ };
570
+ window.$CCDK.CCLog.reportErrorLog(logInfo);
571
+ }
572
+ }
573
+ };
574
+ </script>
575
+ ```
576
+
577
+ ### 7.3 查看上报日志
578
+
579
+ 1. 登录 CloudCC 系统
580
+ 2. 点击右上角头像 → 进入「开发者平台」
581
+ 3. 进入对应日志菜单查看上报记录
582
+
583
+ ---
584
+
585
+ ## 8. 组件销毁逻辑与性能
586
+
587
+ > 由于自定义组件的特殊渲染逻辑,**必须控制组件销毁时机**,避免长时间使用导致内存不断上涨(OOM)。
588
+
589
+ ### 8.1 默认销毁策略
590
+
591
+ - 组件进入后台(用户不可见)时开始倒计时
592
+ - 倒计时结束后组件被销毁,默认销毁时间约为 20 分钟(具体以平台当前版本为准)
593
+
594
+ ### 8.2 自定义销毁时间
595
+
596
+ 在安全信息的高级配置中设置
597
+ `destroyTimeout`,所有打包组件共享该配置(单位:毫秒):
598
+
599
+ ```json
600
+ "devConsoleConfig": {
601
+ "destroyTimeout": 1200000
602
+ }
603
+ ```
604
+
605
+ 建议:
606
+
607
+ - 对于占用资源较高的组件(如大量 ECharts
608
+ 实例、轮询等),适当缩短销毁时间,并在组件卸载前主动释放资源。
609
+
610
+ ---
611
+
612
+ ## 9. 扩展属性(propObj / propOption)与动态配置
613
+
614
+ > 通过扩展属性,组件可以变成「可配置组件」,由页面编辑器在属性面板中采集配置数据,再由组件使用这些配置渲染不同效果。
615
+
616
+ ### 9.1 基本结构
617
+
618
+ ```js
619
+ data() {
620
+ return {
621
+ componentInfo: {
622
+ component: "cloudcc-demo-a",
623
+ compName: "cloudcc-demo-a",
624
+ compDesc: "组件描述信息",
625
+ loadModel: "start"
626
+ },
627
+ // 扩展属性对象:存放实际属性值
628
+ propObj: {
629
+ // 自定义属性时,必须写入 id
630
+ id: "",
631
+ src: ""
632
+ },
633
+ // 扩展属性配置:定义属性在页面编辑器中的展示形式
634
+ propOption: {
635
+ src: {
636
+ lable: "请输入图片地址",
637
+ type: "input"
638
+ }
639
+ },
640
+
641
+ };
642
+ }
643
+ ```
644
+
645
+ ### 9.2 在组件中接收扩展属性(elePropObj)
646
+
647
+ 页面编辑器会将配置好的属性通过 `props.elePropObj` 传入组件:
648
+
649
+ ```vue
650
+ <template>
651
+ <div>
652
+ <img style="width: 800px; height: 800px" :src="elePropObj.src" />
653
+ </div>
654
+ </template>
655
+
656
+ <script>
657
+ export default {
658
+ props: {
659
+ // 自定义属性对象
660
+ elePropObj: {
661
+ type: Object,
662
+ default: () => ({})
663
+ }
664
+ },
665
+ data() {
666
+ return {
667
+ componentInfo: {
668
+ component: "cloudcc-demo-a",
669
+ compName: "cloudcc-demo-a",
670
+ compDesc: "组件描述信息",
671
+ loadModel: "start"
672
+ },
673
+ propObj: {
674
+ id: "",
675
+ src: ""
676
+ },
677
+ propOption: {
678
+ src: {
679
+ lable: "请输入图片地址",
680
+ type: "input"
681
+ }
682
+ },
683
+
684
+ };
685
+ }
686
+ };
687
+ </script>
688
+ ```
689
+
690
+ ### 9.3 `propOption` 常用类型一览
691
+
692
+ > 所有配置写在 `data` 的 `propOption` 中,平台会根据 `type`
693
+ > 决定渲染何种采集控件。
694
+
695
+ - **输入框**:
696
+
697
+ ```js
698
+ propOption: {
699
+ src: {
700
+ lable: "请输入图片地址",
701
+ type: "input"
702
+ }
703
+ }
704
+ ```
705
+
706
+ - **日期选择器**:
707
+
708
+ ```js
709
+ propOption: {
710
+ src: {
711
+ lable: "日期选择器",
712
+ type: "date"
713
+ }
714
+ }
715
+ ```
716
+
717
+ - **时间选择器**:
718
+
719
+ ```js
720
+ propOption: {
721
+ src: {
722
+ lable: "时间选择器",
723
+ type: "time"
724
+ }
725
+ }
726
+ ```
727
+
728
+ - **图标选择器**:
729
+
730
+ ```js
731
+ propOption: {
732
+ src: {
733
+ lable: "图标",
734
+ type: "icon"
735
+ }
736
+ }
737
+ ```
738
+
739
+ - **颜色选择器**:
740
+
741
+ ```js
742
+ propOption: {
743
+ src: {
744
+ lable: "颜色",
745
+ type: "color"
746
+ }
747
+ }
748
+ ```
749
+
750
+ - **下拉框**:
751
+
752
+ ```js
753
+ propOption: {
754
+ src: {
755
+ lable: "下拉框",
756
+ type: "option",
757
+ options: [
758
+ { value: "fill", label: "fill" },
759
+ { value: "contain", label: "contain" }
760
+ ]
761
+ }
762
+ }
763
+ ```
764
+
765
+ - **切换器(单选按钮组)**:
766
+
767
+ ```js
768
+ propOption: {
769
+ src: {
770
+ lable: "切换器",
771
+ type: "radioButton",
772
+ options: [
773
+ { label: "default", value: "default" },
774
+ { label: "button", value: "button" }
775
+ ]
776
+ }
777
+ }
778
+ ```
779
+
780
+ - **开关**:
781
+
782
+ ```js
783
+ propOption: {
784
+ src: {
785
+ lable: "开关",
786
+ type: "switch"
787
+ }
788
+ }
789
+ ```
790
+
791
+ - **代码编辑框**:
792
+
793
+ ```js
794
+ propOption: {
795
+ src: {
796
+ lable: "代码编辑框",
797
+ type: "code"
798
+ }
799
+ }
800
+ ```
801
+
802
+ - **提示信息(带链接)**:
803
+
804
+ ```js
805
+ propOption: {
806
+ src: {
807
+ lable: "提示信息",
808
+ type: "word",
809
+ link: "https://www.baidu.com"
810
+ }
811
+ }
812
+ ```
813
+
814
+ ---
815
+
816
+ ## 10. 自定义事件(events / eventsOption)
817
+
818
+ > 通过扩展事件属性,可以让页面配置层注入一段可执行代码,在组件生命周期中回调,适用于少量灵活逻辑(需非常注意安全性与维护成本)。
819
+
820
+ ### 10.1 数据结构示例
821
+
822
+ ```js
823
+ data() {
824
+ return {
825
+ componentInfo: {
826
+ component: "test-plugin",
827
+ compName: "test-plugin",
828
+ compDesc: "Component description information"
829
+ },
830
+ events: {
831
+ // 自定义事件:在 created 生命周期执行
832
+ myCreated: `function created(self) {
833
+ // self 即 this,为当前组件的 Vue 实例
834
+ }`
835
+ },
836
+ eventsOption: {
837
+ myCreated: {
838
+ lable: "label.dev.created",
839
+ type: "code"
840
+ }
841
+ },
842
+
843
+ };
844
+ }
845
+ ```
846
+
847
+ ### 10.2 在生命周期中执行自定义事件
848
+
849
+ ```js
850
+ created() {
851
+ // 将字符串转为函数(eval 需谨慎使用,仅在可信环境启用)
852
+ const myCreated = eval("(false || " + this.eleEventObj.myCreated + ")");
853
+ myCreated(this);
854
+ }
855
+ ```
856
+
857
+ 注意:
858
+
859
+ - 此模式依赖 `eval`,有潜在安全风险,仅适用于内部受控场景
860
+ - 强烈建议对传入的代码做严格访问控制与审计
861
+
862
+ ---
863
+
864
+ ## 11. componentInfo 配置说明
865
+
866
+ ### 11.1 标准配置
867
+
868
+ ```js
869
+ componentInfo: {
870
+ // 组件唯一标识,全局唯一:
871
+ // 1. 必须使用小写英文
872
+ // 2. 由两个及以上单词组成
873
+ // 3. 使用 "-" 分隔
874
+ component: "cloudcc-demo-01",
875
+
876
+ // 组件名称,在页面编辑器中显示
877
+ compName: "演示使用组件",
878
+
879
+ // 组件描述信息
880
+ compDesc: "组件描述信息"
881
+ }
882
+ ```
883
+
884
+ ### 11.2 高级配置:loadModel
885
+
886
+ ```js
887
+ componentInfo: {
888
+ // 加载模式,不写时默认 "lazy"
889
+ // lazy:懒加载,仅在自定义页面实际加载组件时才加载
890
+ // start:启动加载,在应用启动时即加载组件
891
+ loadModel: "lazy";
892
+ }
893
+ ```
894
+
895
+ 推荐:
896
+
897
+ - 布局、全局脚本、埋点类组件可使用 `start`
898
+ - 普通展示组件默认使用 `lazy`
899
+
900
+ ---
901
+
902
+ ## 12. 进阶说明与架构提示
903
+
904
+ - 自定义组件的底层实现基于 Web Components,以支持跨框架组件开发与复用。
905
+ - 组件编译时,以组件入口文件作为构建入口,而非整个模板项目的 `main.js`:
906
+ - `main.js` 作为本地运行模板项目的入口,可按需调整
907
+ - 组件发布时,仅与组件入口及其依赖相关
908
+ - 引入第三方库时:
909
+ - 优先使用平台统一注入方式(如 `CCDK.CCLoad.loadJs`)
910
+ - 避免把大体积库直接打包进组件,减小发布包体积,提高加载性能
911
+
912
+ ---
913
+
914
+ ## 13. 自定义组件开发 Checklist
915
+
916
+ - [ ] 插件目录与云端同步仅通过 `cc create` / `cc publish` / `cc pull` / `cc delete` 等命令操作,不整包复制他人 `plugins/` 或手改 `config.json` 的 `id`
917
+ - [ ] 组件文件名与 `componentInfo.component` 命名符合规范(小写 + `-`
918
+ 分隔,全局唯一)
919
+ - [ ] 样式默认使用 `lang="scss" scoped`,避免样式污染
920
+ - [ ] 使用平台提供的 `CCDK` 能力调用后端、自定义类、日志上报等,不手写接口 URL
921
+ - [ ] 如需第三方库,优先使用 `CCLoad.loadJs` 或平台已集成的库
922
+ - [ ] 合理设置 `loadModel`(`lazy`/`start`),避免不必要的启动时加载
923
+ - [ ] 如使用 ECharts/定时器/监听等,注意在组件销毁时释放资源
924
+ - [ ] 合理使用 `propObj` / `propOption` / `elePropObj` 提升组件可配置性
925
+ - [ ] 如启用 `events` 动态代码,确保仅在可信场景使用,并有审计与限制
926
+ - [ ] 发布前在本地 `npm run serve` 完整验证主要功能与交互
927
+
928
+ ---
929
+
930
+ ## 14. 命令使用说明(与实现一致)
931
+
932
+ 文首「CLI 与本地文件(必读)」为总览;本节按子命令列出行为细节。
933
+
934
+ ### 14.1 create
935
+
936
+ ```bash
937
+ cc create plugin <name>
938
+ ```
939
+
940
+ - 创建 `plugins/<name>/` 目录、入口 `<name>.vue`、`components/` 与 `config.json` 模板。
941
+
942
+ ### 14.2 publish
943
+
944
+ ```bash
945
+ cc publish plugin <name>
946
+ ```
947
+
948
+ - 以 `plugins/<name>/<name>.vue` 为入口编译(`vue-cli-service build --target lib`),再上传到云端。
949
+ - 首次发布成功且响应包含 `id` 时,会写回 `plugins/<name>/config.json`(若此前无 `id`)。
950
+
951
+ ### 14.3 get
952
+
953
+ ```bash
954
+ cc get plugin [projectPath]
955
+ ```
956
+
957
+ - 分页请求云端组件列表,标准输出为 JSON 数组。
958
+ - `projectPath` 可选,用于解析项目根下的 `cloudcc-cli` 配置。
959
+
960
+ ### 14.4 detail
961
+
962
+ ```bash
963
+ cc detail plugin <pluginName> [pluginId] [projectPath]
964
+ cc detail plugin "" <pluginId> [projectPath]
965
+ ```
966
+
967
+ - 提供 `pluginName`(且非空):读取本地 `plugins/<pluginName>/` 的 `config.json` 与入口 `.vue`。
968
+ - 将 `pluginName` 置为空并传 `pluginId`:仅从云端查询详情(`projectPath` 仍用于配置)。
969
+ - 需要指定项目根且保留「仅本地名」时,可用占位:`cc detail plugin <pluginName> "" <projectPath>`(中间空串表示无 `pluginId`)。
970
+
971
+ ### 14.5 pull
972
+
973
+ ```bash
974
+ cc pull plugin <pluginNameOrId> [projectPath]
975
+ ```
976
+
977
+ - 若 `plugins/<输入>/config.json` 存在且含 `id`,按该 `id` 拉取。
978
+ - 否则将输入视为云端组件 ID,拉取后在 `plugins/<归一化名称>/` 等处落盘并更新 `config.json`。
979
+
980
+ ### 14.6 delete
981
+
982
+ ```bash
983
+ cc delete plugin <pluginNameOrId> [projectPath]
984
+ ```
985
+
986
+ - 若本地 `plugins/<name>/config.json` 存在且含 `id`,优先按该 `id` 调删除接口。
987
+ - 否则将参数视为云端 ID 直接删除。
988
+
989
+ ### 14.7 doc
990
+
991
+ ```bash
992
+ cc doc plugin introduction
993
+ cc doc plugin devguide
994
+ ```
995
+
996
+ - 仅支持 `introduction` 与 `devguide`;`devguide` 会在正文后拼接附录「CCDK SDK 速查」。