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()
}

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

相关推荐
Mintopia38 分钟前
🚀 Next.js 全栈 Web Vitals 监测与 Lighthouse 分析
前端·javascript·全栈
ITKEY_40 分钟前
flutter日期选择国际化支持
开发语言·javascript·flutter
Mintopia40 分钟前
🤖 AIGC + CMS:内容管理系统智能化的核心技术支撑
前端·javascript·aigc
HelloGitHub43 分钟前
这款开源调研系统越来越“懂事”了
前端·开源·github
whysqwhw1 小时前
hippy的主要原理
前端
ruanCat1 小时前
配置 github workflow 工作流文件,实现仓库自动更新 github page 站点
github
子兮曰1 小时前
🚀95%的前端开发者都踩过坑:JavaScript循环全解析,从基础到高阶异步迭代
前端·javascript·性能优化
2401_853406881 小时前
Tdesign-React 组件 Card 实现头部固定,内容区单独可滚动
前端·react.js·tdesign
蓝倾9761 小时前
小红书获取用户作品列表API接口操作指南
java·服务器·前端·python·电商开放平台·开放api接口
小桥风满袖1 小时前
极简三分钟ES6 - 数值的扩展
前端·javascript