EasyEditor AI 聊天助手:让低代码开发更简单

在使用 EasyEditor 的过程中,我们发现即使在低代码环境下,用户仍需要逐个拖拽组件、配置属性,面对复杂页面时这个过程依然繁琐。

能否进一步简化这个流程?让用户像日常对话一样,直接描述需求就能生成页面?基于这个想法,我们开发了 EasyEditor AI 聊天助手

在线查看:easy-editor-dashboard.vercel.app/

如何使用

启动 AI 助手

在 EasyEditor 编辑器界面,你会看到右下角有一个浮动的 AI 助手按钮。

点击这个按钮,AI 聊天窗口会从右侧滑入。

与 AI 对话

打开聊天窗口后,你可以直接输入你的需求,比如:

  • "帮我生成一个用户管理页面"
  • "我要做一个数据展示的仪表板"
  • "创建一个登录表单"

使用智能建议

如果不知道该说什么,可以点击"显示建议"按钮,会出现预设的建议选项:

  • 快速建议:最常用的几个功能,直接点击就能使用
  • 更多建议:按类别分组的详细建议,包括页面生成、组件配置、数据展示、表单设计等

快捷键操作

为了提升使用效率,支持以下快捷键:

  • Enter:发送消息
  • Shift + Enter:换行
  • ESC:关闭聊天窗口

核心实现:从 Prompt 到画布操作的转换

这是整个系统的核心技术难点------如何将用户的自然语言需求转换为具体的画布操作。

1. 系统提示词设计

首先需要通过详细的系统提示词来约束 AI 的行为:

操作类型定义

txt 复制代码
// 支持的操作类型
- add:添加组件到画布
- update:更新组件属性
- replace:替换现有组件
- remove:删除组件
- batch:批量执行多个操作
- move:移动组件位置
- wrap:使用容器包裹组件
- insertBefore/insertAfter:在指定位置插入组件

组件物料约束:通过预定义的组件库来限制 AI 只能使用已有的组件类型:

json 复制代码
// 文本组件配置示例
{
  "componentName": "Text",
  "props": {
    "text": "string",
    "style": { /* 自定义样式 */ }
  }
}
// 图表组件配置示例
{
  "componentName": "BarChart",
  "props": {
    "data": [...],           // 图表数据
    "xField": "category",    // X轴字段
    "yField": "value"        // Y轴字段
  }
}

2. 上下文注入机制

为了让 AI 理解当前画布状态,每次用户发送消息时会自动注入画布信息:

typescript 复制代码
const systemMessage: Message = {
  id: Date.now().toString(),
  content: `当前画布的 JSON 信息:\n${JSON.stringify(project.currentDocument?.export())}`,
  role: 'system',
  createdAt: new Date(),
}

这种机制确保了:

  • AI 能够感知画布的当前状态
  • 避免重复创建相同功能的组件
  • 基于现有组件进行智能调整
  • 保持新旧组件之间的协调性

3. JSON 配置解析与执行

AI 返回的内容包含文字描述和 JSON 配置,需要准确提取并执行:

配置提取

typescript 复制代码
// 支持多种 JSON 格式的识别
const jsonMatch = content.match(/```(?:json)?\s*(\{[\s\S]*?\})\s*```/i)
if (jsonMatch) {
  jsonContent = jsonMatch[1]  // 从代码块中提取
} else {
  const jsonObjectMatch = content.match(/\{[\s\S]*\}/)
  if (jsonObjectMatch) {
    jsonContent = jsonObjectMatch[0]  // 直接提取 JSON 对象
  }
}

操作执行

typescript 复制代码
const executeOperation = (operation: AiOperation, document: Document) => {
  const { type, payload } = operation
  switch (type) {
    case 'add': {
      // 添加组件到画布
      const rootNode = document.getRoot()
      document.insertNode(rootNode, nodeSchema, position)
      break
    }
    case 'batch': {
      // 批量执行操作
      batchPayload.forEach(op => executeOperation(op, document))
      break
    }
    // ... 其他操作类型的处理
  }
}

4. 实际应用示例

以用户输入"帮我生成一个用户管理页面"为例:

需求理解:AI 分析用户需求,识别出需要标题、表格等组件

配置生成

typescript 复制代码
{
  "type": "batch",
  "payload": [
    {
      "type": "add",
      "payload": {
        "componentName": "Text",
        "props": { "text": "用户管理" },
        "$dashboard": { "rect": { "x": 800, "y": 100, "width": 300, "height": 50 } }
      }
    },
    {
      "type": "add",
      "payload": {
        "componentName": "Table",
        "props": { "title": "用户列表" },
        "$dashboard": { "rect": { "x": 800, "y": 200, "width": 600, "height": 400 } }
      }
    }
    // 更多组件配置...
  ]
}

画布渲染:系统自动创建相应组件并按指定位置和大小进行布局

5. 用户界面优化

为了提供更好的用户体验,我们对 AI 返回的内容进行了过滤处理:

typescript 复制代码
export const filterMessageContent = (content: string): string => {
  // 移除 JSON 配置,只保留文字描述
  let filteredContent = content
  filteredContent = filteredContent.replace(/```(?:json)?\s*\{[\s\S]*?\}\s*```/gi, '')
  filteredContent = filteredContent.replace(/^\s*\{[\s\S]*?\}\s*$/gm, '')
  return filteredContent.trim()
}

这样用户看到的是友好的文字说明,而非复杂的技术配置。

相关推荐
无责任此方_修行中25 分钟前
每日一技:当 Vuepress 插件失灵时,我是如何让 AI 帮我解决问题的
前端·vuepress·trae
丘山子26 分钟前
API Gateway 工作原理介绍
前端·后端·面试
lbh39 分钟前
简单文本编辑器:基于原生JavaScript的智能文本选择工具栏
前端·javascript
Jackson__41 分钟前
高效 AI 对话:如何写出更好的 Prompt
前端
典学长编程1 小时前
前端开发(HTML,CSS,VUE,JS)从入门到精通!第三天(JavaScript)
前端·javascript·css·html·前端开发
寻月隐君1 小时前
Rust Scoped Threads 实战:更安全、更简洁的并发编程
后端·rust·github
德育处主任1 小时前
p5.js 用 beginGeometry () 和 endGeometry () 打造自定义 3D 模型
前端·前端框架·canvas
雪域迷影1 小时前
Ubuntu22.04中搭建GN编译环境
github·openharmony·gn·ninja
文火冰糖的硅基工坊1 小时前
[硬件电路-124]:模拟电路 - 信号处理电路 - 测量系统的前端电路详解
前端·嵌入式硬件·fpga开发·架构·信号处理·电路
爷_2 小时前
手把手教程:用腾讯云新平台搞定专属开发环境,永久免费薅羊毛!
前端·后端·架构