• 产品/测试/运营/实施/顾问 80%

  • 开发配置/二开 20%

  • 功能不打折

  • 易用

  • 好用

  • 易扩展

  • 低代码平台:前端趋近从 0 开始

  • 现有组件直接复用的几率不大

参考 nocobase

数据驱动

协议驱动

表单表格驱动

实现原理

https://zhuanlan.zhihu.com/p/451340998

https://zhuanlan.zhihu.com/p/452251297

https://www.zhihu.com/column/reversible-computation

这类方案很容易面临不断膨胀的私有 JSON 协议。并且,私有协议扩展性和灵活性差,难以达到图灵完备状

可视化编辑 > 可视化编程

  • 「声明式」html css 直接描述最终效果,不关心如何实现。可以直接从展现结果,所见即所得
  • 「命令式」canvas 关注如何实现,明确怎么一步步达到这个效果。无法做到反向推

生成代码的方式

  • 强依赖研发,无法做到给非研发使用,因为后续代码需要编译上线。
  • 无法持续可视化编辑,因为代码无法可视化编辑,生成代码后只要有修改就没法再反向还原成低代码的形式,后续只能代码编辑。
  • 难以实现完全用低代码开发应用,因为不能生成太复杂的代码,使得这种方案一般不包括交互行为,通常是只有前端界面支持可视化编辑。
  • 无法做到向下兼容,因为生成的那一瞬间代码依赖的框架版本就固定了,目前还没见过哪款前后前端框架做过到完全向下兼容

JSON 描述页面

  1. 低代码平台编辑器几乎都是基于 Web 实现,JavaScript 可以方便操作 JSON。
  2. JSON 可以支持双向编辑,它的读取和写入是一一对应
  • 不支持注释
  • 不支持多行字符串
  • 语法过于严格,比如不支持单引号,不能在最后多写一个

nocobase

bad

  • 开源协议 agpl
  • install build 时间太长
  • 插件上传后报错,启用后报错
  • 画布交互
    • 没有 panel,弹框交互

good

  • 数据库 er 图,类百度
  • 工作流
  • 技术栈
    • react antd formily dnd-kit

插件

  • 路由
    • 新增页面
      • add route
    • 替换页面
      • replace route
      • replace component
    • 插件页面
      • 路由层面
  • Provider
    • 提供全局共享的上下文
    • 提供全局内容展示
    • 拦截作用,根据条件渲
  • Component Scope
    • 全局,局部
    • Component: 组件
    • Scope props
  • 页面
    • 后台建库,建表
    • 前台
      • 页面
      • 数据交互(后台)
  • SchemaInitializer
    • 区块
      • 简单区块
      • 数据区块
    • Action
    • 区块内嵌的 Initializer
  • SchemaSettings

接口提供梳理:

  1. 以什么维度标识数据源

接口要求:

  1. id parentId
  2. json 数据的可读性
  3. upsert 统一结构

对于数据源:

  • 异步校验类
  • delete
    • 入参:主键/唯一
    • 单个/批量
    • 关联关系
  • query
    • 入参
      • 分页
      • 过滤
      • 排序
    • 出参
  • upsert
    • insert
    • update

UI Schema (DSL)

功能拆解

画布

primary

  • 布局
  • 拖拽
  • handle
  • nest
  • 属性面板
  • 组件联动
  • 区块联动
    secondary
  • 层级
  • 网格线
  • 调整大小
  • 吸附
  • 移动端
  • 撤销/重做
  • 复制/粘贴
  • 多组件的组合拆分
  • 快捷键

表单

多语言

自定义组件

扩展

权限

nest

  • sub grid 1 中的 item 拖到 sub grid 2 中
  • sub grid 1 拖到 sub grid 2 中
  • outside 拖到 sub grid 中
  • 删除 sub grid
  • 拖拽 sub grid
  • 大小调整 sub grid
    • item 调整,sub grid 跟随调整

formily

表单拆分>提交

布局

  • FormLayout: 包裹所有 FormItem 组件 控制所有 FormItem 的默认样式

  • FormItem:包裹具体组件 Input, Select 等

  • Space:行内元素并排紧挨布局

  • FormGrid:

  • 列数:一行 2 个,一行 3 个,一行 1 个。。。

  • 宽度:1:1/1:2/1:2:1

  • grid 某个 col 独占一行 ✅ https://github.com/alibaba/formily/discussions/3858

<FormLayout>
  <FormGrid>
    <FormItem>
      <Input />
    </FormItem>
    <FormItem>
      <Space>
     <FormItem>
          <Input />
        </FormItem>
     <FormItem>
          <Input />
        </FormItem>
      </Space>
    </FormItem>
  </FormGrid>
</FormLayout>


<FormProvider form={form}>
  <SchemaField schema={schema} />
</FormProvider>

校验

  • 校验时机:triggerType
  • 规则校验 registerValidateRules
  • 格式校验 registerValidateFormats
  • 异步校验
    • 能获取其它字段值 field.query(‘linkage’).get(‘value’) form.values
    • 请求数据,调用其它方法?
  • 联动校验:x-reactions selfErrors
  • 提示信息 ‘x-validator’: [
    { required: true, message: ’ 必填 ’ },
    { maxLength: 3, message: ’ 最大长度 3’ },
    ],
  • 动态校验规则

交互

主动

  • target
  • 一对多
    被动
  • dependencies
  • 多对一

动态 schema

动态显示/隐藏/禁用某些字段

自定义组件

参考 formily/antd

Table

formily 表单,数据录入

table card 数据展示(bi)

共同不足

  • 难以调试
  • 过于复杂的逻辑难以配置/实现使用成本高
    • er, 数据库关系图,少的时候可看,多了不可看

其它产品

阿里

出码

网易

ESTree 基于 ast

sandpack

amisformily
页面解决方案表单解决方案

二开/自定义页面/组件

注入 css/js

  • css
    • class
      • 填写类型,外部注入
    • style
      • 属性填写