diff --git a/plugin/lib/quickcomposer/system/index.js b/plugin/lib/quickcomposer/system/index.js index 5043d03..faaa178 100644 --- a/plugin/lib/quickcomposer/system/index.js +++ b/plugin/lib/quickcomposer/system/index.js @@ -1,5 +1,7 @@ const exec = require("./exec"); +const os = require("./os"); module.exports = { exec, + os, }; diff --git a/plugin/lib/quickcomposer/system/os.js b/plugin/lib/quickcomposer/system/os.js new file mode 100644 index 0000000..83f390e --- /dev/null +++ b/plugin/lib/quickcomposer/system/os.js @@ -0,0 +1,84 @@ +const os = require("os"); + +// 获取系统架构 +function arch() { + return os.arch(); +} + +// 获取CPU信息 +function cpus({ format = "full" } = {}) { + const cpuInfo = os.cpus(); + if (format === "simple") { + return cpuInfo.map(({ model, speed }) => ({ model, speed })); + } + return cpuInfo; +} + +// 获取内存信息 +function memory({ type = "totalmem" } = {}) { + switch (type) { + case "totalmem": + return os.totalmem(); + case "freemem": + return os.freemem(); + default: + throw new Error("不支持的内存信息类型"); + } +} + +// 获取网络信息 +function network({ type = "hostname", internal = false } = {}) { + switch (type) { + case "hostname": + return os.hostname(); + case "networkInterfaces": { + const interfaces = os.networkInterfaces(); + if (!internal) { + // 过滤掉内部接口 + Object.keys(interfaces).forEach((key) => { + interfaces[key] = interfaces[key].filter((iface) => !iface.internal); + if (interfaces[key].length === 0) { + delete interfaces[key]; + } + }); + } + return interfaces; + } + default: + throw new Error("不支持的网络信息类型"); + } +} + +// 获取平台信息 +function platform({ type = "platform" } = {}) { + switch (type) { + case "platform": + return os.platform(); + case "type": + return os.type(); + case "release": + return os.release(); + case "arch": + return os.arch(); + case "endianness": + return os.endianness(); + case "tmpdir": + return os.tmpdir(); + case "homedir": + return os.homedir(); + case "uptime": + return os.uptime(); + case "userInfo": + return os.userInfo(); + default: + throw new Error("不支持的平台信息类型"); + } +} + +module.exports = { + arch, + cpus, + memory, + network, + platform, +}; diff --git a/src/components/composer/system/OsEditor.vue b/src/components/composer/system/OsEditor.vue new file mode 100644 index 0000000..6ab7b54 --- /dev/null +++ b/src/components/composer/system/OsEditor.vue @@ -0,0 +1,381 @@ + + + + + + + + {{ op.label }} + + + + + + + + + + + + {{ opt.label }} + + + + + + + + + {{ opt.label }} + + + + + + + + + {{ opt.label }} + + + + updateArgvs('internal', val)" + label="包含内部接口" + dense + class="text-caption" + /> + + + + + + + + {{ opt.label }} + + + + + + + + + + diff --git a/src/js/composer/cardComponents.js b/src/js/composer/cardComponents.js index 690bea6..ed61695 100644 --- a/src/js/composer/cardComponents.js +++ b/src/js/composer/cardComponents.js @@ -59,3 +59,7 @@ export const FileOperationEditor = defineAsyncComponent(() => export const SystemCommandEditor = defineAsyncComponent(() => import("components/composer/system/SystemCommandEditor.vue") ); + +export const OsEditor = defineAsyncComponent(() => + import("components/composer/system/OsEditor.vue") +); diff --git a/src/js/composer/commands/systemCommands.js b/src/js/composer/commands/systemCommands.js index 0be1f62..74bfa2f 100644 --- a/src/js/composer/commands/systemCommands.js +++ b/src/js/composer/commands/systemCommands.js @@ -25,9 +25,15 @@ export const systemCommands = { value: "quickcomposer.system.exec", label: "执行系统命令", desc: "执行系统命令并返回输出结果", - config: [], component: "SystemCommandEditor", icon: "terminal", }, + { + value: "quickcomposer.system.os", + label: "系统信息", + desc: "获取操作系统相关信息", + component: "OsEditor", + icon: "computer", + }, ], }; diff --git a/src/js/composer/customComponentGuide.js b/src/js/composer/customComponentGuide.js index 0faa6d1..d40bc83 100644 --- a/src/js/composer/customComponentGuide.js +++ b/src/js/composer/customComponentGuide.js @@ -91,7 +91,7 @@ const customComponentGuide = { }, }, parseCodeToArgvs: { - description: "解析代码字符串为参数对象", + description: "解析代码字符串为参数对象,严禁使用eval", parameters: "code - 要解析的代码字符串", implementation: { steps: [ diff --git a/src/js/composer/formatString.js b/src/js/composer/formatString.js index cebe465..399c2d3 100644 --- a/src/js/composer/formatString.js +++ b/src/js/composer/formatString.js @@ -219,7 +219,22 @@ export const parseFunction = (functionStr, options = {}) => { throw new Error("Not a valid function call"); } - const functionName = callExpression.callee.name; + // 处理函数名,支持成员方法调用 + let name; + if (callExpression.callee.type === "MemberExpression") { + // 递归获取完整的成员访问路径 + const getMemberPath = (node) => { + if (node.type === "Identifier") { + return node.name; + } else if (node.type === "MemberExpression") { + return `${getMemberPath(node.object)}.${node.property.name}`; + } + return ""; + }; + name = getMemberPath(callExpression.callee); + } else { + name = callExpression.callee.name; + } // 递归处理AST节点 const processNode = (node, currentPath = "") => { @@ -260,6 +275,9 @@ export const parseFunction = (functionStr, options = {}) => { ); case "ObjectProperty": return processNode(node.value, currentPath); + case "MemberExpression": + // 处理成员表达式 + return getMemberPath(node); default: console.warn("Unhandled node type:", node.type); return null; @@ -271,7 +289,7 @@ export const parseFunction = (functionStr, options = {}) => { ); return { - functionName, + name, args, }; } catch (e) {