cloudcc-cli 2.2.4 → 2.2.6

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 (46) hide show
  1. package/.cloudcc-cache.json +34 -0
  2. package/README.md +1428 -520
  3. package/bin/cc.js +0 -2
  4. package/bin/index.js +4 -0
  5. package/package.json +1 -1
  6. package/src/application/create.js +114 -0
  7. package/src/application/get.js +13 -0
  8. package/src/application/index.js +8 -0
  9. package/src/classes/create.js +66 -0
  10. package/src/classes/detail.js +78 -0
  11. package/src/classes/get.js +24 -0
  12. package/src/classes/index.js +12 -0
  13. package/src/classes/publish.js +51 -0
  14. package/src/classes/pull.js +55 -0
  15. package/src/classes/pullList.js +46 -0
  16. package/src/mcp/index.js +43 -9
  17. package/src/mcp/readme.md +6 -3
  18. package/src/mcp/tools/Application Creator/handler.js +80 -0
  19. package/src/mcp/tools/CloudCC Development Overview/prompt.js +4 -3
  20. package/src/mcp/tools/Menu Creator/handler.js +109 -0
  21. package/src/mcp/tools/Trigger Editor Guide/handler.js +4 -4
  22. package/src/menu/common.js +16 -0
  23. package/src/menu/create-object.js +94 -0
  24. package/src/menu/create-page.js +108 -0
  25. package/src/menu/create-script.js +108 -0
  26. package/src/menu/create-site.js +108 -0
  27. package/src/menu/create.js +54 -0
  28. package/src/menu/index.js +7 -0
  29. package/src/plugin/pull.js +3 -0
  30. package/target/classes/com/cloudcc/core/CCObject.class +0 -0
  31. package/target/classes/com/cloudcc/core/CCSchedule.class +0 -0
  32. package/target/classes/com/cloudcc/core/CCService.class +0 -0
  33. package/target/classes/com/cloudcc/core/CCTrigger.class +0 -0
  34. package/target/classes/com/cloudcc/core/CCTriggerHandler.class +0 -0
  35. package/target/classes/com/cloudcc/core/DevLogger.class +0 -0
  36. package/target/classes/com/cloudcc/core/OperatationEnum.class +0 -0
  37. package/target/classes/com/cloudcc/core/PeakInterf.class +0 -0
  38. package/target/classes/com/cloudcc/core/SendEmail.class +0 -0
  39. package/target/classes/com/cloudcc/core/ServiceResult.class +0 -0
  40. package/target/classes/com/cloudcc/core/TimeUtil.class +0 -0
  41. package/target/classes/com/cloudcc/core/Tool$1.class +0 -0
  42. package/target/classes/com/cloudcc/core/Tool.class +0 -0
  43. package/target/classes/com/cloudcc/core/TriggerInvoker.class +0 -0
  44. package/target/classes/com/cloudcc/core/TriggerMethod.class +0 -0
  45. package/target/classes/com/cloudcc/core/TriggerTimeEnum.class +0 -0
  46. package/target/classes/com/cloudcc/core/UserInfo.class +0 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Application Creator Handler
