# formula-builder **Repository Path**: mobai123321/formula-builder ## Basic Information - **Project Name**: formula-builder - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-24 - **Last Updated**: 2026-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Formula Builder 一个基于 Vue 3 + Element Plus 的低代码公式编辑器组件。 通过点击或拖拽变量、函数、运算符来构建公式,支持 Token 化编辑、拖拽排序、括号匹配、公式验证、JSON 导入/导出。 **GitHub**: https://github.com/Mobaitt/formula-builder ## 安装 ```bash npm install formula-builder element-plus vue ``` ## 快速开始 ```vue ``` ### 使用扁平变量列表 ```vue ``` ### 配置操作按钮 使用 `actions` prop 统一控制底部按钮:改名、隐藏、追加自定义按钮,一个 prop 搞定。 ```vue ``` ``` ### 通过 ref 调用方法 ```vue ``` ## 暗黑模式 组件使用 Element Plus 的 CSS 变量编写,已完整适配暗黑模式。只需在项目中按 Element Plus 文档启用暗黑模式即可: ```ts import 'element-plus/theme-chalk/dark/css-vars.css' // 切换暗黑模式 document.documentElement.classList.toggle('dark') ``` 组件会自动跟随主题变化,无需额外配置。 ## Props | 属性 | 类型 | 默认 | 说明 | |------|------|------|------| | `devices` | `DeviceNode[]` | 内置示例 | 设备 → 变量树形结构 | | `variables` | `VariableItem[]` | — | 扁平变量列表(当 `devices` 未设置时生效) | | `actions` | `ActionsConfig` | — | 配置操作按钮:改名、隐藏、追加自定义按钮 | 不传 props 时使用内置的 4 组设备共 12 个变量 + 7 个函数。 ## 功能特性 - **Token 编辑器** — hidden-input + 可视光标方案,每个变量/函数/运算符为独立 Token - **变量系统** — 设备分组、树形展示、展开折叠、搜索(匹配中文/英文名) - **函数面板** — 内置 7 个函数,每个带 `?` 帮助弹窗(签名/说明/示例) - **运算符面板** — 算术/比较/逻辑/括号分组 - **键盘输入** — 数字键、小数点、运算符快捷键、Backspace/Delete - **拖拽排序** — Token 间拖拽重排,从变量面板拖入变量 - **括号匹配** — 光标在括号处时高亮匹配对 - **公式验证** — 实时检查括号匹配、相邻合法性、首尾合法性 - **输出配置** — 小数位数、前缀、后缀、千分位分隔、空值显示 - **导入/导出** — JSON 格式保存和恢复 - **右键菜单** — 删除、左移、右移 ## 内置数据 ### 设备与变量 | 设备 | 变量 | |------|------| | 钻井设备 | 井深 / 钻速 / 钻压 | | 压力监测 | 套压 / 油压 / 井口压力 | | 温度监测 | 温度 / 入口温度 / 出口温度 | | 流量监测 | 流量 / 累计流量 / 液位 | ### 内置函数 | 函数 | 签名 | 说明 | |------|------|------| | SUM | `SUM(n1, n2, ...)` | 求和 | | AVG | `AVG(n1, n2, ...)` | 平均值 | | MAX | `MAX(n1, n2, ...)` | 最大值 | | MIN | `MIN(n1, n2, ...)` | 最小值 | | ABS | `ABS(x)` | 绝对值 | | ROUND | `ROUND(value, decimals)` | 四舍五入 | | IF | `IF(condition, true_val, false_val)` | 条件判断 | ## 类型定义 ```ts interface VariableItem { id: string name: string // 英文标识,用于表达式 label: string // 中文名,用于显示 type: 'number' | 'string' | 'boolean' unit?: string } interface DeviceNode { id: string label: string children: VariableItem[] } interface FormulaFunction { name: string label: string argsCount: number | 'any' description?: string } interface OutputConfig { decimals: number prefix: string suffix: string useThousandsSeparator: boolean nullDisplay: string } type FormulaToken = VariableToken | FunctionToken | OperatorToken | NumberToken | BracketToken interface FormulaSaveData { tokens: FormulaToken[] expression: string outputConfig: OutputConfig } interface ButtonLabels { export?: string // 默认 "导出" import?: string // 默认 "导入" clear?: string // 默认 "清空" } interface HideActions { export?: boolean // 设为 true 隐藏导出按钮 import?: boolean // 设为 true 隐藏导入按钮 clear?: boolean // 设为 true 隐藏清空按钮 } interface ActionButton { label: string type?: 'default' | 'primary' | 'danger' onClick: () => void } interface ActionsConfig { /** 配置导出按钮 */ export?: { label?: string; hidden?: boolean } /** 配置导入按钮 */ import?: { label?: string; hidden?: boolean } /** 配置清空按钮 */ clear?: { label?: string; hidden?: boolean } /** 追加自定义按钮 */ append?: ActionButton[] } ``` ## 开发 ```bash npm install npm run dev # 启动 demo npm run build # 构建库 ``` ## 技术栈 - **Vue 3** — Composition API + `