EAVEntity-Attribute-Value模型我们先来了解一下。EAV 把所有业务抽象成数据结构示例如下所示Entity: Customer Attributes: name string phone string level enum Values: (001, name, 张三) (001, phone, 138****) (001, level, VIP)分别 包括定义实体表对应的属性类别名称、类型等以及每个属性的值记录。一句话说明就是每个实体都有唯一的标识符每个实体都可以有多个属性与之关联每个属性都有唯一的标识符每个属性都可以具有多个值。我们对属性值表基于数据类型进行分割每个不同的数据类型拆为一个单独的表同时通过 属性表Attribute 添加 类型决定去哪里存取数据。我们可以借鉴magento的eav模型它是EAV设计的最优参考了。Magento 2中的EAV属性类型有下面这些表eav_entity_inteav_entity_varchareav_entity_texteav_entity_decimaleav_entity_datetime属性元数据驱动 UI 控件选择我们也根据属性的类型进行定义如可以定义不同的输入控件。一句话EAV 元数据 通用UI CRUD引擎 无代码业务系统本质就是业务结构EAV建模界面构建属性→控件自动映射数据交互通用CRUD规则校验DSL配置查询过滤条件模板驱动2、在Python开发中实现无代码、纯配置的业务界面展示和常规数据操作有了上面的EAV知识的介绍我们可以来进一步探讨在Python开发中实现无代码、纯配置的业务界面展示和常规数据操作过程了。我们先来看一个界面下效果。对于这样一个常规的列表展示界面包括有条件查询、分页列表记录展示属性类型包括文本、整数、浮点小数、日期、备注长文本等类型录入以及对应不同的数据类型有下拉列表固定的、动态字典的、复选框、评分、弹出选择、映射关联属性等多种方式的录入处理也是比较常见的情况。而对于条件可以展开多个条件展开效果如下所示。而对于数据的录入有弹出界面处理方式也有对应直接编辑列表的方式直接编辑输入比较快捷如果能够丰富录入的控件处理那么也是非常好的一种数据编辑方式。因此我们直接在列表中进行数据的编辑处理提供不同类型、不同方式的输入处理如下面是动态字典通过下拉列表或者单选框的方式进行录入。而对于一些系统用户、角色、机构我们应该也可以弹出来选择记录并更新关联的字段信息列表界面一般为了方便会提供相关的右键菜单提供常规的操作处理。而有些业务表是主从表的方式进行展示如对应报价单、订单等常规的数据通过主从表的方式会更加合适。主表可以直接录入外明细表也通过直接录入的方式通过选择产品可以快速的实现数据记录的选择以及对相关字段属性值的复制非常方便。3、配置业务界面处理如果要实现上面业务界面的展示处理那么我们需要如何配置业务界面元素呢。通过上面的EAV介绍那么我们至少围绕上面几个信息来定义和存储数据内容在更高的层次上定义好相关的信息1实体类是否分页、是否有主从表关系。2属性定义需要包括是否可以查询作为条件、是否可用显示与否、属性类型决定存储位置、控件输入方式日期、数值、文本而其中文本最为灵活可能是通过配置字典动态或者固定列表选择系统表方式获取选择动态业务表对象通过编码规则生成编码等方式数值可能是常规数值输入、评分输入、或者复选框等方式。另外还有是否必填、是否只读排序顺序等关键定义3属性值的存储根据不同的数据类型存储在不同的表中提高处理效率的同时不会降低精度。4属性信息的提取这个非常关键如果把这些数据每次组合起来那么常规的做法就是关联多个表来实现数据的联合但是效率会非常低下。好的做法可以利用NoSQL的动态文档的特点对数据的组合通过MogoDB的方式实现快速检索处理存储的时候一份完整的记录存储在MongoDB另外一份数据写入具体的属性值表中必要时可以随时实现同步即可。有了上面的几点介绍我们来看看具体在Python中如何管理这些内容。如上面顶部为实体或实体类型的定义信息主要包括名称、模型类名、是否分页几个属性。下面是对应实体类型的属性列表其中属性名称、模型类型名、存储类型为核心信息其他必填、排序、字典类型、只读、隐藏、可查询 等等属性定义为一些构建界面必须的相关属性。这两个表可以通过直接编辑模式进行快速录入从而方便动态定义实体类型和相关的属性列表。另外通过定义从表可以从系统的动态定义实体类型中选择业务表作为从表信息如下对于订单或者报价单的业务通过主从表的方式显示的定义界面如下所示。而对于一些属性字段的输入类型我们提供一些内置的选项供选择。如前面介绍的选择用户方式就从基础用户表中选择记录更新关联的字段信息。而如果选择类似系统业务编码的那么也提供一个编码生成的方式结合业务编码模块规则生成编码如订单中的订单编码记录新增的时候提供一个按钮可以结合订单编码规则生成编码。而对于常规的字典我们可以通过配置字典类型就可以实现字段和系统字典项目的关联了。