3
+ * 提供创建应用(Application)的 MCP 工具实现
4
+ */
5
+
6
+ const path = require('path');
7
+ const createApplication = require('../../../application/create');
8
+
9
+ /**
10
+ * 创建应用
11
+ * @param {{
12
+ * appName: string,
13
+ * appCode: string,
14
+ * menuIds?: string,
15
+ * projectPath?: string
16
+ * }} params
17
+ */
18
+ async function createApplicationTool(params = {}) {
19
+ try {
20
+ const { appName, appCode, menuIds, projectPath } = params;
21
+
22
+ // 验证必需参数
23
+ if (!appName || !appCode) {
24
+ return {
25
+ content: [{
26
+ type: 'text',
27
+ text: '✗ 参数缺失: appName (应用名称) 和 appCode (应用代码) 必须提供\n\n参数说明:\n- appName: 应用的显示名称\n- appCode: 应用的代码标识\n- menuIds: 菜单ID列表(可选,多个时用逗号分隔,默认包含 acf000001)\n- projectPath: 项目路径(可选,默认为当前工作目录)'
28
+ }]
29
+ };
30
+ }
31
+
32
+ const resolvedPath = path.resolve(projectPath || '.');
33
+
34
+ // 构建参数数组,格式: ['create', 'application', path, p1, p2, duel1]
35
+ // 注意:argvs[2] 是 path,argvs[3] 是 p1,argvs[4] 是 p2,argvs[5] 是 duel1
36
+ const argvs = [
37
+ 'create',
38
+ 'application',
39
+ resolvedPath,
40
+ appName,
41
+ appCode
42
+ ];
43
+
44
+ // 如果提供了 menuIds,添加到参数中
45
+ if (menuIds) {
46
+ argvs.push(menuIds);
47
+ }
48
+
49
+ // 调用创建函数
50
+ const result = await createApplication(argvs);
51
+
52
+ if (result && result.result) {
53
+ const appId = result.data?.COMMON_APPID || '未知';
54
+ return {
55
+ content: [{
56
+ type: 'text',
57
+ text: `✓ 应用创建成功!\n\n应用名称: ${appName}\n应用代码: ${appCode}\n应用ID: ${appId}\n项目目录: ${resolvedPath}\n菜单ID: ${menuIds || 'acf000001(默认)'}\n\n应用已成功创建并配置到 CloudCC 系统中。`
58
+ }]
59
+ };
60
+ } else {
61
+ return {
62
+ content: [{
63
+ type: 'text',
64
+ text: `⚠ 应用创建遇到问题\n\n请检查:\n1. 应用名称和应用代码是否符合规范\n2. CloudCC服务器连接是否正常\n3. 项目配置是否正确\n4. 是否有足够的权限创建应用\n5. 菜单ID是否正确`
65
+ }]
66
+ };
67
+ }
68
+ } catch (error) {
69
+ return {
70
+ content: [{
71
+ type: 'text',
72
+ text: `✗ 应用创建失败: ${error.message}\n\n错误详情:\n${error.stack || '无详细信息'}\n\n请检查:\n1. 应用名称和应用代码是否正确\n2. 项目路径是否正确\n3. CloudCC服务器连接是否正常\n4. 项目配置文件是否存在\n5. 菜单ID格式是否正确(多个时用逗号分隔)`
73
+ }]
74
+ };
75
+ }
76
+ }
77
+
78
+ module.exports = {
79
+ createApplicationTool
80
+ };
@@ -855,6 +855,7 @@ CloudCC 是一个功能强大的低代码 CRM 平台,提供:
855
855
  ✅ **丰富的前端能力** - Vue 组件、客户端脚本、CCDK API
856
856
  ✅ **标准化的开发流程** - 从环境搭建到部署发布的完整工具链
857
857
  ✅ **强大的 MCP 工具** - AI 辅助开发,提升开发效率
858
+ ✅ **Supabase MCP 集成** - Supabase MCP integration for database operations, authentication, storage, and real-time subscriptions. Manage your Supabase projects, run SQL queries, and interact with your backend directly. AI 可通过 Supabase MCP 与数据库、认证、存储及实时订阅交互,管理项目、执行 SQL、直接操作后端。
858
859
 
859
860
  **开发原则**:
860
861
  1. 编辑任何代码前,先使用 \`*_editor_guide\` 获取开发指南
@@ -864,7 +865,7 @@ CloudCC 是一个功能强大的低代码 CRM 平台,提供:
864
865
  `;
865
866
 
866
867
  module.exports = {
867
- prompts: {
868
- overviewContent
869
- }
868
+ prompts: {
869
+ overviewContent
870
+ }
870
871
  };
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Menu Creator Handler
3
+ * 提供创建菜单(标签页)的 MCP 工具实现
4
+ * 支持类型:object(自定义对象)、page(自定义页面)、script(自定义脚本)、site(站点)
5
+ */
6
+
7
+ const path = require('path');
8
+ const createObjectMenu = require('../../../menu/create-object');
9
+ const createPageMenu = require('../../../menu/create-page');
10
+ const createScriptMenu = require('../../../menu/create-script');
11
+ const createSiteMenu = require('../../../menu/create-site');
12
+
13
+ /**
14
+ * 创建菜单
15
+ * @param {{
16
+ * menuType: 'object' | 'page' | 'script' | 'site',
17
+ * resourceId: string,
18
+ * tabName: string,
19
+ * projectPath?: string
20
+ * }} params
21
+ */
22
+ async function createMenuTool(params = {}) {
23
+ try {
24
+ const { menuType, resourceId, tabName, projectPath } = params;
25
+
26
+ // 验证必需参数
27
+ if (!menuType || !resourceId || !tabName) {
28
+ return {
29
+ content: [{
30
+ type: 'text',
31
+ text: '✗ 参数缺失: menuType (菜单类型)、resourceId (资源ID) 和 tabName (标签名称) 必须提供\n\n支持的菜单类型:\n- object: 自定义对象菜单\n- page: 自定义页面菜单\n- script: 自定义脚本菜单\n- site: 站点菜单'
32
+ }]
33
+ };
34
+ }
35
+
36
+ // 验证菜单类型
37
+ const validTypes = ['object', 'page', 'script', 'site'];
38
+ if (!validTypes.includes(menuType)) {
39
+ return {
40
+ content: [{
41
+ type: 'text',
42
+ text: `✗ 无效的菜单类型: ${menuType}\n\n支持的菜单类型:\n- object: 自定义对象菜单\n- page: 自定义页面菜单\n- script: 自定义脚本菜单\n- site: 站点菜单`
43
+ }]
44
+ };
45
+ }
46
+
47
+ const resolvedPath = path.resolve(projectPath || '.');
48
+
49
+ // 构建参数数组,格式: ['create', 'menu', menuType, path, resourceId, tabName, tabStyle, mobileimg, cloudccservicetab]
50
+ const argvs = [
51
+ 'create',
52
+ 'menu',
53
+ menuType,
54
+ resolvedPath,
55
+ resourceId,
56
+ tabName
57
+ ];
58
+
59
+ // 根据菜单类型调用不同的创建函数
60
+ let result;
61
+ let resourceTypeName;
62
+
63
+ switch (menuType) {
64
+ case 'object':
65
+ result = await createObjectMenu(argvs);
66
+ resourceTypeName = '对象';
67
+ break;
68
+ case 'page':
69
+ result = await createPageMenu(argvs);
70
+ resourceTypeName = '页面';
71
+ break;
72
+ case 'script':
73
+ result = await createScriptMenu(argvs);
74
+ resourceTypeName = '脚本';
75
+ break;
76
+ case 'site':
77
+ result = await createSiteMenu(argvs);
78
+ resourceTypeName = '站点';
79
+ break;
80
+ }
81
+
82
+ if (result && result.result) {
83
+ return {
84
+ content: [{
85
+ type: 'text',
86
+ text: `✓ 自定义${resourceTypeName}菜单创建成功!\n\n菜单类型: ${menuType}\n资源ID: ${resourceId}\n标签名称: ${tabName}\n项目目录: ${resolvedPath}\n\n菜单已成功创建并配置到 CloudCC 系统中。`
87
+ }]
88
+ };
89
+ } else {
90
+ return {
91
+ content: [{
92
+ type: 'text',
93
+ text: `⚠ ${resourceTypeName}菜单创建遇到问题\n\n请检查:\n1. 资源ID是否正确\n2. 标签名称是否符合规范\n3. CloudCC服务器连接是否正常\n4. 项目配置是否正确\n5. 是否有足够的权限创建菜单`
94
+ }]
95
+ };
96
+ }
97
+ } catch (error) {
98
+ return {
99
+ content: [{
100
+ type: 'text',
101
+ text: `✗ 菜单创建失败: ${error.message}\n\n错误详情:\n${error.stack || '无详细信息'}\n\n请检查:\n1. 资源ID是否正确\n2. 项目路径是否正确\n3. CloudCC服务器连接是否正常\n4. 项目配置文件是否存在\n5. 菜单类型是否支持`
102
+ }]
103
+ };
104
+ }
105
+ }
106
+
107
+ module.exports = {
108
+ createMenuTool
109
+ };
@@ -16,7 +16,7 @@ async function editTrigger({ topic = 'overview' }) {
16
16
  // 触发器使用与自定义类和定时类相同的编辑指南
17
17
  // 只是继承的基类不同(CCTrigger vs CCClass vs CCSchedule)
18
18
  const result = await classEditorGuideHandler.editClass({ topic });
19
-
19
+
20
20
  // 在结果前添加触发器特定说明
21
21
  if (result.content && result.content[0]) {
22
22
  const triggerNote = `
@@ -32,8 +32,8 @@ async function editTrigger({ topic = 'overview' }) {
32
32
  5. 常见用途:数据验证、字段自动填充、关联数据更新、业务规则检查等
33
33
 
34
34
  触发器中可访问的特殊变量:
35
- - newList:新记录列表(insert/update操作)
36
- - oldList:旧记录列表(update/delete操作)
35
+ - record_new:新记录列表(insert/update操作)
36
+ - record_old:旧记录列表(update/delete操作)
37
37
  - trigger.isInsert:是否为插入操作
38
38
  - trigger.isUpdate:是否为更新操作
39
39
  - trigger.isDelete:是否为删除操作
@@ -46,7 +46,7 @@ async function editTrigger({ topic = 'overview' }) {
46
46
  `;
47
47
  result.content[0].text = triggerNote + result.content[0].text;
48
48
  }
49
-
49
+
50
50
  return result;
51
51
  } catch (error) {
52
52
  return { content: [{ type: 'text', text: `✗ 获取触发器编辑指南失败: ${error.message}` }] };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 构建公共的菜单字段
3
+ */
4
+ function buildCommonMenuFields(tabName, tabStyle, mobileimg, cloudccservicetab) {
5
+ const commonFields = {
6
+ tabName: tabName,
7
+ tabStyle: tabStyle,
8
+ mobileimg: mobileimg,
9
+ cloudccservicetab: cloudccservicetab,
10
+ };
11
+ return commonFields;
12
+ }
13
+
14
+ module.exports = {
15
+ buildCommonMenuFields
16
+ };
@@ -0,0 +1,94 @@
1
+ const { postClass } = require("../../utils/http")
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const briefGet = require("../brief/get");
4
+ const objectGet = require("../object/get");
5
+ const chalk = require('chalk');
6
+ const { buildCommonMenuFields } = require('./common');
7
+
8
+ /**
9
+ * 创建自定义对象菜单
10
+ * @param {Array} argvs - 命令行参数数组
11
+ * @returns {Promise<Object>} 创建结果
12
+ */
13
+ async function createObjectMenu(argvs) {
14
+ try {
15
+ // 命令行参数格式:cc create menu object <path> <objectId> <tabName>
16
+ // argvs: ['create', 'menu', 'object', '.', 'objectId', 'tabName', ...]
17
+ let path = argvs[3]; // 路径 (argvs[3])
18
+ let objectId = argvs[4]; // 对象ID (p1)
19
+ let tabName = argvs[5]; // 标签名称
20
+ let tabStyle = "cloudtab145"; // 标签样式图标,默认 cloudtab145
21
+ let mobileimg = "cloudcc01"; // 移动端图标,默认 cloudcc01
22
+ let cloudccservicetab = "cloudccservicetab_1"; // 服务标签图标,默认 cloudccservicetab_1
23
+
24
+ if (!objectId || !tabName) {
25
+ console.error();
26
+ console.error(chalk.red('Error: 缺少必需参数'));
27
+ console.error('用法: cc create menu object <path> <objectId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]');
28
+ console.error();
29
+ throw new Error('缺少必需参数: objectId 和 tabName');
30
+ }
31
+
32
+ let config = await getPackageJson(path);
33
+
34
+ // 从 brief/get 获取角色ID列表
35
+ // briefGet 期望 argvs[2] 是 path,所以需要调整参数数组
36
+ const briefArgvs = [argvs[0], argvs[1], path]; // ['create', 'menu', path]
37
+ let briefData = await briefGet(briefArgvs);
38
+
39
+ if (!briefData.success) {
40
+ console.error("获取角色列表失败:", briefData.message);
41
+ throw new Error("获取角色列表失败");
42
+ }
43
+
44
+ // 提取所有角色的 ID 列表,格式为 "profileId_show"
45
+ const profileIds = briefData.data.map(profile => `${profile.id}_show`);
46
+
47
+ // 构建公共字段
48
+ const commonFields = buildCommonMenuFields(tabName, tabStyle, mobileimg, cloudccservicetab);
49
+
50
+ // 构建请求体
51
+ const requestBody = {
52
+ ed: "ed",
53
+ visited_0: "1",
54
+ visited_1: "1",
55
+ visited_2: "1",
56
+ allOrSome: "some",
57
+ type: "object",
58
+ p1: objectId,
59
+ ...commonFields,
60
+ profileIds: profileIds,
61
+ };
62
+
63
+ // 显示创建进度
64
+ console.error();
65
+ console.error(chalk.green('Creating object menu, please wait...'));
66
+ console.error();
67
+
68
+ // 发送请求到服务器
69
+ const result = await postClass(
70
+ config.setupSvc + "/api/customTab/tabSetDone",
71
+ requestBody,
72
+ config.accessToken
73
+ );
74
+
75
+ // API 返回结构中, result 字段决定调用是否成功
76
+ if (result && result.result) {
77
+ console.error();
78
+ console.error(chalk.green('Success!'));
79
+ console.error();
80
+ return result;
81
+ } else {
82
+ const msg = result && result.returnInfo ? result.returnInfo : 'Unknown error';
83
+ console.error();
84
+ console.error(chalk.red('Error:' + msg));
85
+ throw new Error('Create Object Menu Failed: ' + msg);
86
+ }
87
+ } catch (error) {
88
+ console.error();
89
+ console.error(chalk.red("自定义对象菜单创建失败:"), error);
90
+ throw error;
91
+ }
92
+ }
93
+
94
+ module.exports = createObjectMenu;
@@ -0,0 +1,108 @@
1
+ const { postClass } = require("../../utils/http")
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const briefGet = require("../brief/get");
4
+ const chalk = require('chalk');
5
+ const { buildCommonMenuFields } = require('./common');
6
+
7
+ /**
8
+ * 创建自定义页面菜单
9
+ * @param {Array} argvs - 命令行参数数组
10
+ * @returns {Promise<Object>} 创建结果
11
+ */
12
+ async function createPageMenu(argvs) {
13
+ try {
14
+ // 命令行参数格式:cc create menu page <path> <pageId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]
15
+ // argvs: ['create', 'menu', 'page', '.', 'pageId', 'tabName', ...]
16
+ let path = argvs[3]; // 路径 (argvs[3])
17
+ let pageId = argvs[4]; // 页面ID (p1)
18
+ let tabName = argvs[5]; // 标签名称
19
+ let tabStyle = argvs[6] || "cloudtab145"; // 标签样式图标,默认 cloudtab145
20
+ let mobileimg = argvs[7] || "cloudcc01"; // 移动端图标,默认 cloudcc01
21
+ let cloudccservicetab = argvs[8] || "cloudccservicetab_1"; // 服务标签图标,默认 cloudccservicetab_1
22
+
23
+ if (!pageId || !tabName) {
24
+ console.error();
25
+ console.error(chalk.red('Error: 缺少必需参数'));
26
+ console.error('用法: cc create menu page <path> <pageId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]');
27
+ console.error();
28
+ throw new Error('缺少必需参数: pageId 和 tabName');
29
+ }
30
+
31
+ let config = await getPackageJson(path);
32
+
33
+ // 从 brief/get 获取角色ID列表
34
+ // briefGet 期望 argvs[2] 是 path,所以需要调整参数数组
35
+ const briefArgvs = [argvs[0], argvs[1], path]; // ['create', 'menu', path]
36
+ let briefData = await briefGet(briefArgvs);
37
+
38
+ if (!briefData.success) {
39
+ console.error("获取角色列表失败:", briefData.message);
40
+ throw new Error("获取角色列表失败");
41
+ }
42
+
43
+ // 提取所有角色的 ID 列表,格式为 "profileId_show"
44
+ const profileIds = briefData.data.map(profile => `${profile.id}_show`);
45
+
46
+ // 构建公共字段
47
+ const commonFields = buildCommonMenuFields(tabName, tabStyle, mobileimg, cloudccservicetab);
48
+
49
+ // 构建请求体
50
+ const requestBody = {
51
+ ed: "ed",
52
+ visited_0: "1",
53
+ visited_1: "1",
54
+ visited_2: "1",
55
+ allOrSome: "some",
56
+ type: "page",
57
+ p1: pageId,
58
+ p1_origin: {
59
+ label: "label.import.index.page",
60
+ fieldKey: "p1",
61
+ field: "Select",
62
+ required: "right",
63
+ hint: "label.customer.tab.step1.selectonepage",
64
+ rules: [
65
+ {
66
+ required: true,
67
+ message: "请选择页面",
68
+ trigger: "blur"
69
+ }
70
+ ],
71
+ value: pageId
72
+ },
73
+ ...commonFields,
74
+ profileIds: profileIds,
75
+ };
76
+
77
+ // 显示创建进度
78
+ console.error();
79
+ console.error(chalk.green('Creating page menu, please wait...'));
80
+ console.error();
81
+
82
+ // 发送请求到服务器
83
+ const result = await postClass(
84
+ config.setupSvc + "/api/customTab/tabSetDone",
85
+ requestBody,
86
+ config.accessToken
87
+ );
88
+
89
+ // API 返回结构中, result 字段决定调用是否成功
90
+ if (result && result.result) {
91
+ console.error();
92
+ console.error(chalk.green('Success!'));
93
+ console.error();
94
+ return result;
95
+ } else {
96
+ const msg = result && result.returnInfo ? result.returnInfo : 'Unknown error';
97
+ console.error();
98
+ console.error(chalk.red('Error:' + msg));
99
+ throw new Error('Create Page Menu Failed: ' + msg);
100
+ }
101
+ } catch (error) {
102
+ console.error();
103
+ console.error(chalk.red("自定义页面菜单创建失败:"), error);
104
+ throw error;
105
+ }
106
+ }
107
+
108
+ module.exports = createPageMenu;
@@ -0,0 +1,108 @@
1
+ const { postClass } = require("../../utils/http")
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const briefGet = require("../brief/get");
4
+ const chalk = require('chalk');
5
+ const { buildCommonMenuFields } = require('./common');
6
+
7
+ /**
8
+ * 创建自定义脚本菜单
9
+ * @param {Array} argvs - 命令行参数数组
10
+ * @returns {Promise<Object>} 创建结果
11
+ */
12
+ async function createScriptMenu(argvs) {
13
+ try {
14
+ // 命令行参数格式:cc create menu script <path> <scriptId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]
15
+ // argvs: ['create', 'menu', 'script', '.', 'scriptId', 'tabName', ...]
16
+ let path = argvs[3]; // 路径 (argvs[3])
17
+ let scriptId = argvs[4]; // 脚本ID (p1)
18
+ let tabName = argvs[5]; // 标签名称
19
+ let tabStyle = argvs[6] || "cloudtab145"; // 标签样式图标,默认 cloudtab145
20
+ let mobileimg = argvs[7] || "cloudcc01"; // 移动端图标,默认 cloudcc01
21
+ let cloudccservicetab = argvs[8] || "cloudccservicetab_1"; // 服务标签图标,默认 cloudccservicetab_1
22
+
23
+ if (!scriptId || !tabName) {
24
+ console.error();
25
+ console.error(chalk.red('Error: 缺少必需参数'));
26
+ console.error('用法: cc create menu script <path> <scriptId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]');
27
+ console.error();
28
+ throw new Error('缺少必需参数: scriptId 和 tabName');
29
+ }
30
+
31
+ let config = await getPackageJson(path);
32
+
33
+ // 从 brief/get 获取角色ID列表
34
+ // briefGet 期望 argvs[2] 是 path,所以需要调整参数数组
35
+ const briefArgvs = [argvs[0], argvs[1], path]; // ['create', 'menu', path]
36
+ let briefData = await briefGet(briefArgvs);
37
+
38
+ if (!briefData.success) {
39
+ console.error("获取角色列表失败:", briefData.message);
40
+ throw new Error("获取角色列表失败");
41
+ }
42
+
43
+ // 提取所有角色的 ID 列表,格式为 "profileId_show"
44
+ const profileIds = briefData.data.map(profile => `${profile.id}_show`);
45
+
46
+ // 构建公共字段
47
+ const commonFields = buildCommonMenuFields(tabName, tabStyle, mobileimg, cloudccservicetab);
48
+
49
+ // 构建请求体
50
+ const requestBody = {
51
+ ed: "ed",
52
+ visited_0: "1",
53
+ visited_1: "1",
54
+ visited_2: "1",
55
+ allOrSome: "some",
56
+ type: "script",
57
+ p1: scriptId,
58
+ p1_origin: {
59
+ label: "label.import.index.script",
60
+ fieldKey: "p1",
61
+ field: "Select",
62
+ required: "right",
63
+ hint: "label.customer.tab.step1.selectonescript",
64
+ rules: [
65
+ {
66
+ required: true,
67
+ message: "请选择脚本",
68
+ trigger: "blur"
69
+ }
70
+ ],
71
+ value: scriptId
72
+ },
73
+ ...commonFields,
74
+ profileIds: profileIds,
75
+ };
76
+
77
+ // 显示创建进度
78
+ console.error();
79
+ console.error(chalk.green('Creating script menu, please wait...'));
80
+ console.error();
81
+
82
+ // 发送请求到服务器
83
+ const result = await postClass(
84
+ config.setupSvc + "/api/customTab/tabSetDone",
85
+ requestBody,
86
+ config.accessToken
87
+ );
88
+
89
+ // API 返回结构中, result 字段决定调用是否成功
90
+ if (result && result.result) {
91
+ console.error();
92
+ console.error(chalk.green('Success!'));
93
+ console.error();
94
+ return result;
95
+ } else {
96
+ const msg = result && result.returnInfo ? result.returnInfo : 'Unknown error';
97
+ console.error();
98
+ console.error(chalk.red('Error:' + msg));
99
+ throw new Error('Create Script Menu Failed: ' + msg);
100
+ }
101
+ } catch (error) {
102
+ console.error();
103
+ console.error(chalk.red("自定义脚本菜单创建失败:"), error);
104
+ throw error;
105
+ }
106
+ }
107
+
108
+ module.exports = createScriptMenu;
@@ -0,0 +1,108 @@
1
+ const { postClass } = require("../../utils/http")
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const briefGet = require("../brief/get");
4
+ const chalk = require('chalk');
5
+ const { buildCommonMenuFields } = require('./common');
6
+
7
+ /**
8
+ * 创建站点菜单
9
+ * @param {Array} argvs - 命令行参数数组
10
+ * @returns {Promise<Object>} 创建结果
11
+ */
12
+ async function createSiteMenu(argvs) {
13
+ try {
14
+ // 命令行参数格式:cc create menu site <path> <siteId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]
15
+ // argvs: ['create', 'menu', 'site', '.', 'siteId', 'tabName', ...]
16
+ let path = argvs[3]; // 路径 (argvs[3])
17
+ let siteId = argvs[4]; // 站点ID (p1)
18
+ let tabName = argvs[5]; // 标签名称
19
+ let tabStyle = argvs[6] || "cloudtab145"; // 标签样式图标,默认 cloudtab145
20
+ let mobileimg = argvs[7] || "cloudcc01"; // 移动端图标,默认 cloudcc01
21
+ let cloudccservicetab = argvs[8] || "cloudccservicetab_1"; // 服务标签图标,默认 cloudccservicetab_1
22
+
23
+ if (!siteId || !tabName) {
24
+ console.error();
25
+ console.error(chalk.red('Error: 缺少必需参数'));
26
+ console.error('用法: cc create menu site <path> <siteId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]');
27
+ console.error();
28
+ throw new Error('缺少必需参数: siteId 和 tabName');
29
+ }
30
+
31
+ let config = await getPackageJson(path);
32
+
33
+ // 从 brief/get 获取角色ID列表
34
+ // briefGet 期望 argvs[2] 是 path,所以需要调整参数数组
35
+ const briefArgvs = [argvs[0], argvs[1], path]; // ['create', 'menu', path]
36
+ let briefData = await briefGet(briefArgvs);
37
+
38
+ if (!briefData.success) {
39
+ console.error("获取角色列表失败:", briefData.message);
40
+ throw new Error("获取角色列表失败");
41
+ }
42
+
43
+ // 提取所有角色的 ID 列表,格式为 "profileId_show"
44
+ const profileIds = briefData.data.map(profile => `${profile.id}_show`);
45
+
46
+ // 构建公共字段
47
+ const commonFields = buildCommonMenuFields(tabName, tabStyle, mobileimg, cloudccservicetab);
48
+
49
+ // 构建请求体
50
+ const requestBody = {
51
+ ed: "ed",
52
+ visited_0: "1",
53
+ visited_1: "1",
54
+ visited_2: "1",
55
+ allOrSome: "some",
56
+ type: "site",
57
+ p1: siteId,
58
+ p1_origin: {
59
+ label: "label.import.index.site",
60
+ fieldKey: "p1",
61
+ field: "Select",
62
+ required: "right",
63
+ hint: "label.customer.tab.step1.selectonesite",
64
+ rules: [
65
+ {
66
+ required: true,
67
+ message: "请选择站点",
68
+ trigger: "blur"
69
+ }
70
+ ],
71
+ value: siteId
72
+ },
73
+ ...commonFields,
74
+ profileIds: profileIds,
75
+ };
76
+
77
+ // 显示创建进度
78
+ console.error();
79
+ console.error(chalk.green('Creating site menu, please wait...'));
80
+ console.error();
81
+
82
+ // 发送请求到服务器
83
+ const result = await postClass(
84
+ config.setupSvc + "/api/customTab/tabSetDone",
85
+ requestBody,
86
+ config.accessToken
87
+ );
88
+
89
+ // API 返回结构中, result 字段决定调用是否成功
90
+ if (result && result.result) {
91
+ console.error();
92
+ console.error(chalk.green('Success!'));
93
+ console.error();
94
+ return result;
95
+ } else {
96
+ const msg = result && result.returnInfo ? result.returnInfo : 'Unknown error';
97
+ console.error();
98
+ console.error(chalk.red('Error:' + msg));
99
+ throw new Error('Create Site Menu Failed: ' + msg);
100
+ }
101
+ } catch (error) {
102
+ console.error();
103
+ console.error(chalk.red("站点菜单创建失败:"), error);
104
+ throw error;
105
+ }
106
+ }
107
+
108
+ module.exports = createSiteMenu;